运用二维数组与for循环结合——实现控制台版并支持双人对战的五子棋游戏

要求:
(1)绘制棋盘
(2)提示黑方(用 1 表示)和白方(用 2 表示)分别下棋(X,Y 轴位
置)并重新绘制棋盘。
(3)每当一方下棋后判断是否获胜 。
(4)提示:采用二维数组来模拟棋盘。
在这里插入图片描述

总体思路:

  1. 利用二维数组创建棋盘,默认值为0,黑方下棋置为1,白方下棋置为2,在玩家每次下棋之前判断数组在横、竖、斜这三个方向上连续排列的棋子达到五个。
  2. 整个过程使用while循环持续提示玩家下棋,玩家每次下棋之后都打印棋盘出来供玩家观看(先判断其中一方是否获胜,再打印棋盘),直到其中一方获胜后,跳出循环,打印获胜结果。

如何判断一方获胜,执行“跳出循环操作”?

  1. 当其中一方没有棋时。
  2. 当棋盘中任意一方在横、竖、左斜、右斜这四个方向上连续排列的棋子达到五个时。

如何判断其中一方在横、竖、斜这三个方向上连续排列的棋子达到五个?

  • 横:使用for循环遍历二维数组中第二个数组,如:nums[i][j]、nums[i][j+1]…
    将二维数组的每行数据分割成一组5个,外层循环5个5个依次遍历下去,内层循环1个1个一次遍历下去。当nums[i][j]==1 || nums[i][j]==j时,内层循环+1(继续遍历下一个);当nums[i][j]!=1 && nums[i][j]!=2时,外层循环范围+1(继续遍历下一组)。每次遍历均判断每一个值是否为1(黑方)或2(白方)。
  • 竖:使用for循环遍历二维数组中第一个数组,如:nums[i][j]、nums[i+1][j]…
    【判断流程与横向的判断一样】
  • 左斜:使用for循环遍历联合二维数组中第一个第二个数组,如:nums[i][j]、nums[i+1][j+1]…
    nums[i+1][j]、nums[i+2][j+1]…
    【判断流程与横向的判断一样】
  • 右斜:使用for循环遍历联合二维数组中第一个第二个数组,如:
    nums[nums.length-1][nums.length-1]、nums[nums.length-1-1][nums.length-1-1]…
    nums[nums.length-1-1][nums.length-1]、nums[nums.length-1-2][nums.length-1-1]…
    【判断流程与横向的判断一样】
    在这里插入图片描述

java源码

package pers.sheng.demo;

import java.util.Arrays;
import java.util.Scanner;

public class Demo {

