Android Studio Tic Tac Toe не показывает победившего пользователя

#java #android #algorithm #android-studio

#java #Android #алгоритм #android-студия

Вопрос:

Обзор: Пытаюсь сделать игру, похожую на крестики-нолики, но не работает с сеткой 3/3. Не могу понять, что не так с кодом. Пожалуйста, помогите.

Проблема: Сетка не составляет 3 линий для завершения игры. Проблема заключается в правильном построении логики.

Чего я хочу добиться: я хочу сделать сетку 3 на 3, чтобы показывать, когда игра завершается сообщением, что вы выиграли.

 public class MainActivity extends AppCompatActivity {
    // 0: yellow, 1: red, 2: empty
    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 } };
    int activePlayer = 0;
    boolean gameActive = true;

    public void dropIn(View view) {
        ImageView counter = (ImageView) view;
        int tappedCounter = Integer.parseInt(counter.getTag().toString());

        if (gameState[tappedCounter] == 1 amp;amp; gameActive) {
            gameState[tappedCounter] = activePlayer;
            counter.setTranslationY(-1500);
            if (activePlayer == 0) {
                counter.setImageResource(R.drawable.yellow);
                activePlayer = 1;
            } else {
                counter.setImageResource(R.drawable.red);
                activePlayer = 0;
            }
            counter.animate().translationYBy(1500).rotation(3600).setDuration(300);

            for (int[] winningPosition : winningPositions) {
                if (gameState[winningPosition[0]] == gameState[winningPosition[1]]
                        amp;amp; gameState[winningPosition[1]] == gameState[winningPosition[2]]
                        amp;amp; gameState[winningPosition[0]] != 2) {
                    // Somone has won!
                    gameActive = false;
                    String winner = "";

                    if (activePlayer == 1) {
                        winner = "Yellow";
                    } else {
                        winner = "Red";
                    }
                }
            }
        }
    }
}
 

Ответ №1:

Ваша проверка состояния игры на цикл верна. Я думаю, что проблема заключается в правильной настройке массива GameState.

Ответ №2:

Решение

Предположим activity_main.xml , здесь вы создаете экран для игры в крестики-нолики.

xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000"
    android:gravity="center"
    android:orientation="vertical">

    <TextView
        android:id="@ id/winnerTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="30dp"
        android:textSize="24sp"
        android:textStyle="bold"
        android:visibility="gone" />

    <GridLayout
        android:id="@ id/gameBoard"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="20dp">

        <ImageView
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_row="0"
            android:layout_column="0"
            android:layout_marginEnd="10dp"
            android:layout_marginBottom="10dp"
            android:background="#FFF"
            android:onClick="dropIn"
            android:tag="0" />

        <ImageView
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_row="0"
            android:layout_column="1"
            android:layout_marginEnd="10dp"
            android:background="#FFF"
            android:onClick="dropIn"
            android:tag="1" />

        <ImageView
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_row="0"
            android:layout_column="2"
            android:background="#FFF"
            android:onClick="dropIn"
            android:tag="2" />

        <ImageView
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_row="1"
            android:layout_column="0"
            android:layout_marginEnd="10dp"
            android:layout_marginBottom="10dp"
            android:background="#FFF"
            android:onClick="dropIn"
            android:tag="3" />

        <ImageView
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_row="1"
            android:layout_column="1"
            android:layout_marginEnd="10dp"
            android:background="#FFF"
            android:onClick="dropIn"
            android:tag="4" />

        <ImageView
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_row="1"
            android:layout_column="2"
            android:background="#FFF"
            android:onClick="dropIn"
            android:tag="5" />

        <ImageView
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_row="2"
            android:layout_column="0"
            android:layout_marginEnd="10dp"
            android:background="#FFF"
            android:onClick="dropIn"
            android:tag="6" />

        <ImageView
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_row="2"
            android:layout_column="1"
            android:layout_marginEnd="10dp"
            android:background="#FFF"
            android:onClick="dropIn"
            android:tag="7" />

        <ImageView
            android:layout_width="64dp"
            android:layout_height="64dp"
            android:layout_row="2"
            android:layout_column="2"
            android:background="#FFF"
            android:onClick="dropIn"
            android:tag="8" />

    </GridLayout>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="reset"
        android:text="Reset" />
</LinearLayout>
 

Дизайн

введите описание изображения здесь

MainActivity

 public class MainActivity extends AppCompatActivity {

    // 0: yellow, 1: red, 2: empty
    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}};
    int activePlayer = 0;
    boolean gameActive = true;

    private GridLayout gameBoard;
    private TextView winnerTextView;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gameBoard = findViewById(R.id.gameBoard);
        winnerTextView = findViewById(R.id.winnerTextView);
    }

    public void dropIn(View view) {
        ImageView counter = (ImageView) view;
        int tappedCounter = Integer.parseInt(counter.getTag().toString());

        if (gameActive) {
            gameState[tappedCounter] = activePlayer;
            counter.setTranslationY(-1500);
            if (activePlayer == 0) {
                counter.setImageResource(R.drawable.yellow);
                activePlayer = 1;
            } else {
                counter.setImageResource(R.drawable.red);
                activePlayer = 0;
            }
            counter.animate().translationYBy(1500).rotation(3600).setDuration(300);

            for (int[] winningPosition : winningPositions) {
                if (gameState[winningPosition[0]] == gameState[winningPosition[1]]
                        amp;amp; gameState[winningPosition[1]] == gameState[winningPosition[2]]
                        amp;amp; gameState[winningPosition[0]] != 2) {

                    // Someone has won!
                    gameActive = false;
                    String winner;
                    int color;
                    if (activePlayer == 1) {
                        winner = "Yellow";
                        color = Color.YELLOW;
                    } else {
                        winner = "Red";
                        color = Color.RED;
                    }
                    winnerTextView.setVisibility(View.VISIBLE);
                    winnerTextView.setTextColor(color);
                    winnerTextView.setText(winner   " won!");
                }
            }
        }
    }

    public void reset(View view) {
        activePlayer = 0;
        gameActive = true;
        Arrays.fill(gameState, 2);
        for (int i = 0; i < gameBoard.getChildCount();   i) {
            ImageView cell = (ImageView) gameBoard.getChildAt(i);
            cell.setImageDrawable(null);
        }
        winnerTextView.setVisibility(View.GONE);
        winnerTextView.setText("");
    }
}
 

Результат

введите описание изображения здесь