【问题标题】:"if" and "else" with arraylist带有arraylist的“if”和“else”
【发布时间】:2018-08-22 06:42:44
【问题描述】:

我正在 Android Studio 上开发游戏。

游戏有 12 个方块和 12 个符号(在本例中为“0”零)。 当您按下新游戏按钮时,将启动第一关。总共有12个级别。 (当前水平)。 几秒钟后,屏幕上会随机显示一个符号,然后消失。 (根据每个级别输入的数量增加1,例如,级别1:必须猜测1个符号,级别2:必须猜测2个符号)直到第12级。

到目前为止,它可以正常工作。

现在我需要解决我的代码以接收用户的输入,检查是否与显示的正确块预览匹配。 如果是则进入下一个级别(重复清除块的循环,显示随机符号,再次清除,等待用户输入)直到第 12 级。 如果不显示失败消息并再次显示新游戏按钮。

我创建了这个 Arraylist 但它不能正常工作,现在它的条件总是负面的(即使右块被按下)“失败!再试一次!”它正在显示的消息。

我运行调试器并显示: List tempList = new ArrayList ();

tempList:size 12
for (int i = 0; i < curLevel; i++) { curLevel size:13
tempList.add ( buttons.get ( i ) ); buttons size:12
if (tempList.contains ( v.getTag () )) { tempList size 12
Its not matching the condition. –

这里是值:

static int MAXLEVELS = 12;
        static String SUCCESS_SYMBOL = "0";
curLevel = 1;
        curGuess = 0;

有什么建议让它发挥作用吗?甚至让这段代码更整洁?

private void buttonLogic(View v) {
        List<Button> tempList = new ArrayList<> ();
        for (int i = 0; i <= curLevel; i++) {
            if (i!= MAXLEVELS)
                tempList.add ( buttons.get ( i ) );
            else
                break;
        }
        if (tempList.contains ( v.getTag () )) {
            curGuess++;
            checkWin ();
        } else {
            lostGame ();
        }
    }

    private void lostGame () {
        Toast.makeText(this, "Fail! Try Again", Toast.LENGTH_SHORT).show();
        disableButtons();
        b_new.setVisibility(View.VISIBLE);
    }

        private void checkWin() {
            if (curGuess == curLevel) {
                disableButtons ();
                if (curLevel == 12) {
                    Toast.makeText ( this, "Congratulations! You Won", Toast.LENGTH_SHORT ).show ();
                    b_new.setVisibility ( View.VISIBLE );
                } else {
                    curGuess = 0;
                    curLevel++;
                    generateButtons ( curLevel );
                }
            }
        }

还有一个来自之前代码的图像。干杯。

【问题讨论】:

  • 调试您的代码,在您尝试验证内容时检查 tempList 包含的内容,并在您在列表中输入该值时检查 v.getTag() 究竟包含什么
  • 很难说,尤其是因为我们不知道v.getTag() 将返回什么或tempList 将实际包含什么。如果这是您的实际代码,那么如果数据设置正确(我们不知道),tempList.contains ( v.getTag () ) 应该可以工作。最好使用调试器单步执行您的代码,尤其是检查 tempList 的内容以及您从 v.getTag() 获得的内容 - 然后检查两个对象的 equals() 方法在做什么。
  • 我运行调试器并显示: List
  • if (tempList.contains ( v.getTag () )) 将其更改为 if (tempList.contains ( v))
  • 请不要通过 cmets 提供更多信息。始终编​​辑和更新您的问题!

标签: java android arrays if-statement arraylist


【解决方案1】:

请改用ArrayList&lt;Button&gt; tempList = new ArrayList&lt;&gt;();,否则您将缺少方法(尽管将变量从ArrayList 转换为List 不会引起任何投诉)。

if 条件可能是(i+1) &lt; MAXLEVELS,因为i 是基于0curLevel 是基于1

最简单的可能是初始化 curLevel = 0 并且仅 显示它为 curLevel + 1... 否则您将始终需要考虑 +1 / -1 在业务逻辑,我认为这是“无用的复杂性”......所以游戏将从级别 0 开始,而级别 1 正在显示在 GUI 上。

【讨论】:

  • 我的印象是,通常在创建集合对象时,您希望使用相应集合接口类型的变量来引用该对象。在这种情况下,使用 List
【解决方案2】:

看起来您正试图在可用的buttons 中为已执行单击事件的按钮查找任何匹配项。

为此,我建议您使用viewId 查找完全匹配,您可以更改您的方法,如下所示。

private void buttonLogic(View v) {
    boolean hasAnyMatch = false;
    // Assumption is curLevel will always be less than MAXLEVELS
    for (int i = 0; i <= curLevel; i++) {
        if (v.getId() == buttons.get(i).getId()) {
            hasAnyMatch = true;
            break;
        }
    }
    if (hasAnyMatch) {
        curGuess++;
        checkWin ();
    } else {
        lostGame ();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2019-12-12
    相关资源
    最近更新 更多