	public static void main(String[] args) {
	
		int x,y;//棋盘坐标
		int whitePiecesNum = 112;//白方棋子总数
		int blackPiecesNum = 112;//黑方棋子总数
		int[][] checkerBoard= {
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
		};
		
		int success = 0;
		while(true) {
//			判断胜出者
			if(blackPiecesNum==0 && whitePiecesNum==0) {
				System.out.println("---------------------------------------游戏结束,双方平局");
				showBoard(checkerBoard);
				break;
			}else if(blackPiecesNum==0||rightOblique(checkerBoard)==2||leftOblique(checkerBoard)==2||landscape(checkerBoard)==2||vertical(checkerBoard)==2) {
				System.out.println("---------------------------------------游戏结束,白方获胜");
				showBoard(checkerBoard);
				success = 2;
				break;
			}else if(whitePiecesNum==0||rightOblique(checkerBoard)==1||leftOblique(checkerBoard)==1||landscape(checkerBoard)==1||vertical(checkerBoard)==1) {
				System.out.println("---------------------------------------游戏结束,黑方获胜");
				showBoard(checkerBoard);
				success = 1;
				break;
			}
			Scanner input = new Scanner(System.in);
//			白方下棋
			if(success!=1) {
				showBoard(checkerBoard);
				System.out.println("请白方下棋(输入棋盘坐标x,y):");
				x = input.nextInt()-1;
				y = input.nextInt()-1;
				checkerBoard[x][y] = 2;
				whitePiecesNum--;
			}else {
				break;
			}
			
//			判断胜出者
			if(blackPiecesNum==0 && whitePiecesNum==0) {
				System.out.println("---------------------------------------游戏结束,双方平局");
				showBoard(checkerBoard);
				break;
			}else if(blackPiecesNum==0||rightOblique(checkerBoard)==2||leftOblique(checkerBoard)==2||landscape(checkerBoard)==2||vertical(checkerBoard)==2) {
				System.out.println("---------------------------------------游戏结束,白方获胜");
				showBoard(checkerBoard);
				success = 2;
				break;
			}else if(whitePiecesNum==0||rightOblique(checkerBoard)==1||leftOblique(checkerBoard)==1||landscape(checkerBoard)==1||vertical(checkerBoard)==1) {
				System.out.println("---------------------------------------游戏结束,黑方获胜");
				showBoard(checkerBoard);
				success = 1;
				break;
			}
	
//			黑方下棋
			if(success!=2) {
				showBoard(checkerBoard);
				System.out.println("请黑方下棋(输入棋盘坐标x,y):");
				x = input.nextInt();
				y = input.nextInt();
				checkerBoard[x-1][y-1] = 1;
				blackPiecesNum--;
			}else {
				break;
			}	
		}
	}
//	横向
//	判断横向是否连续排列的棋子达到五个
	public static int landscape(int[][] checkerBoard) {
//		判断白方在横向是否连续排列的棋子达到五个
		for(int i=0,key=0,sum=0;i<15;i++) {
					for(int j=sum;j<sum+5;j++) {
						if(checkerBoard[i][j]==2) {
							key++;
							if(key==5) {
								return 2;
							}else {
								if(sum!=14) {
									sum++;
								}else{
									sum=0;
								}
							}
						}else {
							key=0;
							if(sum!=14) {
								sum++;
							}else{
								sum=0;
							}
						}
					}
				}
//		判断黑方在横向是否连续排列的棋子达到五个
		for(int i=0,key=0,sum=0;i<15;i++) {
			for(int j=sum;j<sum+5;j++) {
				if(checkerBoard[i][j]==1) {
					key++;
					if(key==5) {
						return 1;
					}else {
						if(sum!=14) {
							sum++;
						}else{
							sum=0;
						}
					}
				}else {
					key=0;
					if(sum!=14) {
						sum++;
					}else{
						sum=0;
					}
				}
			}
		}
		return 3;
		
	}
//	判断竖向是否连续排列的棋子达到五个
//	竖向
	public static int vertical(int[][] checkerBoard) {
//		判断白方在竖向是否连续排列的棋子达到五个
		for(int i=0,sum=0,key=0;i<15;i++) {
					for(int j=sum;j<sum+5;j++) {
						if(checkerBoard[j][i]==2) {
							key++;
							if(key==5) {
								return 2;
							}else {
								if(sum!=14) {
									sum++;
								}else{
									sum=0;
								}
							}
						}else {
							key=0;
							if(sum!=14) {
								sum++;
							}else{
								sum=0;
							}
						}
					}
				}
//		判断黑方在竖向是否连续排列的棋子达到五个
		for(int i=0,sum=0,key=0;i<15;i++) {
			for(int j=sum;j<sum+5;j++) {
				if(checkerBoard[j][i]==1) {
					key++;
					if(key==5) {
						return 1;
					}else {
						if(sum!=14) {
							sum++;
						}else{
							sum=0;
						}
					}
				}else {
					key=0;
					if(sum!=14) {
						sum++;
					}else{
						sum=0;
					}
				}
			}
		}
		return 3;
	}
//	判断左斜是否连续排列的棋子达到五个
//	左斜
	public static int leftOblique(int[][] checkerBoard) {
//		判断白方在左斜是否连续排列的棋子达到五个
//		左下角
		for(int leftSum=10;leftSum>=0;leftSum--) {
			for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
				x = leftSum+y;
				if(checkerBoard[x][y]==2) {
					key++;
					if(key==5) {
						return 1;
					}
				}else {
						key=0;
						if(5+next<15-leftSum) {
							next++;
						}else {
							next=0;	
						}
				}
			}
		}
//		右上角
		for(int leftSum=10;leftSum>=0;leftSum--) {
			for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
				x = leftSum+y;
				if(checkerBoard[y][x]==2) {
					key++;
					if(key==5) {
						return 1;
					}
				}else {
						key=0;
						if(5+next<15-leftSum) {
							next++;
						}else {
							next=0;	
						}
				}
			}
		}
					
