Java 数组在这段代码中做什么?

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

我正在学习我的英语。我在写XOX游戏的代码。我想我们都知道XOX游戏。我的代码正在运行,但我不明白该代码的作用是什么

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:winningPositions

for循环在数组中迭代并检查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是的,非常正确。这概括了我的答案。