toe游戏背后的“检查赢家”算法有困难

bvk5enib  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(202)

这是我正在为udemy学习的androidjava中tic-tac-toe游戏的代码。我能够理解如何通过设置android:tag value 每一个图像值。它存储在tappedcounter中。我无法解释为什么游戏状态是2,2,2,2,2,。。。以及赢得比赛的算法。

int activePlayer = 0;

boolean gameIsActive = true;

// 2 means unplayed

int[] gameState = {2, 2, 2, 2, 2, 2, 2, 2, 2};

int[][] winningPositions = {{0,1,2}, {3,4,5}, {6,7,8}, {0,3,6}, {1,4,7}, {2,5,8}, {0,4,8}, {2,4,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(-1000f);

        if (activePlayer == 0) {

            counter.setImageResource(R.drawable.yellow);

            activePlayer = 1;

        } else {

            counter.setImageResource(R.drawable.red);

            activePlayer = 0;

        }

        counter.animate().translationYBy(1000f).rotation(360).setDuration(300);

        for (int[] winningPosition : winningPositions) {

            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!");

                LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout);

                layout.setVisibility(View.VISIBLE);

            } 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");

                    LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout);

                    layout.setVisibility(View.VISIBLE);

                }

我不能特别理解这一部分。检查和数组是如何工作的?

for (int[] winningPosition : winningPositions) {

            if (gameState[winningPosition[0]] == gameState[winningPosition[1]] &&
                    gameState[winningPosition[1]] == gameState[winningPosition[2]] &&
                    gameState[winningPosition[0]] != 2) {

                // Someone has won!
ny6fqffe

ny6fqffe1#

虽然我不知道udemy课程是从哪里学来的,但是从给定的代码我可以理解以下几点。
你可以假设每个单元都是3x3板上的位置。因此,董事会将出现这样的情况:
0 1 2
3 4 5
6 7 8
现在,如果你知道井字游戏规则,那么它应该是相当简单的理解赢的位置数组。它包含了所有的水平,垂直和对角线的路径,这将导致一个胜利。
现在回答你的第二个问题,游戏状态最初设置为2,表示当前所有的单元格都没有标记,即两个玩家都没有在任何单元格中移动(指定为2)。因此,每当任何玩家在一个单元格上移动时,它都会被玩家id(0或1)标记。
那么获胜的逻辑就相当简单了。你只需在所有可能的路径上迭代任何赢家,然后检查是否在任何路径中所有的3个单元格都被任何一个玩家占用。
所以基本上有两件事需要检查:
所有3个单元格都相等,即被同一玩家id占用。
游戏状态[winningposition[0]]==游戏状态[winningposition[1]]&&gamestate[winningposition[1]]==游戏状态[winningposition[2]]
如果单元格相等,则它们应该被玩家占用,因此值不应等于2。
游戏状态[winningposition[0]]!=2表示单元格未被占用
例如,如果玩家1通过同时占据所有顶部水平单元格而获胜,那么获胜位置{0112}将与玩家1的id具有相同的id。
希望这是清楚的!

相关问题