Java、井字游戏

        玩家使用各自标志标记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;
	}
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值