简单井字棋(Java)

井字棋:

判断其中是否存在某一方获胜,获胜的条件是存在整行或整列或整条对角线或整条反对角线上是相同的棋子。如果存在,则输出代表获胜一方字母:X或O(大写字母X或O);如果没有任何一方获胜,则输出平局。


主要思路:

     将棋盘看做一个对象,将下棋的人,看做是两个属性,不论人怎么下,改变的是棋盘的状态,所以只需要维护好棋盘的状态就行,至于怎么判断是谁下,用一个静态常亮表示

 

//代码如下

 

 

//井字棋游戏
import java.util.Scanner;               //输入
import javax.swing.JOptionPane;        //窗口组件---不用管

class Exp_Game
{
	//静态成员可以不用实例化,就可以在类中的任意位置使用
	private static char[][] table = new char[3][3];	//棋盘
	final static int player1 = 0;				//玩家1 用O
	final static int player2 = 1;				//玩家2 用X

//主函数
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);

		initTable();			//初始化棋盘

		int host = player1;		//下棋者
		do{
			++host;
			host %= 2;
			drawTable();

			System.out.println((host == player1 ? "player1" : "player2") 
				+ "---" + (host == player1 ? "O" : "X")
				+ ", 输入位置(,):");
			System.out.printf("Row:");
			int i = input.nextInt();
			System.out.printf("Col:");
			int j = input.nextInt();

			write(host, i - 1, j - 1);

			if(judge(host))					//如果赢得比赛,就打印棋盘状态
				drawTable();

		}while(!judge(host));
		//if(host == player1)
		JOptionPane.showMessageDialog(null, (host == player1 ? "player1" : "plaer2")
				+ "赢得了比赛", "TIP", JOptionPane.INFORMATION_MESSAGE);

	}

	//初始化棋盘
	public static void initTable()
	{
		for(int i = 0; i < table.length; ++i)
			for(int j = 0; j < table[i].length; ++j)
				table[i][j] = ' ';
	}

	//画棋盘
	public static void drawTable(){
		for(int i = 0; i < table.length; ++i){
			for(int j = 0; j < table[i].length; ++j)
				System.out.printf("| %c", table[i][j]);
			System.out.printf("|\n");
			System.out.println("|--|--|--|-");
		}
	}

	//下棋
	public static void write(int player, int i, int j){
		Scanner input = new Scanner(System.in);

		if(i < 0 || j < 0 || i >= 3 || j >= 3 
			|| table[i][j] == 'O' || table[i][j] == 'X'){
			System.out.println("输入错误!");
			do{
				System.out.println(">>>请重新输入位置!");
				System.out.println("Enter row:");
				i = input.nextInt();
				System.out.println("Enter col:");
				j = input.nextInt();
				
			}while(i < 0 || j < 0 || i >= 3 || j >= 3 
				|| table[i][j] == 'O' || table[i][j] == 'X');			//不能越界且不能在已有位置下
		}

		//判断是谁在下
		table[i][j] = (player == player1) ? 'O' : 'X';
	}

	//判断下了(i,j)位置之后, 棋盘的状态是否是一个赢的状态 -- 要传入是谁在下
	public static boolean judge(int play){
		char ch;
		if(play == player1)
			ch = 'O';
		else
			ch = 'X';

		int row = 0;
		int col = 0;
		int line_main = 0;		//主对角线
		int line_sub = 0;		//次对角线

		for(int i = 0; i < 3; ++i){
			//检查主对角线
			if(table[i][i] == ch)
				line_main++;

			//检查次对角线
			if(table[i][2 - i] == ch)
				line_sub++;
		}
		
		//检查行
		for(int i = 0; i < 3; ++i){
			for(int j = 0; j < 3; ++j)		//每一行
				if(table[i][j] == ch)
					row++;
			if(row == 3)
				break;
			else
				row = 0;					//统计下一行前先将row归为0
		}

		//同理检查列
		for(int i = 0; i < 3; ++i){
			for(int j = 0; j < 3; ++j)
				if(table[j][i] == ch)
					col++;
			if(col == 3)
				break;
			else
				col = 0;					//同理
		}

		if(row == 3 || col == 3 || line_main == 3 || line_main == 3)
			return true;
		else
			return false;
	}//end of judge
}//end of class  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值