Читабельность и грамотность кода

152
30 октября 2018, 04:50

Не знаю, можно ли выкладывать такие просьбы тут, но руку мне за это не отрежут.

Моя просьба будет в том, что бы вы посмотрели и оценили читабельность и грамотность кода. Простая консольная программа крестики-нолики (и, соответственно, написали все, что вы думаете). Разбираться и тратить много времени тут не придется, так как она слишком проста, единственный минус программы (на мой взгляд) - это отсутствие как такового AI, все ходы от него ставятся рандомно, если кто-то хотя бы намекнет как реализовать AI, буду признателен, готовые решения искать не хочу.

класс Main

public class Main extends Logic {

    public static void main(String[] args) {
        Logic logic = new Logic();
        logic.pickPlayer();
        logic.initMap();
        if (logic.pick2 == 2) {
            if (logic.pick1 == 1) {
                while (true) {
                    logic.human();
                    logic.printMap();
                    if (logic.checkWin(logic.DOT_X)) {
                        System.out.println("Победил человек!");
                        break;
                    }
                    if (logic.isMapFull()) {
                        System.out.println("Ничья");
                        break;
                    }
                    logic.AI();
                    logic.printMap();
                    if (logic.checkWin(logic.DOT_O)) {
                        System.out.println("Победил AI!");
                        break;
                    }
                    if (logic.isMapFull()) {
                        System.out.println("Ничья");
                        break;
                    }
                }
            } else {
                while (true) {
                        logic.AI();
                        logic.printMap();
                        if (logic.checkWin(logic.DOT_X)) {
                            System.out.println("Победил AI!");
                            break;
                        }
                        if (logic.isMapFull()) {
                            System.out.println("Ничья");
                            break;
                        }
                        logic.human();
                        logic.printMap();
                        if (logic.checkWin(logic.DOT_O)) {
                            System.out.println("Победил человек!");
                            break;
                        }
                        if (logic.isMapFull()) {
                            System.out.println("Ничья");
                            break;
                        }
                }
            }
        }
        else {
            while (true) {
                logic.human();
                logic.printMap();
                if (logic.checkWin(logic.DOT_X)) {
                    System.out.println("Победил первый игрок!");
                    break;
                }
                if (logic.isMapFull()) {
                    System.out.println("Ничья");
                    break;
                }
                logic.humanTwo();
                logic.printMap();
                if (logic.checkWin(logic.DOT_O)) {
                    System.out.println("Победил второй игрок!");
                    break;
                }
                if (logic.isMapFull()) {
                    System.out.println("Ничья");
                    break;
                }
            }
        }
    }
}

класс Logic

import java.util.Random;
import java.util.Scanner;
public class Logic {
    protected final int SIZE = 3;
    protected char[][] map;
    protected final char DOT_EMPTY = '*';
    protected final char DOT_X = 'X';
    protected final char DOT_O = 'O';
    protected Scanner scanner = new Scanner(System.in);
    protected Random random = new Random();
    protected int pick1;
    protected int pick2;
    protected void pickPlayer(){
        do {
            System.out.println("Введите '1' что бы играть с человеком");
            System.out.println("Введите '2' что бы играть с AI");
            pick2 = scanner.nextInt();
        } while (pick2 != 1 && pick2 != 2);
        if (pick2 == 2) {
            do {
                System.out.println("Введите '1' что бы начать первым");
                System.out.println("Введите '2' что бы уступить ход");
                pick1 = scanner.nextInt();
            } while (pick1 != 1 && pick1 != 2);
        }
        if (pick2 == 1) {
            pick1 = 1;
        }
    }
    protected void initMap(){
        map = new char[SIZE][SIZE];
        for(int i = 0; i<SIZE; i++){
            for(int j=0; j < SIZE; j++ ){
                map[i][j] = DOT_EMPTY;
            }
        }
    }
    protected void printMap(){
        for(int i = 0; i<= SIZE; i++){
            System.out.print(i + " ");
        }
        System.out.println();
        for(int i =0; i <SIZE; i++){
            System.out.print((i + 1) + " ");
            for(int j = 0; j < SIZE; j++){
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();
    }
    protected void human(){
        int x,y;
        do{
            System.out.println("Введите координаты в формате X Y");
            x = scanner.nextInt() - 1;
            y = scanner.nextInt() - 1;
        }while (!isCellValid(x,y));
        if (pick1 == 1){
        map[y][x] = DOT_X;
        }
        else {map[y][x] = DOT_O;}
    }
    protected void humanTwo(){
        int x,y;
        do{
            System.out.println("Введите координаты в формате X Y");
            x = scanner.nextInt() - 1;
            y = scanner.nextInt() - 1;
        }while (!isCellValid(x,y));
        if (pick1 == 2){
            map[y][x] = DOT_X;
        }
        else {map[y][x] = DOT_O;}
    }
    protected void AI(){
        int x, y;
        do{
            x = random.nextInt(SIZE);
            y = random.nextInt(SIZE);
        }while (!isCellValid(x,y));
        System.out.println("Компьютер походил в точку " + (x + 1) + " " + (y + 1));
        if (pick1 == 2){
        map[y][x] = DOT_X;
        }
        else {map[y][x] = DOT_O;}
    }
    public boolean isCellValid(int x, int y){
        if(x<0 || x>= SIZE || y<0 || y>=SIZE) return false;
        if(map[y][x] == DOT_EMPTY) return true;
        else return false;
    }
    protected boolean checkWin(char symb){
        if(map[0][0] == symb && map[0][1] == symb && map[0][2] == symb) return true;
        if(map[1][0] == symb && map[1][1] == symb && map[1][2] == symb) return true;
        if(map[2][0] == symb && map[2][1] == symb && map[2][2] == symb) return true;
        if(map[0][0] == symb && map[1][1] == symb && map[2][2] == symb) return true;
        if(map[0][0] == symb && map[1][0] == symb && map[2][0] == symb) return true;
        if(map[0][1] == symb && map[1][1] == symb && map[2][1] == symb) return true;
        if(map[2][0] == symb && map[1][1] == symb && map[0][2] == symb) return true;
        if(map[0][2] == symb && map[1][2] == symb && map[2][2] == symb) return true;
        return false;
    }
    protected boolean isMapFull(){
        for(int i=0; i < SIZE; i++){
            for(int j=0;j <SIZE; j++){
                if(map[i][j] == DOT_EMPTY) return false;
            }
        }
        return true;
    }
}
READ ALSO
Практика для изучения Java? [закрыт]

Практика для изучения Java? [закрыт]

Неоднократно был задан данный вопрос, исследуя его я сделал очевидные выводы :

186
Работа точки входа в java

Работа точки входа в java

Доброго времени суток коллеги!

205
Java и совместимость

Java и совместимость

Мне очень нравится нововведение в java 10 - varИ если я правильно понимаю, то вся "магия" происходит именно на этапе компиляции

168