【问题标题】:Flag inside OnClickListener defaults to 0 even though initialized to 1?即使初始化为 1,OnClickListener 中的标志也默认为 0?
【发布时间】:2016-05-27 02:47:15
【问题描述】:

我正在尝试制作一个双人井字游戏应用程序,它需要在同一个按钮 (b[][]) 上发生两件不同的事情,或者将文本 "" 转换为 "O",或者"X",取决于轮到谁了。

在这里,我有一个默认为 1 的标志,这应该表明它是玩家 1 (O) 的回合。运行程序,无论如何总是轮到玩家 2(X)。

我对@9​​87654325@ 的工作原理有点困惑。我可以看到,也许条件 flag == 1 被立即调用,立即将标志设置为 0?对我来说,它没有首先将按钮文本设置为"O" 的过程仍然没有意义。怎么了?我该如何解决这个问题?

class MyClickListener implements View.OnClickListener {
            int x;
            int y;


            public MyClickListener(int x, int y) {
                this.x = x;
                this.y = y;
            }


            public void onClick(View view) {

                int flag = 1;

                if (b[x][y].isEnabled()) {
                    b[x][y].setEnabled(false);
                }
                    if(flag == 1) {
                        b[x][y].setText("O");
                        c[x][y] = 0;
                        textView.setText("player 1's turn");
                        checkBoard();
                        flag = 0;

                    }
                    if(flag == 0){
                        b[x][y].setText("X");
                        c[x][y] = 1;
                        textView.setText("player 2's turn");
                        checkBoard();
                        flag = 1;
                }
            }
        }

【问题讨论】:

  • 您在开始时将标志初始化为 1。
  • @Untitled123 是的,我知道,但程序的行为就像我已将其初始化为 0。它只是通过第二个条件,其中标志为 0。
  • 你需要一个 else if 标志==0,因为它在第一个 if 中设置为 0,然后进入第二个 if。
  • @Untitled123 实际上,我现在看到这只是一个小疏忽,并不是真正的问题。考虑到我在条件句末尾尝试做的事情,我曾期望标志会切换。这就是让我感到困惑的部分。对不起。我会稍微修改一下问题。
  • 我猜这个函数内部的初始化标志不是你想要的。考虑将该标志 init 放入构造函数中。

标签: java android button listener onclicklistener


【解决方案1】:

替换

if(flag == 0)

else if(flag == 0)

这将使它在将标志设置为 0 后跳过第二个 if 语句。

class MyClickListener implements View.OnClickListener {
        int x;
        int y;
        int flag;

        public MyClickListener(int x, int y) {
            this.x = x;
            this.y = y;
            flag = 1;
        }


        public void onClick(View view) {



            if (b[x][y].isEnabled()) {
                b[x][y].setEnabled(false);

                if(flag == 1) {
                    b[x][y].setText("O");
                    c[x][y] = 0;
                    textView.setText("player 1's turn");
                    checkBoard();
                    flag = 0;

                }
                else if(flag == 0){
                    b[x][y].setText("X");
                    c[x][y] = 1;
                    textView.setText("player 2's turn");
                    checkBoard();
                    flag = 1;
               }
            }
        }
    }

【讨论】:

  • 是的,那东西是以 p1 开头的,谢谢。但是,它仍然无法按预期工作,但标志仍然不会以哪种方式切换……我想这是另一回事。有什么想法吗?
  • 人们已经提到的是要走的路。您想在该方法之外初始化该标志,可能在构造函数中。所以在你的变量 x 和 y 下,有 int 标志,然后在构造函数 flag = 1 内进行初始化。在 onClick 方法中删除 int 标志 = 1。这应该有助于解决一些问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2010-11-07
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2013-02-12
相关资源
最近更新 更多