Как выполнить блок кода при нажатии клавиши? - PullRequest
0 голосов
/ 01 июня 2018

Так что в основном я пытаюсь найти способ выполнить блок кода, когда я нажимаю клавишу вместо того, чтобы сканировать строку, а затем нажимать клавишу Enter, чтобы вызвать ее.Это мой первый раз, когда я задаю вопрос здесь, также я не очень прогрессивен, когда дело доходит до кода.Просто пытаюсь узнать что-то новое, что продвинет мои знания в области программирования.Вот мой текущий код:

Основной метод (я пытаюсь изменить часть, где я сканирую в переменной «ключ»):

import java.util.Scanner;

public class testGame {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    dungeon numberOne = new dungeon();

    String key;
    numberOne.setPlayer();
    numberOne.printLayout();

    Scanner input = new Scanner(System.in);
    for(int x = 0; x < Integer.MAX_VALUE; x++)
    {
        key = input.next();
        if(key.equals("w"))
        {
            numberOne.moveUp();
            numberOne.printLayout();

        }
        else if(key.equals("d"))
        {
            numberOne.moveRight();
            numberOne.printLayout();

        }
        else if(key.equals("s"))
        {
            numberOne.moveDown();
            numberOne.printLayout();

        }
        else if(key.equals("a"))
        {
            numberOne.moveLeft();
            numberOne.printLayout();

        }
        else
        {
            numberOne.printLayout();
        }
    }
}
}

Класс помощника:

public class dungeon {
    private monster[] randMonster = new monster [10];
    private String printDungeon ="";
    private int x = 17;
    private int y = 34;
    private String pastLayout = "H";
    private String currentPostion = "O";
    private String[][] layout = //I deleted this as it was long. It was an 
 ASCII art layout..


public void printLayout()
    {
        for(int x = 0; x < layout.length; x ++)
        {
            for(int y = 0; y < layout[0].length; y++)
            {
                printDungeon = printDungeon + layout[x][y];
            }
            System.out.println(printDungeon);
            printDungeon = "";
        }
    }
    public void setPlayer()
    {
        layout[x][y] = "O";
    }
    public void moveUp()
    {
        if(layout[x-1][y].equals("#"))
        {}
        else
        {
        layout[x][y]=pastLayout;
        pastLayout = layout[x-1][y];
        layout[x-1][y] = currentPostion;
        x--;
        }
    }
    public void moveDown()
    {
        if(layout[x+1][y].equals("#"))
        {}
        else
        {
        layout[x][y]=pastLayout;
        pastLayout = layout[x+1][y];
        layout[x+1][y] = currentPostion;
        x++;
        }
    }
    public void moveLeft()
    {
        if(layout[x][y-1].equals("#"))
        {}
        else
        {
        layout[x][y]=pastLayout;
        pastLayout = layout[x][y-1];
        layout[x][y-1] = currentPostion;
        y--;
        }
    }
    public void moveRight()
    {
        if(layout[x][y+1].equals("#"))
        {}
        else
        {
        layout[x][y]=pastLayout;
        pastLayout = layout[x][y+1];
        layout[x][y+1] = currentPostion;
        y++;
        }
    }
}

1 Ответ

0 голосов
/ 01 июня 2018

РЕДАКТИРОВАТЬ: Предполагается, что вы делаете графический интерфейс с использованием javafx.Я не уверен, работает ли он в командной строке, но, вероятно, нет: /

РЕДАКТИРОВАТЬ 2: незначительная вещь, но если вы обновляете макет после каждого случая, вы можете вместо этого просто обновить макет внеобласть действия if / else.Хорошей практикой является выделение кода и избежание кодирования с копированием-вставкой

Существует очень простой способ сделать это, используя EventHandlers и KeyEvents!

Это реализация, использующая оператор switch.Вы можете заменить переключатель на блок if / else, если он вам больше подходит, но если вы не знаете операторов switch и действительно хотите усовершенствовать свои знания в области кодирования, обязательно изучите их!

import javafx.event.EventHandler;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
public class SomeClass {
    public SomeClass() {
        //constructor elided
    }
    //Within your class containing your methods, have this private class.
    private class KeyHandler implements EventHandler<KeyEvent> {
        @Override
        public void handle(KeyEvent e) {
            KeyCode keyPressed = e.getCode();

            switch (keyPressed) {

            case W:
                //do W thing
                break;
            case A:
                //do A thing
                break;
            case S:
                //do S thing
                break;
            case D:
                //do D thing
                break;
            default:
                break;
            }
        }
    }
}

Bestудачи!Веселого программирования!ps Вы можете удалить комментарий "// TODO Auto-Генерируемый метод-заглушка" - это просто примечание от программного обеспечения для редактирования, что метод должен быть заполнен!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...