//		判断黑方在左斜是否连续排列的棋子达到五个
//		左下角
		for(int leftSum=10;leftSum>=0;leftSum--) {
			for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
				x = leftSum+y;
				if(checkerBoard[x][y]==1) {
					key++;
					if(key==5) {
						return 1;
					}
				}else {
						key=0;
						if(5+next<15-leftSum) {
							next++;
						}else {
							next=0;	
						}
				}
			}
		}
//		右上角
		for(int leftSum=10;leftSum>=0;leftSum--) {
			for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
				x = leftSum+y;
				if(checkerBoard[y][x]==1) {
					key++;
					if(key==5) {
						return 1;
					}
				}else {
						key=0;
						if(5+next<15-leftSum) {
							next++;
						}else {
							next=0;	
						}
				}
			}
		}
		
		return 3;
	}
//	判断右斜是否连续排列的棋子达到五个
//	右斜
	public static int rightOblique(int[][] checkerBoard) {
//		判断白方在右斜是否连续排列的棋子达到五个
//		左上角
		for(int leftSum=4;leftSum<15;leftSum++) {
			for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
				x = leftSum-y;
				if(checkerBoard[x][y]==2) {
					key++;
					if(key==5) {
						return 2;
						
					}
				}else {
						key=0;
						if(5+next<leftSum+1) {
							next++;
						}else {
							next=0;	
						}
				}
			}
		}
//		右下角
		for(int leftSum=10;leftSum>=0;leftSum--) {
			for(int next=14,x=next,y=leftSum,key=0;x>next-5;x--) {
				for(;y<=14;) {
					if(checkerBoard[x][y]==2) {
						key++;
						if(key==5) {
							return 2;
						}
						y++;
						break;
					}else {
							key=0;
							if(5+next<15-leftSum) {
								next--;
							}else {
								next=0;	
							}
							y++;
							break;
					}
				}
				
			}
		}
					
//		判断黑方在右斜是否连续排列的棋子达到五个
//		左上角
		for(int leftSum=4;leftSum<15;leftSum++) {
			for(int y=0,x=0,next=0,key=0;y<next+5;y++) {
				x = leftSum-y;
				if(checkerBoard[x][y]==1) {
					key++;
					if(key==5) {
						return 1;
					}
				}else {
						key=0;
						if(5+next<leftSum+1) {
							next++;
						}else {
							next=0;	
						}
				}
			}
		}
//		右下角
		for(int leftSum=10;leftSum>=0;leftSum--) {
			for(int next=14,x=next,y=leftSum,key=0;x>next-5;x--) {
				for(;y<=14;) {
					if(checkerBoard[x][y]==1) {
						key++;
						if(key==5) {
							return 1;
						}
						y++;
						break;
					}else {
							key=0;
							if(5+next<15-leftSum) {
								next--;
							}else {
								next=0;	
							}
							y++;
							break;
					}
				}
				
			}
		}
		return 3;
	}
//	打印棋盘
//	打印棋盘
	public static void showBoard(int[][] checkerBoard) {
		for(int i=0;i<15;i++) {//行
			if(i==0) {
				System.out.print("00"+"|"+(i+1)+"");
			}else if(i==14) {
				System.out.print("|"+(i+1)+"|");
			}else if(i>8) {
				System.out.print("|"+(i+1));
			}else {
				System.out.print("|"+(i+1));
			}
		}
		System.out.println();
		
		for(int i=0;i<15;i++) {
		 if(i<9) {
				System.out.print("0"+(i+1));
			}else {
				System.out.print((i+1));
			}
			for(int j=0;j<15;j++) {//列
				if(j==0) {
					System.out.print("|"+checkerBoard[i][j]+"|");
				}else if(j>=9){
					System.out.print(" "+checkerBoard[i][j]+"|");
				}else {
					System.out.print(checkerBoard[i][j]+"|");
				}
			
		}
		System.out.println();
		}
		
	}

}

运行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值