Проблемы с получением игры TicTacToe для запуска Java
Моим заданием было создать игру в крестики-нолики, которая позволила бы Х играть против компьютера. Она хотела, чтобы ходы игрока и компьютера были недействительными, победителем чека было бы int, а также печатной доской и доской инициализации. Я не думаю, что встретил их всех, но я просто хочу, чтобы он работал и действительно выводил правильно. Это мой первый год в компьютерной науке тоже. По большей части, я думаю, что моя логика работает, это только для метода перемещения компьютера, я был озадачен тем, как получить случайные перемещения в массиве 3x3, так что это может быть совершенно бессмысленным. Моя проблема заключается в основном методе, пытающемся использовать цикл do.. while, чтобы позволить компьютеру отображать движение. Предполагается, что мой метод machineTurn является пустым, но ошибка говорит о том, что он должен быть int. Я не уверен, что сейчас не так, но я некоторое время изучал этот код. Я прокомментировал многое из этого. моя ошибка:
Java:58: ошибка: несовместимые типы
move = machineTurn(theSeed);
требуется: int
найдено: пустота
1 ошибка
Процесс завершен.
import java.util.*;
public class TTT
{
public static final int EMPTY = 0;
public static final int COMPUTER = 2;
public static final int NONE = 0;
public static final int USER = 1;
public static final int theSeed = 0;
// Name-constants to represent the various states of the game
public static final int PLAYING = 0;
public static final int DRAW = 1;
public static final int USER_WON = 2;
public static final int COMPUTER_WON = 3;
// The game board and the game status
public static final int ROWS = 3, COLS = 3; // number of rows and columns
public static int[][] board = new int[ROWS][COLS]; // game board in 2D array
// containing (EMPTY, CROSS, NOUGHT)
public static int currentState; // the current state of the game
// (PLAYING, DRAW, CROSS_WON, NOUGHT_WON)
public static int currentPlayer; // the current player (CROSS or NOUGHT)
public static int currentRow, currentCol; // current seed's row and column
public static Scanner in = new Scanner(System.in); // the input Scanner
public static void main(String[] args)
{
int move;
int winner;
initBoard();
printBoard();
// play the game once
do{
yourTurn(currentPlayer);
machineTurn(theSeed);
updateGame(currentPlayer, currentRow, currentCol);
printBoard();
//print message if game-over
if (currentState == USER_WON)
{
System.out.println(" You won! You beat the computer! Congratulations!");
}
else if ( currentState == COMPUTER_WON)
{
System.out.println(" You lost! The Computer Beat you! Sorry! ");
}
else if ( currentState == DRAW)
{
System.out.println(" No One won! It's a draw! ");
}
//switch player
currentPlayer = (currentPlayer == USER) ? COMPUTER : USER;
if( currentPlayer == COMPUTER)
{
move = machineTurn(theSeed);
System.out.println("Computer move: " + move);
}
}while( currentState == PLAYING); //repeat if not game over
}
//initialize game board contents
public static void initBoard()
{
for (int row = 0; row < ROWS; ++row)
{
for (int col = 0; col < COLS; ++col)
{
board[row][col] = EMPTY; // all cells empty
}
}
}
public static void printBoard()
{
for (int row = 0; row < ROWS; ++row)
{
for (int col = 0; col < COLS; ++col)
{
printCell(board[row][col]); // print each of the cells
if (col != COLS - 1)
{
System.out.print("|"); // print vertical partition
}
}
System.out.println();
if (row != ROWS - 1)
{
System.out.println("-----------"); // print horizontal partition
}
}
System.out.println();
}
public static void printCell(int content) {
switch (content) {
case EMPTY: System.out.print(" "); break;
case COMPUTER: System.out.print(" O "); break;
case USER: System.out.print(" X "); break;
}
}
public static boolean checkWinner(int theSeed, int currentRow,int currentCol)
{
return (board[currentRow][0] == theSeed // 3-in-the-row
&& board[currentRow][1] == theSeed
&& board[currentRow][2] == theSeed
|| board[0][currentCol] == theSeed // 3-in-the-column
&& board[1][currentCol] == theSeed
&& board[2][currentCol] == theSeed
|| currentRow == currentCol // 3-in-the-diagonal
&& board[0][0] == theSeed
&& board[1][1] == theSeed
&& board[2][2] == theSeed
|| currentRow + currentCol == 2 // 3-in-the-opposite-diagonal
&& board[0][2] == theSeed
&& board[1][1] == theSeed
&& board[2][0] == theSeed);
}
public static boolean isDraw()
{
for (int row = 0; row < ROWS; row++)
{
for (int col = 0; col < COLS; col++)
{
if (board[row][col] == EMPTY)
{
return false; //an empty cell found, not draw, exit
}
}
}
return true; //no empty cell, it's draw
}
/* Player with the "theSeed" makes one move, with input validation.
Update global variables "currentRow" and "currentCol". */
public static void yourTurn(int theSeed)
{
boolean validInput = false;
do {
if (theSeed == USER)
{
System.out.print("Player 'X', enter your move (row[1-3] column[1-3]): ");
}
int row = in.nextInt() - 1; // array index starts at 0 instead of 1
int col = in.nextInt() - 1;
if (row >= 0 && row < ROWS && col >= 0 && col < COLS && board[row][col] == EMPTY) {
currentRow = row;
currentCol = col;
board[currentRow][currentCol] = theSeed; // update game-board content
validInput = true; // input okay, exit loop
} else {
System.out.println("This move at (" + (row + 1) + "," + (col + 1)
+ ") is not valid. Try again...");
}
} while (!validInput); // repeat until input is valid
}
/* supposed to be machine's random move after USER has gone */
public static void machineTurn(int theSeed)
{
int move = (int)(Math.random()*9);
boolean validInput = false;
do{
if(theSeed == COMPUTER);
{
board[(int)(move/3)][move%3] = currentPlayer;
}
int row = in.nextInt() - 1; // array index starts at 0 instead of 1
int col = in.nextInt() - 1;
if (row >= 0 && row < ROWS && col >= 0 && col < COLS && board[row][col] == EMPTY) {
currentRow = row;
currentCol = col;
board[currentRow][currentCol] = theSeed; // update game-board content
}
}while(validInput = true); // input okay, exit loop
}
public static void updateGame(int theSeed, int currentRow, int currentCol)
{
if(checkWinner(theSeed, currentRow,currentCol))
{
currentState = (theSeed == USER) ? USER_WON : COMPUTER_WON;
}
else if (isDraw()) //check for draw
{
currentState = DRAW;
}
}
//otherwise, no change to currentState (Still PLAYING)
}
Кроме того, для дополнительного кредита, мы должны создать метод, который не позволяет игроку выиграть. Это может быть ничья, но компьютер всегда побеждает. Может кто-нибудь дать мне подсказку о том, как начать кодировать это? Я назову эту машину SmartMode.
2 ответа
Ваш статический метод machineTurn
является void
, но вы пытаетесь присвоить результат int
, Там нет результата.
Вы объявляете переменную move
с типом int
ваш основной метод. Тогда вы пытаетесь запустить machineTurn
метод и установите его результат в move
переменная. Но методs result and variable type is incompatibe -
недействительнымcan
не может быть представлен как int
, Компилятор так сказать.
Вы должны изменить подпись machineTurn метода, чтобы вернуть int
public static int machineTurn(int theSeed)
Не забудьте изменить реализацию так, чтобы она возвращала значение только что сделанного вами хода.