JAVA-五子棋训练任务-练习

JAVA-五子棋训练任务-练习

简介:
学习java的第7天。
主要加强了使用二重数组的能力,同时再次巩固了各种循环语句的运用水平,在研究沿左上五子赢法和沿右上五子赢法上浪费了不少时间,反思后觉得还是写的代码太少了,经验过于贫乏。
任务要求:
在这里插入图片描述
代码部分:

public static void main(String[] args) {
		//建立五子棋双重数组
		int[][] chess = new int[16][16];		
		//建立输入变量
		Scanner input = new Scanner(System.in);
		//建立校正X,Y范围是否合理的变量
		int x;
		int y;
		//建立黑方和白方的X,Y轴数据变量
		int blackYInput = 0;
		int blackXInput = 0;
		int whiteYInput = 0;
		int whiteXInput = 0;
		//建立连续棋子的数目变量
		int nums = 1;
		//对边框进行轴叙述
		for(int i = 0;i<16;i++) {
			chess[0][i]=i;
			chess[i][0]=i;
		}
		//对初始棋盘进行归零处理
		for(int i = 1;i<16;i++) {
			for(int j =1;j<16;j++) {
				chess[i][j]=0;
			}
		}
		//游戏开始
		System.out.println("游戏开始!");
		//打印出棋盘
		for(int i = 0;i<16;i++) {
			for(int j =0;j<16;j++) {
				if((i==0&&j>=10)||(i>=10&&j==0)) {
					System.out.print(chess[i][j]+" ");
				}else {
					System.out.print(chess[i][j]+"  ");
				}
			}
			System.out.println("");
		}
		//建立回合变量step
		int step = 1;
		//开始回合循环
	win:do {		
			/*
			 * 分别输入进黑方X和Y的值,并对相应值得数组进行赋值“1”操作
			 * 同时,加入了输入数字超出数字范围的警告循环,尽量更加贴近现实。
			 */
			System.out.println("请黑方输入x坐标");			
			x = input.nextInt();
			if(x<1||x>15) {
				for(;x<1||x>15;) {
					System.out.println("超出范围!请黑方重新输入X坐标");
					x = input.nextInt();
				}
			}
			blackXInput = x;
			System.out.println("请黑方输入y坐标");
			y = input.nextInt();
			if(y<1||y>15) {
				for(;y<1||y>15;) {
					System.out.println("超出范围!请黑方重新输入Y坐标");
					y = input.nextInt();
				}
			}
			blackYInput = y;
			
			
			/*
			 * 注:此处设有同一个位置下两个棋子的故障检测系统,
			 * 	    若同一位置先前有棋子,则会报错要求重新输入。
			 */
			for(;chess[blackYInput][blackXInput]==1||chess[blackYInput][blackXInput]==2;) {
				System.out.println("重复!请黑方重新输入X坐标");
				blackXInput = input.nextInt();
				System.out.println("重复!请黑方重新输入y坐标");
				blackYInput = input.nextInt();
			}			
			chess[blackYInput][blackXInput]=1;
			//赋值后进行打印操作
			for(int i = 0;i<16;i++) {
				for(int j =0;j<16;j++) {
					if((i==0&&j>=10)||(i>=10&&j==0)) {
						System.out.print(chess[i][j]+" ");
					}else {
						System.out.print(chess[i][j]+"  ");
					}
				}
				System.out.println("");
			}
			//判断黑方是否赢
			//横向五个连续棋子
			for(int i = 1;i<16;i++) {
				for(int j =1;j<15;j++) {
					if(chess[i][j]==1&&chess[i][j+1]==1) {
						nums++;
						if(nums == 5) {
							System.out.println("黑子胜!");
							break win;
						}	
					}else {
						nums = 1;
					}													
				}
			}
			nums = 1;
			//纵向五个连续棋子
			for(int j = 1;j<16;j++) {
				for(int i =1;i<15;i++) {
					if(chess[i][j]==1&&chess[i+1][j]==1) {
						nums++;
						if(nums == 5) {
							System.out.println("黑子胜!");
							break win;
						}	
					}else {
						nums = 1;
					}													
				}
			}
			nums = 1;			
			//右上斜5个棋子
			for (int i = 1; i < 15; i++) {
				for (int j = 1; j < 16 ; j++) {
			  judge:for(int k = 1;k<5;k++) {
						if((j-k)>0&&(i+k)<16) {
							if(chess[j][i]==1&&chess[j-k][i+k]==1) {
								nums++;
							}else {
								nums=1;
								break judge;}							
						}else break judge;
					}
					if(nums==5) {
								System.out.println("黑子胜!");
								break win;
					}
				}					
			}	
			nums = 1;
			//左上斜五个棋子
			for (int i = 1; i < 15; i++) {
				for (int j = 1; j < 16 ; j++) {
			  judge:for(int k = 1;k<5;k++) {
						if((j-k)>0&&(i-k)>0) {
							if(chess[j][i]==1&&chess[j-k][i-k]==1) {
								nums++;
							}else {
								nums=1;
								break judge;}							
						}else break judge;
					}
					if(nums==5) {
								System.out.println("黑子胜!");
								break win;
					}
				}					
			}			
			/*
			 * 
			 * 黑白分割线
			 * 
			 */
			/*
			 * 分别输入进白方X和Y的值,并对相应值得数组进行赋值“2”操作
			 * 同时,加入了输入数字超出数字范围的警告循环,尽量更加贴近现实。
			 */
			System.out.println("请白方输入X坐标");
			x = input.nextInt();
			if(x<1||x>15) {
				for(;x<1||x>15;) {
					System.out.println("超出范围!请白方重新输入X坐标");
					x = input.nextInt();
				}				
			}
			whiteXInput = x;
			
			System.out.println("请白方输入Y坐标");
			y = input.nextInt();
			if(y<1||y>15) {
				for(;y<1||y>15;) {
					System.out.println("超出范围!请白方重新输入Y坐标");
					y = input.nextInt();
				}
			}
			whiteYInput = y;
			/*
			 * 注:此处设有同一个位置下两个棋子的故障检测系统,
			 * 	    若同一位置先前有棋子,则会报错要求重新输入。
			 */
			for(;chess[whiteYInput][whiteXInput]==1||chess[whiteYInput][whiteXInput]==2;) {
				System.out.println("重复!请白方重新输入X坐标");
				whiteXInput = input.nextInt();
				System.out.println("重复!请白方重新输入Y坐标");
				whiteYInput = input.nextInt();
			}
			chess[whiteYInput][whiteXInput]=2;
			//赋值后进行打印操作
			for(int i = 0;i<16;i++) {
				for(int j =0;j<16;j++) {
					if((i==0&&j>=10)||(i>=10&&j==0)) {
						System.out.print(chess[i][j]+" ");
					}else {
						System.out.print(chess[i][j]+"  ");
					}
				}
				System.out.println("");
			}
			//判断白方是否赢
			//横向五个连续棋子
			for(int i = 1;i<16;i++) {
				for(int j =1;j<15;j++) {
					if(chess[i][j]==2&&chess[i][j+1]==2) {
						nums++;
						if(nums == 5) {
							System.out.println("白子胜!");
							break win;
						}	
					}else {
						nums = 1;
					}													
				}
			}
			nums = 1;
			//纵向五个连续棋子
			for(int j = 1;j<16;j++) {
				for(int i =1;i<15;i++) {
					if(chess[i][j]==2&&chess[i+1][j]==2) {
						nums++;
						if(nums == 5) {
							System.out.println("白子胜!");
							break win;
						}	
					}else {
						nums = 1;
					}													
				}
			}
			nums = 1;			
			//右上斜5个棋子
			for (int i = 1; i < 15; i++) {
				for (int j = 1; j < 16 ; j++) {
			  judge:for(int k = 1;k<5;k++) {
						if((j-k)>0&&(i+k)<16) {
							if(chess[j][i]==2&&chess[j-k][i+k]==2) {
								nums++;
							}else {
								nums=1;
								break judge;}							
						}else break judge;
					}
					if(nums==5) {
								System.out.println("白子胜!");
								break win;
					}
				}					
			}	
			nums = 1;
			//左上斜五个棋子
			for (int i = 1; i < 15; i++) {
				for (int j = 1; j < 16 ; j++) {
			  judge:for(int k = 1;k<5;k++) {			  		
						if((j-nums)>0&&(i-nums)>0) {								
							if((chess[j][i]==2)&&(chess[j-nums][i-nums]==2)) {	
								nums++;						
								
							}else {
								nums=1;
								break judge;}							
						}else break judge;
					}
					if(nums==5) {
								System.out.println("白子胜!");
								break win;
					}
				}					
			}
			//一回合结束,step+1
			step++;
		}while(step<112); 
		/*
		*注:因为共有15*15=225个棋子位,一轮下来黑方和白方共下两个棋子,
		*	  故准备(15*15)/2=112个回合。
		*/
	}

运行结果:
注释:黑子胜截图
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值