Крестики Нолики, реализация ООП на Java

283
21 апреля 2018, 20:23

Не могу понять, как мне сделать очередность игроков в классе Player, то есть при начале игры, я хочу чтобы первый игрок начал свой ход со второй клетки, но никак не могу понять, как это сделать, и как лучше реализовать класс Computer.

Подразумевается произвольное заполнение массива с клетки 1 по 9 переменной типа String. Как это можно сделать?

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

Ниже предоставлены коды всех имеющихся классов:

AbGame.java

package homeworks;
public abstract class AbGame {
    abstract void game();
    abstract void choice();
    abstract void displaying();
    abstract void checking();
}

Player.java

package homeworks;
import java.util.Scanner;
public class Player {
    protected String cell;
    public void play() {
        Game gm = new Game();
        Scanner in = new Scanner(System.in);
        int k = 0;
        System.out.println("Enter the cell:");
        while (k < 1) {
            switch (cell = in.next()) {
                case "1": {
                    if (Game.field[0][0].equals(" [ ] ") && !Game.field[0][0].equals(" [O] ")) {
                        Game.field[0][0] = (" [X] ");
                        gm.displaying();
                        k++;
                        break;
                    } else if (Game.field[0][0].equals(" [ ] ") && !Game.field[0][1].equals(" [X] ")) {
                        Game.field[0][0] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "2": {
                    if (Game.field[0][1].equals(" [ ] ") && !Game.field[0][1].equals(" [O] ")) {
                        Game.field[0][1] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else if (Game.field[0][1].equals(" [ ] ") && !Game.field[0][1].equals(" [X] ")) {
                        Game.field[0][1] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "3": {
                    if (Game.field[0][2].equals(" [ ] ") && !Game.field[0][2].equals(" [O] ")) {
                        Game.field[0][2] = (" [X] ");
                        gm.displaying();
                        k++;
                        break;
                    } else if (Game.field[0][2].equals(" [ ] ") && !Game.field[0][2].equals(" [X] ")) {
                        Game.field[0][2] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "4": {
                    if (Game.field[1][0].equals(" [ ] ") && !Game.field[1][0].equals(" [O] ")) {
                        Game.field[1][0] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else if (Game.field[1][0].equals(" [ ] ") && !Game.field[1][0].equals(" [X] ")) {
                        Game.field[1][0] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "5": {
                    if (Game.field[1][1].equals(" [ ] ") && !Game.field[1][1].equals(" [O] ")) {
                        Game.field[1][1] = (" [X] ");
                        gm.displaying();
                        k++;
                        break;
                    } else if (Game.field[1][1].equals(" [ ] ") && !Game.field[1][1].equals(" [X] ")) {
                        Game.field[1][1] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "6": {
                    if (Game.field[1][2].equals(" [ ] ") && !Game.field[1][2].equals(" [O] ")) {
                        Game.field[1][2] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else if (Game.field[1][2].equals(" [ ] ") && !Game.field[1][2].equals(" [X] ")) {
                        Game.field[1][2] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "7": {
                    if (Game.field[2][0].equals(" [ ] ") && !Game.field[2][0].equals(" [O] ")) {
                        Game.field[2][0] = (" [X] ");
                        gm.displaying();
                        k++;
                        break;
                    } else if (Game.field[2][0].equals(" [ ] ") && !Game.field[2][0].equals(" [X] ")) {
                        Game.field[2][0] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "8": {
                    if (Game.field[2][1].equals(" [ ] ") && !Game.field[2][1].equals(" [O] ")) {
                        Game.field[2][1] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else if (Game.field[2][1].equals(" [ ] ") && !Game.field[2][1].equals(" [X] ")) {
                        Game.field[2][1] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "9": {
                    if (Game.field[2][2].equals(" [ ] ") && !Game.field[2][2].equals(" [O] ")) {
                        Game.field[2][2] = (" [X] ");
                        gm.displaying();
                        k++;
                        break;
                    } else if (Game.field[2][2].equals(" [ ] ") && !Game.field[2][2].equals(" [X] ")) {
                        Game.field[2][2] = (" [O] ");
                        gm.displaying();
                        k++;
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                default:
                    System.out.println("\nError enter again!");
                    break;
            }
        }
    }
}

Main.java

package homeworks;
public class Main {
    public static void main(String[] args) {
        System.out.println("Welcome to the game TicTacToe!");
        Game gm = new Game();
        gm.game();
    }
}

Computer.java

package homeworks;
import java.util.Scanner;
public class Computer extends Player {
    @Override
    public void play() {
        Game gm = new Game();
        Scanner in = new Scanner(System.in);
        int i = 0;
        while (i < 9) {
            System.out.println("Enter the cell:");
            switch (cell = in.next()) {
                case "1": {
                    if (Game.field[0][0].equals(" [ ] ")) {
                        Game.field[0][0] = (" [X] ");
                        i++;
                        Game.field[0][1] = (" [O] ");
                        gm.displaying();
                        i++;
                        System.out.println("Move of Computer");
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "2": {
                    if (Game.field[0][1].equals(" [ ] ")) {
                        Game.field[0][1] = (" [X] ");
                        i++;
                        Game.field[0][2] = (" [O] ");
                        gm.displaying();
                        i++;
                        System.out.println("Move of Computer");
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "3": {
                    if (Game.field[0][2].equals(" [ ] ")) {
                        Game.field[0][2] = (" [X] ");
                        i++;
                        Game.field[1][0] = (" [O] ");
                        gm.displaying();
                        i++;
                        System.out.println("Move of Computer");
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "4": {
                    if (Game.field[1][0].equals(" [ ] ")) {
                        Game.field[1][0] = (" [X] ");
                        i++;
                        Game.field[1][1] = (" [O] ");
                        gm.displaying();
                        i++;
                        System.out.println("Move of Computer");
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "5": {
                    if (Game.field[1][1].equals(" [ ] ")) {
                        Game.field[1][1] = (" [X] ");
                        i++;
                        Game.field[1][2] = (" [O] ");
                        gm.displaying();
                        i++;
                        System.out.println("Move of Computer");
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "6": {
                    if (Game.field[1][2].equals(" [ ] ")) {
                        Game.field[1][2] = (" [X] ");
                        i++;
                        Game.field[2][0] = (" [O] ");
                        gm.displaying();
                        i++;
                        System.out.println("Move of Computer");
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "7": {
                    if (Game.field[2][0].equals(" [ ] ")) {
                        Game.field[2][0] = (" [X] ");
                        i++;
                        Game.field[2][1] = (" [O] ");
                        gm.displaying();
                        i++;
                        System.out.println("Move of Computer");
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "8": {
                    if (Game.field[2][1].equals(" [ ] ")) {
                        Game.field[2][1] = (" [X] ");
                        i++;
                        Game.field[2][2] = (" [O] ");
                        i++;
                        gm.displaying();
                        System.out.println("Move of Computer");
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                case "9": {
                    if (Game.field[2][2].equals(" [ ] ")) {
                        Game.field[2][2] = (" [X] ");
                        i++;
                        Game.field[0][0] = (" [O] ");
                        gm.displaying();
                        i++;
                        System.out.println("Move of Computer");
                        break;
                    } else {
                        System.out.println("This cell is not empty, enter another one");
                        break;
                    }
                }
                default:
                    System.out.println("\nError enter again!");
                    break;
            }
        }
    }
}

Game.java

package homeworks;
import java.util.Scanner;
public class Game extends AbGame {
    public static String[][] field = new String[3][3];
    private int i = 0;
    Player players[] = new Player[5];
    Computer x = new Computer();
    public void game() {
        for (int i = 0; i < 3; i++) {
            System.out.println();
            for (int j = 0; j < 3; j++) {
                field[i][j] = (" [ ] ");
                System.out.print(field[i][j]);
            }
        }
        choice();
    }
    public void choice() {
        Scanner ex = new Scanner(System.in);
        String re;
        System.out.println("\nWould you like to play with computer?");
        do {
            re = ex.next();
            if (re.equals("N")) {
                while (i < 9) {
                    for (int i = 0; i < 2; i++) {
                        System.out.println("Move of Player " + (i + 1));
                        players[i] = new Player();
                        players[i].play();
                    }
                }
            } else if (re.equals("Y")) {
                x.play();
            }
        } while (re.equals("N") || re.equals("Y"));
    }
    public void checking() {
        for (int t = 0; t < 3; t++) {
            if (((field[t][0]) == " [O] " & (field[t][1]) == " [O] " & field[t][2] == " [O] ") ||
                    ((field[0][t]) == " [O] " & (field[1][t]) == " [O] " & field[2][t] == " [O] ")) {
                System.out.print("\nWinner Player 2!");
                System.exit(0);
            } else if (((field[t][0]) == " [X] " & (field[t][1]) == " [X] " & field[t][2] == " [X] ") ||
                    ((field[0][t]) == " [X] " & (field[1][t]) == " [X] " & field[2][t] == " [X] ")) {
                System.out.print("\nWinner Player 1!");
                System.exit(0);
            } else {
            }
        }
        if (((field[0][0]) == " [X] " & (field[1][1]) == " [X] " & field[2][2] == " [X] ") ||
                ((field[0][2]) == " [X] " & (field[1][1]) == " [X] " & field[2][0] == " [X] ")) {
            System.out.print("\nWinner Player 1!");
            System.exit(0);
        } else if (((field[0][0]) == " [O] " & (field[1][1]) == " [O] " & field[2][2] == " [O] ") ||
                ((field[0][2]) == " [O] " & (field[1][1]) == " [O] " & field[2][0] == " [O] ")) {
            System.out.print("\nWinner Player 2 !");
            System.exit(0);
        } else {
        }
        System.out.println();
    }
    public void displaying() {
        for (int p = 0; p < 3; p++) {
            System.out.println();
            for (int l = 0; l < 3; l++) {
                System.out.print(field[p][l]);
            }
        }
        checking();
    }
}
Answer 1

Понравилась идея с Крестиками-Ноликами и решил написать свою программу (Ссори за английский. Я на нем говорю). Запускаешь Game.java и играешь. В программу вставил нубский "искусственный интеллект", который в свой первый ход ходит рандомно, а в последующие начинает "думать" как сходить. Игра заканчивается либо победой, либо заполнением всех клеток (не стал писать код для "ничьи" - лень).

НЕ ЗАБУДЬТЕ ЗАПИХНУТЬ ТРИ НИЖЕ ПРЕДСТАВЛЕННЫЕ ПРОГРАММЫ В PACKAGE С ИМЕНЕМ "homeworks"

EDIT 1: Есть ошибка в комбинации, когда создаем фигуру "треугольник" для победы. тут у меня программа просто не ходит и все.. Вариант этой фигуры:

0X0
--0--
--X--

Компьютер должен хоть как-то сходить, но не хочет. Где-то ошибка. исправьте ее, если не лень.

EDIT2: Не лень было найти ошибку. Она была в условии, при которых комп должен был выиграть. Я делал проверку на 1, когда надо было на -1.

Game.java

package homeworks;
public class Game {
    //FIELD
    private static int[][] field = new int[3][3];
    private static boolean Computer_win = false;
    private static boolean Player_win = false;
    public static int[][] getField() {
        return field;
    }
    public static void setField(int row, int column, int n) {
        field[row][column] = n;
    }
    public void display() {
        System.out.println("  1 2 3");
        for (int i = 0; i < 3; i++) {
            System.out.print((i+1) + " ");
            for (int j = 0; j < 3; j++) {
                if(field[j][i] == 1) {
                    System.out.print("O ");
                } else if(field[j][i] == 0){
                    System.out.print("_ ");
                } else {
                    System.out.print("X ");
                }
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        Game game = new Game();
        Player player = new Player();
        Computer computer = new Computer();
        System.out.println("\nPlayer plays as a Zero ( O ); Computer plays as a Cross ( X )\n");
        while (true) {
            game.display();
            player.move();
            if (win_check()) {
                break;
            };
            computer.move();
            if (win_check()) {
                break;
            };
        }
        game.display();
        if (Player_win) {
            System.out.println("\nPlayer won the game");
        } else if(Computer_win) {
            System.out.println("\nComputer won the game");
        } else {
            System.out.println("\nDraw. No one won the game");
        }
    }
    public static boolean win_check() {
        int sum_hor, sum_ver, sum_dia1 = 0, sum_dia2 = 0, sum_all;
        for (int i = 0; i < 3; i++) {
            sum_hor = 0;
            sum_ver = 0;
            for (int j = 0; j < 3; j++) {
                sum_hor += field[j][i];
                sum_ver += field[i][j];
            }
            if (sum_hor == 3 || sum_ver == 3) {
                Player_win = true;
                return true;
            }
            if (sum_hor == -3 || sum_ver == -3) {
                Computer_win = true;
                return true;
            }
        }
        for (int i = 0; i < 3; i++) {
            sum_dia1 += field[i][i];
            sum_dia2 += field[2-i][i];
        }
        if (sum_dia1 == 3 || sum_dia2 == 3) {
            Player_win = true;
            return true;
        }
        if (sum_dia1 == -3 || sum_dia2 == -3) {
            Computer_win = true;
            return true;
        }
        sum_all = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (field[i][j] != 0) {
                    sum_all += 1;
                }
            }
        }
        if (sum_all == 9) {
            return true;
        }
        return false;
    }
}

Player.java

package homeworks;
import java.util.Scanner;
import homeworks.Game;
public class Player {
    private int column, row;
    public void move() {
        System.out.println("\nPlayer's move\n");
        while(true) {
            try {
                System.out.println("Enter cell (row and column) with space. Example: '1 3'");
                Scanner keyboard = new Scanner(System.in);
                column = keyboard.nextInt();
                row = keyboard.nextInt();
                if(Game.getField()[row-1][column-1] != 1 && Game.getField()[row-1][column-1] != -1) {
                    Game.setField(row-1, column-1, 1);
                    break;
                }
            } catch (Exception e) {
                System.out.println("Error in input\n");
            }
        }
    }
}

Computer.java

    package homeworks;
    import java.util.Random;
    import homeworks.Game;
    public class Computer {
        private int column, row;
        public void move() {
            System.out.println("\nComputer's move\n");
            while(true) {
                Random random = new Random();
                row = random.nextInt(2) + 0;
                column = random.nextInt(2) + 0;
                if (win_check_player()) {
                    break;
                }
                if(Game.getField()[row][column] != 1 && Game.getField()[row][column] != -1) {
                    Game.setField(row, column, -1);
                    break;
                }
            }
        }
        private boolean win_check_player(){
            int[][]field = Game.getField();
            int
 sum_hor, sum_ver, sum_dia1 = 0, sum_dia2 = 0;
        for (int i = 0; i < 3; i++) {
            sum_hor = 0;
            sum_ver = 0;
            for (int j = 0; j < 3; j++) {
                sum_hor += field[j][i];
                sum_ver += field[i][j];
            }
            //if computer close to win
            if (sum_hor == -2) {
                for (int j = 0; j < 3; j++) {
                    if(Game.getField()[j][i] != -1) {
                        Game.setField(j, i, -1);
                        return true;
                    }
                }
            }
            if (sum_ver == -2) {
                for (int j = 0; j < 3; j++) {
                    if(Game.getField()[i][j] != -1) {
                        Game.setField(i, j, -1);
                        return true;
                    }
                }
            }
            //if player wins
            if (sum_hor == 2) {
                for (int j = 0; j < 3; j++) {
                    if(Game.getField()[j][i] != 1) {
                        Game.setField(j, i, -1);
                        return true;
                    }
                }
            }
            if (sum_ver == 2) {
                for (int j = 0; j < 3; j++) {
                    if(Game.getField()[i][j] != 1) {
                        Game.setField(i, j, -1);
                        return true;
                    }
                }
            }
        }
        for (int i = 0; i < 3; i++) {
            sum_dia1 += field[i][i];
            sum_dia2 += field[2-i][i];
        }
        System.out.println("SUM1 = " + sum_dia1 + " SUM2 = " + sum_dia2);
        //if computer close to win
        if (sum_dia1 == -2) {
            for (int i = 0; i < 3; i++) {
                if(Game.getField()[i][i] != -1) {
                    Game.setField(i, i, -1);
                    return true;
                }
            }
        }
        if (sum_dia2 == -2) {
            for (int i = 0; i < 3; i++) {
                if(Game.getField()[2-i][i] != -1) {
                    Game.setField(2-i, i, -1);
                    return true;
                }
            }
        }
        //if player close to win
        if (sum_dia1 == 2) {
            for (int i = 0; i < 3; i++) {
                if(Game.getField()[i][i] != 1) {
                    Game.setField(i, i, -1);
                    return true;
                }
            }
        }
        if (sum_dia2 == 2) {
            for (int i = 0; i < 3; i++) {
                if(Game.getField()[2-i][i] != 1) {
                    Game.setField(2-i, i, -1);
                    return true;
                }
            }
        }
        return false;
    }
}
READ ALSO
библиотека для подключения в Oracle

библиотека для подключения в Oracle

Есть БД Oracleнужно написать программу на java

186
(Apache PDFBox ) PDDocument.print(). Нажмите кнопку ОК на принтере

(Apache PDFBox ) PDDocument.print(). Нажмите кнопку ОК на принтере

Так запускаю печать, печать проходит с данными настройками, но единственное что не понятно - после того как задание передается на принтер,...

182
Как вывести данные из MySQL в ListView?

Как вывести данные из MySQL в ListView?

Есть база MySQL, я к ней подключился + вывел столбцы в "консоль" Android Studio, подскажите, как мне их вывести в ListView или что-нибудь на подобии него

243
Spring boot @Autowired и библиотека Telegrambots

Spring boot @Autowired и библиотека Telegrambots

Столкнулся с проблемойУ библиотеки Telegrambots для использования с Http proxy нужно использовать вот такой конструктор:

257