case表达式必须是常量表达式游戏开发

时间:2014-05-21 19:22:27

标签: java syntax-error

我有一个建立游戏的任务... 我希望用户在程序中输入他想要玩的键。 问题是Java要求switch case中的值为const ... 我的想法是为KeyListener创建一个类型继承,然后我将它添加到他的合适的播放器。

接收所需的密钥作为参数int[] keys

我已经看到有些人通过添加"静态最终"来提供类似问题的解决方案。不幸的是它没有帮助

这是我的代码:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class PlayerKeyListener implements KeyListener
{

int[] keys;
int playerID;

PlayerKeyListener(int[] keys, int playerID)
{
    this.keys = keys;
    this.playerID = playerID;
}

public void keyPressed(KeyEvent e) 
{ 
    System.out.println("keyPressed code : "+ e.getKeyCode());
    switch (e.getKeyCode()) 
    {
    case keys[KeyboardSettings.UP]:     gameBord.players[playerID].moveUp(); break;
    case keys[KeyboardSettings.DOWN]:   gameBord.players[playerID].moveDown(); break;   
    case keys[KeyboardSettings.LEFT]:   gameBord.players[playerID].moveLeft(); break;
    case keys[KeyboardSettings.RIGHT]:  gameBord.players[playerID].moveRight(); break;
    case keys[KeyboardSettings.BOMB]:   gameBord.players[playerID].addBomb(); break;

    default: gameBord.players[playerID].face = 0;
    }
    e.consume();

}

public void keyReleased(KeyEvent e) 
{
    System.out.println("keyReleased code : "+ e.getKeyCode());
    gameBord.players[playerID].move = false;
    gameBord.players[playerID].pic = 0;
    e.consume();
}

public void keyTyped(KeyEvent e) 
{
    System.out.println("keyTyped code : "+ e.getKeyCode());
    e.consume();
}

}

tnx;)

1 个答案:

答案 0 :(得分:1)

  

案例表达式必须是常量表达式。

你在标题中回答了自己。您无法在case关键字之后拥有变量。

switch命令的工作方式是必须在编译时知道所有情况(case关键字之后的值)。

switch (e.getKeyCode()) {
    case constant1: commands;
    case constant2: commands;
}

keys[KeyboardSettings.UP]不是常数,而是变量。它的值在运行时已知。编译器不知道那里有什么价值并且正在大喊你:"嘿,user3142930,我需要知道case关键字后面所有内容的价值!"

在您的情况下,您只是无法使用switch。您应该使用一系列if-else命令,如下所示:

// store it in a variable so you do not call the method repeatedly
final int code = e.getKeyCode(); 
// this is instead of your switch
if (code == keys[KeyboardSettings.UP]) {
    ....
} 
else if (code == keys[KeyboardSettings.DOWN]) {
    ...
} 
else if (...) {
   ...
}

它的深层原因是您希望用户可以配置密钥,因此您无法在编译时知道它们的值。

如果你不理解我的最后一句,你可以学习Runtime vs Compile time