Java 数组在这段代码中做什么?
我正在学习我的英语。我在写XOX游戏的代码。我想我们都知道XOX游戏。我的代码正在运行,但我不明白该代码的作用是什么Java 数组在这段代码中做什么?,java,android,arrays,Java,Android,Arrays,我正在学习我的英语。我在写XOX游戏的代码。我想我们都知道XOX游戏。我的代码正在运行,但我不明白该代码的作用是什么 for (int [] winningPosition : winningPositions){ if (gameState[winningPosition[0]] == gameState[winningPosition[1]] && gameState[winningPosition[1]] == gameState[w
for (int [] winningPosition : winningPositions){
if (gameState[winningPosition[0]] == gameState[winningPosition[1]] && gameState[winningPosition[1]] == gameState[winningPosition[2]] &&
gameState[winningPosition[0]] != 2)}
上面是我没有得到的代码。请帮助我理解这一点
{ package com.example.anild.xox;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
// 0 = yellow, 1 = red
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) {
//burada tappedCounterdaki sayıyı çekiyor yani tag'i daha sonra gamstate[] dizisine atıyor. Ve zaten hepsi 2 if koşulu sağlanıyor
//Bir asağısında bu kural değişiyor. Bu alınan tag gametate'te artık 0 olarak saklanıyor :)
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);
}
}
}
}
}
}
public void playAgain(View view) {
gameIsActive = true;
LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout);
layout.setVisibility(View.INVISIBLE);
// 0 = yellow, 1 = red
activePlayer = 0;
for(int i = 0; i < gameState.length; i++) {
gameState[i] = 2;
}
GridLayout 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);
}
}
}
对于int[]winningPosition:winningPositions
遍历名为winningPositions的数组。每个迭代都有一个名为winningPosition的变量,它是一个长度为3的整数数组
if (gameState[winningPosition[0]] == gameState[winningPosition[1]] &&
gameState[winningPosition[1]] == gameState[winningPosition[2]] &&
gameState[winningPosition[0]] != 2)
检查所有位置是否由同一玩家拥有,以及最后一部分游戏状态[winningPosition[0]]!=2检查该行是否为空
编辑:
@ChrisParker在评论中很好地解释了这句话。对于int[]winningPosition:winningPositionsfor循环在数组中迭代并检查if语句中的每个条件,如果所有条件都为true,则代码将进入if循环,否则它将跳过并继续
干杯根据以下问题回答我的评论: 最基本的是,for循环的格式是
for('one object' : 'group of objects')
现在,在一般情况下,您可以使用以下内容:
for(String oneString : arrayOfStrings)
根据您的问题,您似乎不知道可以通过将值放在大括号内静态指定值数组。例如:
String[] arrayOfStrings = {"zero", "one", "two"};
这将产生与以下结果完全相同的结果:
String[] arrayOfStrings = new String[3];
arrayOfStrings[0] = "zero";
arrayOfStrings[1] = "one";
arrayOfStrings[2] = "two";
你可以用forString:arrayOfStrings循环这个字符串
回到您的原始代码——它们在大括号中嵌入了大括号,这就是您声明多维数组的方式。因此,以下是:
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}};
生成与以下内容相同的数组:
int[][] winningPositions = new int[8][3];
winningPositions[0][0] = 0;
winningPositions[0][1] = 1;
winningPositions[0][2] = 2;
...
winningPositions[7][0] = 2;
winningPositions[7][1] = 4;
winningPositions[7][2] = 6;
到目前为止和我在一起
full winningPositions变量是array类型的对象,其内容本身就是数组序列。好的,现在当你做你不理解的循环时,这个:
for (int [] winningPosition : winningPositions)
数组winningPosition中的每个项本身就是一个数组——正如我刚才所说的——因此一个对象解析为内部数组,其中有3个元素,而外部数组有8个元素
这有用吗
另一方面:这样的代码要么是针对新程序员的,要么是由不懂OO编程的人编写的。了解它是如何工作的是值得的,它不一定要被模仿。或者至少当你知道我错了的时候,你就会知道我为什么错了。你还不明白什么?嗨,先生,我不明白这到底是怎么回事?我的意思是有一个数组,名为winningPositions,有2维。那么我们是如何得到这些数据的呢?为什么我们要再次使用数组?那么获胜的位置是什么[0]。谢谢你的回答@shmoselt数组是硬编码的。您可以看到这些值。这是一个非常奇怪的实现,但它可以工作。另外,它也不叫XOX游戏,直到我读了代码我才知道你的意思——它叫tic-tac-toe.Hi@gabeschen。对不起,游戏的名字。我不知道这是什么游戏。我写了这段代码,但它不属于我。我从我的课上的一个UDE中得到了它,但是数组有一个问题。我不明白迭代Winning Positions有8个长度,它是如何运行的?并将数据提供给Winning Position 8种获胜方式-3种水平、3种垂直、2种对角线。天数是网格中的位置。从0平方开始到8平方,答案不错,但遗漏了OP可能不知道的要点。该类型的“for循环”是“for:”。由于“对象组”是二维数组,“一个对象”解析为一维数组。Hi@ChrisParker。这就是我一直在问的问题。我不明白我们怎么做?数组有8个长度,我们是如何将其减少到3的?winningPosition[0]的描述是什么?这是什么?它有什么?@ChrisParker是的,非常正确。这概括了我的答案。