Как реализовать функции игры java ti c ta c toe - PullRequest
0 голосов
/ 24 апреля 2020

У меня проблемы с этим заданием для школы. Я хотел бы реализовать метод, где код говорит //call method to check for winner, чтобы проверять победителя после каждого хода. Я не уверен, как это сделать. Я пробовал разные способы. Затем я хотел бы, чтобы имя победителя "X побед" или "O побед" было отображено на доске ног ti c ta c.

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.layout.GridPane;
import javafx.geometry.*;

public class Main extends Application {
    public static int turn = 1;
    public static void main(String[] args) {
        launch(args);
    } //end main

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Play Tic Tac Toe!");

        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));

        Scene scene = new Scene(grid, 300, 275);
        primaryStage.setScene(scene);

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                grid.add(createButton(), i, j);
            }
        }
        primaryStage.show();
    }

    private static Button createButton() {
        //instantiates button objects with the same properties
        Button b = new Button(" ");
        b.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                //implemennt Tic Tac Toe logic
                if(turn % 2 != 0) {
                    b.setText("X");
                }
                else  {
                    b.setText("O");
                }

                int row = GridPane.getRowIndex(b);
                int col = GridPane.getColumnIndex(b);
                //outputs to the terminal
                System.out.println("Turn = " + turn + " Row = " + row + " Col = " + col);
                b.setDisable(true); //after button is clicked, disable it
                // call method to check for winner
                turn++;
            }
        });
        return b;
    }

1 Ответ

1 голос
/ 24 апреля 2020

Есть несколько способов сделать это. Ради того, чтобы сохранить это как вашу собственную работу, я не буду публиковать код для вас, а буду ссылаться только на потенциальные решения и алгоритмы, которые вы можете использовать.

Первое, что вам нужно сделать, - это создать способ хранения state доски. Поскольку доска маленькая (3x3), я бы просто использовал простую integer array. Есть три возможных states, я бы сказал, что Empty равен 0, X равен 1, а O равен 2. Я бы назначил 0-2 верхней 3, 3-5 средней, а 6-8 нижней. Чтобы упростить ситуацию, я мог бы написать функции get и set для этого array, чтобы я мог

Например, написать set(X,Y,State), чтобы установить этот квадрат в это состояние или получить для получения это состояние. После того, как я настрою эту систему, мне нужно будет найти способ для себя выяснить, есть ли у кого-то она. Для этого я бы написал al oop, чтобы проверить каждый квадрат. Если квадрат пуст, тогда ничего не делайте, но если он имеет x или o, сохраните координаты как, скажем, x1,y1, затем проверьте все соседние квадраты. Если какой-либо из соседних квадратов имеет такое же состояние, сохраните координаты как x2,y2, в противном случае просто перейдите к следующему квадрату.

Наконец, проверьте, существует ли на доске какая-либо из следующих пар координат: (2*x2-x1,2*y2-y1) и (2*x1-x2,2*y1-y2). Если они это сделают, то проверьте, совпадает ли состояние этого квадрата с первыми двумя. Если это так, то независимо от того, в каком состоянии находится этот квадрат, игрок выиграл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...