当前位置: 首页 > 知识库问答 >
问题:

JavaSwitch语句混淆

申高卓
2023-03-14

在我的应用程序(这是一个Android游戏)中,我有一个方法可以检查玩家是否还活着,如果没有,运行一个动画,游戏就结束了。

根据玩家的输球方式,目前有3种不同的动画可用。

例如,它们可能从屏幕上掉下来,撞到一只鸟,或者被从天上掉下来的东西压扁。每一个都有不同的动画。

基本上,我正在做的是:

当玩家输球时,我设置了它发生的方法,例如,如果他们被鸟击中:

hero.setKilledBy(hero.HITBIRD);

然后我通过在我的check Gameover()方法中切换来执行此操作。但是,我很困惑。我必须这样检查它:(注意,在我的情况下,我必须输入0、1、2):

switch(hero.killedBy()){

    case 0: {                            
        fallOffScreenAnimation();break;
    }

    case 1: {
        hitBirdAnimation();break;
    }
    case 2: {
        squashedAnimation();
    }
}

在我的英雄对象类中,我有以下方法

int killedBy;
final int FELLOFFSCREEN = 0;
final int HITBIRD = 1;
final int SQUASHED = 2;

int killedBy(){

    return killedBy;

}

int setKilledBy(int value){

    killedBy = value;

}

所以,我的问题是,为什么我不能做这样的事情:

switch(hero.killedBy()){

    case hero.HITBIRD {
        fallOffScreenAnimation();break;
    }

 //............... and so on.......

在Switch语句中,我的英雄对象无法识别?为什么会这样?如果我只是键入它,(case英雄。HITBIRD),我会得到这个错误:

大小写表达式必须是常量表达式

显然,为了可读性,我更喜欢使用我设置的变量名,而不是原始的数值。。。。。。

共有2个答案

梁祯
2023-03-14

使您的int常量为静态:

final static int FELLOFFSCREEN = 0;
final static int HITBIRD = 1;
final static int SQUASHED = 2;

作为类常量,在创建Hero实例之前可用和已知的值。

但是,由于这些原因,我将使这些枚举,或者打开它,或者在枚举上有方法,当英雄因为它而死亡时采取什么行动,从而完全避免切换。

宰父正真
2023-03-14

您只能在案例中使用常量。您的变量是实例变量,而不是常量。每个英雄都有这些变量的副本。它们应该声明为:

static final int FELLOFFSCREEN = 0;
static final int HITBIRD = 1;
static final int SQUASHED = 2;

您应该使用类名而不是对象来访问它们:

case Hero.HITBIRD {

(假设类名为Hero)。

请注意,您可能应该用枚举替换这些常量:

public enum HeroDeathCause {
    FELL_OFF_SCREEN, HIT_BIRD, SQUASHED
}

这是更安全的类型,更自我描述。

 类似资料:
  • 问题内容: 我知道我们不能像其他几种语言中那样在Java的if语句中使用赋值运算符。 那是 将给出编译错误。 但是以下代码可以正常工作,如何? 编辑:这是不能在if语句中使用赋值的例外规则。 问题答案: 因为赋值的“结果”是赋值的值,所以在第二种情况下它仍然是表达式。表达式要求条件是表达式,第二个但不是第一个满足。实际上,您的两个片段是: 和 通过该扩展是否可以编译第二个版本而不是第一个版本? 这

  •  语句和语句块是 TJS2 语法中非常重要的元素。 语句  一个语句以 ; (分号) 结束。可以是表达式后直接加分号,也可以是 if 等控制语句后加分号。 例: a++; func1(); returna+b; 等等…… 语句块  语句块由多个语句组成,用{ }括起来表示。语句块中的语句按由上至下的顺序执行。 例: { a++; b++; } { vart=func1(); func2(t); b

  • 我有一个包含两列的表:channels TEXT rowid INTEGER主键 我在通道上包含了一个索引创建唯一的索引通道\u在mytable上的索引(较低的通道)) 因此VisitToronto将与VisitToronto发生冲突 错误:重复键值违反了唯一约束channels_index详细信息:键(较低(单词))=(你好世界)已经存在。 我想不出阻止这种冲突的语法。冲突通道上的冲突不起作用约

  • 本页包含内容: 循环语句 分支语句 带标签的语句 控制传递语句 在 Swift 中,有两种类型的语句:简单语句和控制流语句。简单语句是最常见的,用于构造表达式和声明。控制流语句则用于控制程序执行的流程,Swift 中有三种类型的控制流语句:循环语句、分支语句和控制传递语句。 循环语句用于重复执行代码块;分支语句用于执行满足特定条件的代码块;控制传递语句则用于修改代码的执行顺序。在稍后的叙述中,将会

  • 语句 条件控制语句 其中expression可以使用整型,字符串,甚至表达式 if (expression0) {statement0} else if (expression1) {statement1} else {statement2} // JavaScript 中的 case 可以使用整型,字符串,甚至表达式 switch(persion.type) { case "teacher

  • 着色器语言GLSL中关于if语句、for语句的使用,和javascript语言、C语言中的if语句、for语句执行逻辑规则基本一致,这里默认你已经有一定的编程基础,也就不做过多讲解,只是简单说明一下。 单独使用if if(x>100){ gl_FragColor = vec4(1.0,0.0,0.0,1.0);//红色 } if-else形式 bool colorBool; // 根据布尔值