#java
#java
Вопрос:
Я хотел бы думать, что код довольно понятен. Я начинающий программист, и для меня все выглядит нормально. Что вы должны делать в подобных ситуациях, когда все выглядит идеально, но программа работает не так, как планировалось?
Короче говоря, я прошу совета для outlook по проектам кодирования и решения вопроса о том, почему мой метод, на который я потратил более 45 минут, ничего не делает.
import java.util.Scanner;
public class TicTacToe {
public static boolean elementsAreAllEqual(char[] arr) {
for(int i = 0; i < arr.length; i ) {
if(arr[i] != arr[i 1]) {
return false;
}
}
return true;
}
public static boolean some1HasWon(char[][] g) {
char[] treE = new char[3];
// horizontal straight lines (rows of 3 alike)
for(int r = 0; r < g.length; r ) {
for(int c = 0; c < g.length; c ) {
treE[c] = g[r][c];
}
if(elementsAreAllEqual(treE)) {
return true;
}
treE = new char[3];
}
// vertical straight lines (columns of 3 alike)
for(int c = 0; c < g.length; c ) {
for(int r = 0; r < g.length; r ) {
treE[r] = g[c][r];
}
if(elementsAreAllEqual(treE)) {
return true;
}
treE = new char[3];
}
// upward diagonal
for(int i = 0; i < g.length; i ) {
treE[i] = g[g.length-i-1][i];
}
if(elementsAreAllEqual(treE)) {
return true;
}
treE = new char[3];
// downward diagonal
for(int i = 0; i < g.length; i ) {
treE[i] = g[i][i];
}
if(elementsAreAllEqual(treE)) {
return true;
}
return false;
}
public static void main(String args[]) {
char[][] grid = new char[3][3];
Scanner s = new Scanner(System.in);
System.out.println("Tic-Tac-Toen");
int goCount = 0;
char player;
boolean draw = true;
boolean end = false;
do {
if(goCount % 2 == 0) {
player = 'X';
System.out.print("'" player "', choose your location (row, column): ");
}
else {
player = 'O';
System.out.print("'" player "', choose your location (row, column): ");
}
String position = s.nextLine();
String[] p = position.split(" ");
int[] pos = {Integer.parseInt(p[0]), Integer.parseInt(p[1])};
grid[pos[0]][pos[1]] = player;
System.out.println();
for(int y = 0; y < 3; y ) {
System.out.print("t");
for(int x = 0; x < 3; x ) {
if(grid[y][x] != ' ') {
System.out.print(grid[y][x] " ");
}
else {
System.out.print(" ");
}
}
System.out.println();
}
System.out.println();
if(goCount > 4) {
if(some1HasWon(grid)) {
end = true;
}
else if(goCount >= 8) {
draw = true;
end = true;
}
}
goCount ;
}
while(end != true);
if(draw) {
System.out.println("The game was a draw.");
}
else if(goCount % 2 == 0) {
System.out.println("Player 'X' wins the game.");
}
else {
System.out.println("Player 'O' wins the game.");
}
}
}
Комментарии:
1. Вы можете использовать инструмент отладки и пройти свой код шаг за шагом.
Ответ №1:
Ваш метод elementaAreAllEqual
обращается к элементам за пределами массива, когда i = arr.length - 1
вы должны выполнять итерацию только до arr.length - 1
.
public static boolean elementsAreAllEqual(char[] arr) {
for(int i = 0; i < arr.length - 1; i ) {
if(arr[i] != arr[i 1]) {
return false;
}
}
return true;
}
Ваша инициализация draw = true
является причиной, по которой вы каждый раз получаете ничью. Независимо от результата some1HasWon
переменной draw
всегда true
.
if(goCount > 4) {
if(some1HasWon(grid)) {
end = true;
draw = false;
} else if(goCount >= 8) {
draw = true;
end = true;
}
}