这是我正在为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!
1条答案
按热度按时间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。
希望这是清楚的!