Не знаю, можно ли выкладывать такие просьбы тут, но руку мне за это не отрежут.
Моя просьба будет в том, что бы вы посмотрели и оценили читабельность и грамотность кода. Простая консольная программа крестики-нолики (и, соответственно, написали все, что вы думаете). Разбираться и тратить много времени тут не придется, так как она слишком проста, единственный минус программы (на мой взгляд) - это отсутствие как такового 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;
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Неоднократно был задан данный вопрос, исследуя его я сделал очевидные выводы :
Мне очень нравится нововведение в java 10 - varИ если я правильно понимаю, то вся "магия" происходит именно на этапе компиляции