Java Tictaoe游戏无法正确显示
好的,我正在写一个抽签游戏。我已经编写了整个程序,但我不明白为什么它不能正确显示Java Tictaoe游戏无法正确显示,java,arrays,tic-tac-toe,Java,Arrays,Tic Tac Toe,好的,我正在写一个抽签游戏。我已经编写了整个程序,但我不明白为什么它不能正确显示 import java.util.Scanner; public class TicTacToeGame { //constants for game options static final int STANDARD_GAME = 0; static final int QUIT = -1; //constants for the number of rows
import java.util.Scanner;
public class TicTacToeGame {
//constants for game options
static final int STANDARD_GAME = 0;
static final int QUIT = -1;
//constants for the number of rows and columns in a standard TicTacToe grid
static final int STANDARD_GRID_ROWS = 3;
static final int STANDARD_GRID_COLUMNS = 3;
//two dimensional array to represent a TicTacToe grid
static char[][]grid = new char[STANDARD_GRID_ROWS][STANDARD_GRID_COLUMNS];
//Scanner for input
static Scanner keyboard = new Scanner(System.in);
//***RUN STANDARD GAME******************************************************
static void runStandardGame() {
int position = QUIT;
char playerChar = 'X';
boolean isGameOver = false;
fillPosition();
System.out.println("Choose a position to play.\n");
displayGrid();
do {
System.out.print("Player " + playerChar +
" (Enter a position or " + QUIT + " to resign): ");
position = keyboard.nextInt();
System.out.println("Choose a position to play.\n");
displayGrid();
if(isWin()) {
System.out.print("\nPlayer " + playerChar +"WINS!!!\n");
isGameOver = true;
}
else if (isTie()) {
System.out.print("\nTIE.\n");
isGameOver = true;
}
else {
//switch players because one of the players has just played
//and not won;, so, it is the other player's turn
if (playerChar == 'X') {
playerChar = 'O';
}
else{
playerChar = 'X';
}
}
}while(!isGameOver && position != QUIT);
}//end of runStandardGame
//***PLAY*******************************************************************
static void play(int cell, char playerChar) {
//the player has entered a number 1 through 9 for the position they want
//to play, so, figure out which row and which column of the array this is
//For example, if the player wants to play 'X' in position 7, this means
//the 'X' must go into row 2, column 0 of the array
int row = 0;
int column = 0;
if (cell > 0 && cell <= (STANDARD_GRID_ROWS * STANDARD_GRID_COLUMNS)){
row = (cell - 1) / STANDARD_GRID_ROWS;
column = (cell - 1) % STANDARD_GRID_COLUMNS;
grid[row][column] = playerChar;
}
}
//***IS WIN*****************************************************************
static boolean isWin() {
boolean isWin = false;
if (isRowWin() || isColumnWin() || isDiagonalWin()){
isWin = true;
}
return isWin;
}
//***IS TIE*****************************************************************
static boolean isTie() {
boolean isTie = false;
if(!isRowWin() || !isColumnWin() || !isDiagonalWin()){
int count = 9;
for (int row = 0; row < 3; row ++){
for (int column = 0; column < 3; column ++){
if (grid[row][column] == 0)
count --;
}
}
if (count == 0)
{
System.out.println("\nSorry, this game is tied. Better luck next time!");
return true;
}
}
return isTie;
}
//***IS ROW WIN**********************************************************
static boolean isRowWin() {
boolean isRowWin = false;
int column = 0 ;
for (int row = 0;row < STANDARD_GRID_ROWS && !isRowWin; row++) {
//if the three array elements on the same row are equal,
//then one of the players has either three 'X's on that
//row, or three 'O's, and therefore, has won
if (grid[row][column] == grid[row][column+1] &&
grid[row][column+1] == grid[row][column+2]){
isRowWin = true;
}
}
return isRowWin;
}
//***IS COLUMN WIN**********************************************************
static boolean isColumnWin() {
boolean isColumnWin = false;
int row = 0 ;
for (int column = 0;column < STANDARD_GRID_COLUMNS && !isColumnWin; column++) {
//if the three array elements on the same row are equal,
//then one of the players has either three 'X's on that
//row, or three 'O's, and therefore, has won
if (grid[row][column] == grid[row+1][column] &&
grid[row+1][column] == grid[row+2][column]){
isColumnWin = true;
}
}
return isColumnWin;
}
//***IS DIAGONAL WIN********************************************************
static boolean isDiagonalWin() {
boolean isDiagonalWin = false;
int row = 0;
int column = 0;
if(
(grid[row][column] == grid[row+1][column+1] &&
grid[row+1][column+1] == grid[row+2][column+2])||
(grid[row][column+2] == grid[row+1][column+1] &&
grid[row+1][column+1] == grid[row+2][column])){
isDiagonalWin = true;
}
return isDiagonalWin;
}
//***GET USER CHOICE********************************************************
static int getUserChoice() {
int choice;
System.out.print("Please enter your choice: ");
choice = keyboard.nextInt();
return choice;
}
//***FILL POSITIONS*********************************************************
static void fillPosition(){
char position = '1';
for (int row = 0; row < STANDARD_GRID_ROWS; row++) {
for (int column = 0; column < STANDARD_GRID_COLUMNS; column++) {
grid[row][column] = (char) ('1' + row*STANDARD_GRID_COLUMNS + column);
}
}
}
//***DISPLAY GRID***********************************************************
static void displayGrid() {
System.out.println((grid[0][0]) + " | " + (grid[0][1]) + " | " + (grid[0][2]));
System.out.println("---------");
System.out.println((grid[1][0]) + " | " + (grid[1][1]) + " | " + (grid[1][2]));
System.out.println("---------");
System.out.println((grid[2][0]) + " | " + (grid[2][1]) + " | " + (grid[2][2]));
}
//***END********************************************************************
}//end of class
无论我选择什么,或者在哪里,它都会反复要求我做出选择……即使我会故意赢一场,或者让他们打成平局来结束比赛,但这永远不会发生……这是一个逻辑错误吗
此外,我还删除了一些我知道是正确的代码,以便更容易阅读和理解。您的fillPosition方法不正确。应该是这样的:
static void fillPosition(){
for (int row = 0; row < STANDARD_GRID_ROWS; row++) {
for (int column = 0; column < STANDARD_GRID_COLUMNS; column++) {
grid[row][column] = (char) ('1' + row*STANDARD_GRID_COLUMNS + column);
}
}
}
您正在尝试将char列与10进行比较,10是一个数字,字符“1”的ascii数大于10,因此循环正在中断fillPosition中的do while循环只执行一次。在条件行中,您正在填充位置do循环的退出条件错误 我还建议不要使用字符算术,最好使用int和integer.toStringint,但这只是我的想法
以使用复合for循环填充网格数组为例,外部开始用于行,内部开始用于列,例如是否可以缩小范围?您自己试过调试吗?您的fillPosition方法应该使用嵌套for循环。你应该给我们一些println,看看变量实际上在做什么。它的行为不像你期望的那样。好吧,我缩小了范围,删除了我知道是正确的代码,以便更容易阅读和理解。如果你告诉他建议,让他尝试正确编码,而不是被填鸭式地灌输答案,那么原始海报不是会更好吗?“谢谢!它显示正确,但现在无论我做了多少次选择或在哪里做选择,它都不会赢或打成平局?这是一个逻辑错误吗?由于位置原因,循环条件一开始是错误的
static void fillPosition(){
for (int row = 0; row < STANDARD_GRID_ROWS; row++) {
for (int column = 0; column < STANDARD_GRID_COLUMNS; column++) {
grid[row][column] = (char) ('1' + row*STANDARD_GRID_COLUMNS + column);
}
}
}
position < 10
(int)position < 10