玩家使用各自标志标记3*3网格中的某个空格,当一个玩家在网格的水平、垂直或对角线方向标记了三个相同的标记时,游戏结束,该玩家获胜。
创建一个玩井字游戏的程序,提示用户交替输入X和O标记,当收入标记时,程序在控制台上重新显示棋盘,然后确定游戏的状态(获胜、平局或继续)。
运行例子:
—————————————
| | | |
—————————————
| | | |
—————————————
| | | |
—————————————
Enter a row (0, 1, or 2) for player X: 1
Enter a column (0, 1, or 2) for player X: 1
—————————————
| | | |
—————————————
| | X | |
—————————————
| | | |
—————————————
Enter a row (0, 1, or 2) for player O: 1
Enter a column (0, 1, or 2) for player O: 2
—————————————
| | | |
—————————————
| | X | O |
—————————————
| | | |
—————————————
Enter a row (0, 1, or 2) for player X: 0
Enter a column (0, 1, or 2) for player X: 0
—————————————
| X | | |
—————————————
| | X | O |
—————————————
| | | |
—————————————
Enter a row (0, 1, or 2) for player O: 1
Enter a column (0, 1, or 2) for player O: 0
—————————————
| X | | |
—————————————
| O | X | O |
—————————————
| | | |
—————————————
Enter a row (0, 1, or 2) for player X: 2
Enter a column (0, 1, or 2) for player X: 2
—————————————
| X | | |
—————————————
| O | X | O |
—————————————
| | | X |
—————————————
X player won
Do you want to do again? (y/n): n
package pack2;
import java.util.Scanner;
public class Game {
public static void main(String[] args) {
try(Scanner input = new Scanner(System.in);) {
char flag;
do {
game(input);
System.out.print("Do you want to do again? (y/n): ");
flag = input.next().charAt(0);
}while(flag == 'y' || flag == 'Y');
}
}
/**棋盘游戏*/
public static void game(Scanner input) {
char[][] board = new char[3][3]; //棋子
char player = 'X'; //玩家
initial(board, ' '); //棋子初始置为' '
while(true) {
printboard(board); //输出棋盘
if(isWin(board, 'X') != ' ') { player = 'X'; break; }
if(isWin(board, 'O') != ' ') { player = 'O'; break; }
if(isFull(board)) break; //棋盘满时,退出循环
int row, column;
do {
System.out.print("Enter a row (0, 1, or 2) for player "+player+": ");
row = input.nextInt();
System.out.print("Enter a column (0, 1, or 2) for player "+
player+": ");
column = input.nextInt();
if(row < 0 || row > 2)
System.out.println("You should enter row from 0, 1, or" +
" 2. Enter again!");
else if(column < 0 || column > 2)
System.out.println("You should enter column from 0, " +
"1, or 2. Enter again!");
else break;
}while(true);
if(board[row][column] != ' ') { //如果棋盘已有棋子,输出信息并结束本次循环
System.out.println("Has existed "+board[row][column]+". Continue");
continue;
}else
board[row][column] = player; //空格置为棋子(X/O)
player = (player == 'X') ? 'O' : 'X'; //改变玩家
}
if(isFull(board)) //棋盘满时,输出平局
System.out.println("draw");
else //否则,输出赢家
System.out.println(player+" player won");
}
/**初始化棋盘*/
public static void initial(char[][] board, char sign) {
for (int i = 0; i < board.length; i++)
for (int j = 0; j < board[0].length; j++)
board[i][j] = sign;
}
/**输出棋盘*/
public static void printboard(char[][] board) {
for (int i = 0; i < board.length; i++) {
System.out.println(" —————————————");
for (int j = 0; j < board.length; j++)
System.out.print(" | "+board[i][j]);
System.out.println(" |");
}
System.out.println(" —————————————");
}
/**判定是否存在赢家,存在时返回赢家*/
public static char isWin(char[][] board, char player) {
for (int i = 0; i < board.length; i++)
if(board[i][0] == player && board[i][1] == player && board[i][2] == player)
return player; //某行全为player时,返回player
for (int i = 0; i < board[0].length; i++)
if(board[0][i] == player && board[1][i] == player && board[2][i] == player)
return player; //某列全为player时,返回player
if(board[0][0] == player && board[1][1] == player && board[2][2] == player ||
board[0][2] == player && board[1][1] == player && board[2][0] == player)
return player; //对角线全为player时,返回player
return ' '; //不存在赢家时,返回' '
}
/**判定是否棋盘满*/
public static boolean isFull(char[][] board) {
for (int i = 0; i < board.length; i++)
for (int j = 0; j < board.length; j++)
if(board[i][j] == ' ')
return false;
return true;
}
}