创建一个Tic Tac Toe应用程序时,我遇到了这个错误,它每次都在同一方块上声明一次抽奖

问题描述

所以我有一个错误,无论何时单击左上角的正方形,无论是在游戏开始时,中间还是在任何时候,我总是会收到游戏的抽奖消息,并且可以继续玩游戏。

Picture of "Draw Bug"

除此之外,该游戏运行正常。我尝试创建不同的逻辑,但似乎并不能控制该错误。有人可以告诉我我错了吗?我会附上我的代码

import androidx.appcompat.app.AppCompatActivity;
import android.media.Image;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Arrays;

public class MainActivity extends AppCompatActivity {

int activePlayer = 0; //0 = Yellow; 1 = Red
boolean gameIsActive = true;

int[] gameState = {2,2,2}; // 2 = unplayed.
int[][] winningPositions = {‌{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,7},{2,5,6}};

public void dropIn(View view) {

    ImageView counter = (ImageView) view;

    int tappedCounter = Integer.parseInt(counter.getTag().toString());

    if (gameState[tappedCounter] == 2 && gameIsActive) {

        gameState[tappedCounter] = activePlayer;
        counter.setTranslationY(-1500f);
        if (activePlayer == 0) {
            counter.setimageResource(R.drawable.yellow);
            activePlayer = 1;
        } else {
            counter.setimageResource(R.drawable.red);
            activePlayer = 0;
        }

        counter.animate().translationYBy(1500f).rotation(360).setDuration(600);

        for (int[] winningPosition : winningPositions){
            System.out.println(Arrays.toString(gameState));
            if (gameState[winningPosition[0]] == gameState[winningPosition[1]] &&
                    gameState[winningPosition[1]] == gameState[winningPosition[2]] &&
                    gameState[winningPosition[0]] != 2){

                //Someone has won

                gameIsActive = false;
                String winner = "Red";

                if (gameState[winningPosition[0]] == 0){
                    winner = "Yellow";
                }

                TextView winnerMessage = (TextView) findViewById(R.id.winnerMessage);
                winnerMessage.setText(winner + " has won!");
                final LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout);
                layout.setVisibility(View.VISIBLE);
            }

            // there is a draw

            else {

                boolean gameIsOver = true;

                for (int counterState : gameState) {

                    if (counterState == 2)
                        gameIsOver = false;

                    if(gameIsOver){
                        TextView winnerMessage = (TextView) findViewById(R.id.winnerMessage);
                        winnerMessage.setText("It's a draw. ");
                        final LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout);
                        layout.setVisibility(View.VISIBLE);
                    }
                }
            }
        }
    }
}

public void playAgain(View view){

    gameIsActive = true;

    LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout);
    layout.setVisibility(View.INVISIBLE);

    activePlayer = 0; //0 = Yellow; 1 = Red

    for (int i = 0; i < gameState.length; i++){
        gameState[i] = 2;
    }

    androidx.gridlayout.widget.GridLayout gridLayout = findViewById(R.id.gridLayout);

    for (int i = 0; i < gridLayout.getChildCount(); i++){
        ((ImageView) gridLayout.getChildAt(i)).setimageResource(0);
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}
}

解决方法

您的问题在这里,如果有2个元素(您未玩的位置),则需要循环 并在循环中设置布尔值。之后,跳出循环并检查是否应该平局。您的问题是您将其包含在循环中。解决方法如下:

boolean gameIsOver = true;

// check if the board contains any unplayed positions
for (int counterState : gameState) {
  if (counterState == 2) {
      gameIsOver = false;
  }
}

// and then check if it's a draw
if (gameIsOver) {
  TextView winnerMessage = (TextView) findViewById(R.id.winnerMessage);
  winnerMessage.setText("It's a draw. ");
  final LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout);
  layout.setVisibility(View.VISIBLE);
}