JAVA游戏——双人井字棋

JAVA游戏——双人井字棋

import java.util.Scanner;

public class Programming2 {
    // 建立可存入位置的数组
	static int[][] x=new int[3][3];
	static int[][] o=new int[3][3];
	
	public static void main (String [] args)
	{	
		int i=0;
		//如果没有用户取得胜利或下满整个棋盘则游戏继续
		while(checkForWin(x)==false&&checkForWin(o)==false&&i<9) {		
		//玩家x下棋(默认第一个玩家为x)
		Scanner sc=new Scanner(System.in);
		//提醒玩家输入行数
		System.out.println("Player x-Input the row: ");
		int a=sc.nextInt();
		Scanner sc2=new Scanner(System.in);
		//提醒玩家输入列数
		System.out.println("Player x-Input the column: ");
		int b=sc2.nextInt();
		//调用方法检验输入是否合法,合法则打印,不合法则再次输入
		if(checkValidPosition(x,o,a,b)==true) {
			x[a-1][b-1]=1;
			displayBoard (x,o);
		}
		else main (args);
		if(checkForWin(x)==true) {
			System.out.println("Player x wins!");
			break;
		}
		i++;
		//若棋盘下满无玩家胜利,则平局
		if(i==9) {
			System.out.println("A draw!");
			break;
		}
		
		//玩家o下棋
		boolean bool=false;
		while(bool==false) {
		Scanner sc3=new Scanner(System.in);
		System.out.println("Player o-Input the row: ");
		int a2=sc3.nextInt();
		Scanner sc4=new Scanner(System.in);
		System.out.println("Player o-Input the column: ");
		int b2=sc4.nextInt();
		//调用方法检验输入是否合法,合法则打印,不合法则再次输入
		if(checkValidPosition(x,o,a2,b2)==true) {
			o[a2-1][b2-1]=1;
			displayBoard(x,o);
			bool=true;
		}
		else bool=false;
		if(checkForWin2(o)==true) {
			System.out.println("Player o wins!");
            break;
		}
		}
		i++;
		}
	}

    //检测玩家x是否取得胜利
	public static boolean checkForWin (int[][]x)
	{
		boolean b=false;
		int sum1=0;
		int sum2=0;
		int sum3=0;
		int sum4=0;
		int sum5=0;
		int sum6=0;
		int sum7=0;
		int sum8=0;		
		//Player x
		for(int j=0;j<3;j++) {
			//左上到右下的对角线
			if(x[j][j]!=0) sum1+=1;	
			//右上到左下的对角线
			if(x[j][2-j]!=0)sum2+=1;
			//列
			if(x[0][j]!=0)sum3+=1;
			if(x[1][j]!=0)sum4+=1;
			if(x[2][j]!=0)sum5+=1;
			//行
			if(x[j][0]!=0)sum6+=1;
			if(x[j][1]!=0)sum7+=1;
			if(x[j][2]!=0)sum8+=1;
		}
	    //判断是否已经胜利(三子一线)
		if(sum1==3||sum2==3||sum3==3||sum4==3||sum5==3||sum6==3||sum7==3||sum8==3){
                b=true;
            }
		return b;
	}

    //检测玩家o是否取得胜利	
	public static boolean checkForWin2(int[][]o)
	{
		boolean b=false;
		int sum1=0;
		int sum2=0;
		int sum3=0;
		int sum4=0;
		int sum5=0;
		int sum6=0;
		int sum7=0;
		int sum8=0;		
		//Player o
		for(int j=0;j<3;j++) {
		    //左上到右下的对角线
			if(o[j][j]!=0) sum1+=1;	
			//右上到左下的对角线
			if(o[j][2-j]!=0)sum2+=1;
			//列
			if(o[0][j]!=0)sum3+=1;
			if(o[1][j]!=0)sum4+=1;
			if(o[2][j]!=0)sum5+=1;
			//行
			if(o[j][0]!=0)sum6+=1;
			if(o[j][1]!=0)sum7+=1;
			if(o[j][2]!=0)sum8+=1;
		}
		//判断是否已经胜利(三子一线)
		if(sum1==3||sum2==3||sum3==3||sum4==3||sum5==3||sum6==3||sum7==3||sum8==3){
                b=true;
            }
		return b;
	}
	
	//创建棋盘和录入玩家下棋位置
	public static void displayBoard (int[][]x,int[][]o)
	{
		for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                if(x[i][j]==1) System.out.print("x|");
                else if(o[i][j]==1) System.out.print("o|");
                else System.out.print(" |");
            }
            System.out.println();
        }
	}

    //检测用户输入是否合理
	public static boolean checkValidPosition (int[][]x,int[][]o,int a,int b)
	{
		boolean boo=true;
		//如果用户输入超出井字棋格或不是整型则返回false
		if(a>3||a<1||b<1||b>3||a%1!=0||b%1!=0) {
			System.out.println("Not Valid! Please input aganin!");
			boo=false;
		}
		//如果用户输入重复则返回false
		else if(x[a-1][b-1]+o[a-1][b-1]>0) {
			System.out.println("Repetitive! Please input aganin!");
			boo=false;
		}
		return boo;
	}
}

代码中有些冗余的方法、编码重复,继续努力学习改进!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值