【问题标题】:How to execute a block of code when a key is pressed?按下键时如何执行代码块?
【发布时间】:2018-11-11 17:34:52
【问题描述】:

所以基本上我试图找到一种方法来执行一个代码块,当我按下一个键而不是必须扫描一个字符串然后按回车来调用它。这是我第一次在这里提问,在代码方面我也不是很进步。只是尝试学习可以提高我的编码知识的新事物。这是我当前的代码:

主要方法(我试图改变我在变量“key”中扫描的部分):

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++;
        }
    }
}

【问题讨论】:

标签: java class input keyboard invoke


【解决方案1】:

编辑:这假设您正在使用 javafx 制作 GUI。我不确定它是否在命令行中有效,但可能不是:/

编辑 2:一件小事,但如果您在每种情况下都更新布局,您可以改为只更新 if/else 范围之外的布局。分解代码并避免复制粘贴编码是一种很好的做法

使用 EventHandlers 和 KeyEvents 有一个非常简单的方法!

这是一个使用 switch 语句的实现。如果更适合你,你可以用 if/else 块替换 switch,但如果你不知道 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;
            }
        }
    }
}

祝你好运!玩得开心编码! p.s.可以把“// TODO Auto-generated method stub”注释去掉——那只是编辑软件的注解,方法需要填写!

【讨论】:

  • 在顶部添加导入语句时,它给我一个错误,例如“'KeyEvent' 类型不是 API。”这与我用来运行此代码的程序有关吗?还有任何可能的解决方法吗?谢谢!
  • 老实说,我不确定。检查我的回复的编辑。这个项目是如何实施的?它只是打印到命令行吗?我只写了一年代码,但第一学期的重点是基于 GUI 的 Java 项目。抱歉,我无法提供更多帮助!
  • 无论哪种方式,仍然查看 switch 语句来处理关键事件。从短期来看,它并没有太大的关系,但它会清理代码并帮助运行时。在具有更多输入的大型项目中,它们可以明显改善运行时间
  • 如果您使用的是命令行,请查看这篇文章:stackoverflow.com/questions/4608854/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多