:五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连珠者获胜。
棋盘效果如下:
1.绘制棋盘
2.提示黑方(用1表示)和白方(用2表示)分别表示下棋(x、y轴位置)并重新绘制棋盘
3.每当一方下棋后判断是否获胜。
第一步
是让我们绘制棋盘,那我们可以想到用二维数组来存储这棋盘,因为这些棋盘都是由0组成,除了第一列的每行和第一行的每一列,它们不是0,它们是为了让玩家在下棋落子时能很快找准位置,所以它们的值是和自己的列下标或行下标一一对应。OK,当我们知晓给二维数组赋这些值的时候,我们就可以遍历输入我们的二维数组,那我们的棋盘就绘制成功了。
在这里我将插入我的代码,以便大家更清醒的认识到我的思路:
在这里插入代码片
```int[][] nums = new int[16][16]; //需要存储棋盘的二维数组
//遍历赋初始值全部为0
for(int i=0; i<nums.length; i++) {
for(int j=0; j<nums[i].length; j++) {
nums[i][j] = 0;
}
}
//但是第一列的每行是非0 第一行的每列也是非0
for(int i=0; i<nums[0].length; i++) {
nums[0][i] = i;
}
for(int i=0; i<nums.length; i++) {
nums[i][0] = i;
}
//遍历输出 绘制棋盘
for(int i=0; i<nums.length; i++) {
for(int j=0; j<nums[i].length; j++) {
System.out.print(nums[i][j]+"\t");
}
System.out.println();
}
第二步
可以拆分三步,
第一步是提示玩家输入落子位置,这个很简单,但是我们在这一步我们还要考虑一个问题,是提示哪一个玩家,是黑方还是白方,还有就是下棋落子必须是轮着下,不能一直是一个选手下。所以我在这定义了一个布尔类型的变量,因为它只有两个值:true或false;当这个变量值为true时,用来提示黑方玩家下棋,那么当黑方下完后,我们把变量值变成false,那么下一次就轮到提示白方玩家下棋,然后再变值,这样就实现了黑方和白方轮着下棋。
那么第二步就是记录落子位置,并在这个位置上赋值1表示黑棋子,赋值2表示白棋子。这时我直接定义了两个和棋盘一样的二维数组,分别表示记录黑棋和白棋的数组。之所以一样,是因为为了方便赋值,因为玩家输入的是落子位置,也就是二维数组的下标,即行坐标和列坐标。我们只要对应这个用户输入的下标值来赋值1或2。当然在用户输入的过程中,我们还需要进行判断,是否为整型数,是否在棋盘的范围内,是否和对方的棋子或自己的棋子有重叠,需要很仔细的去判断有哪些细节需要考虑。当我们完成了这些判断,就可以在我们创建的记录棋子的数组上,对应玩家输入的下标位置,来赋上代表棋子的值(黑棋1或白棋2)。然后我们再把这个数组刚刚赋的值给到我们的棋盘数组上。
第三步就是玩家落子完后并重新绘制棋盘,因为玩家得看到彼此下的位置,否则怎么玩呢?鬼知道下一步往哪走。OK,其实在前面两小步都完成后,这一步就很简单了。它其实就是遍历二维数组进行输入罢了。
为了让大家更清醒的认识到我上面的思路,我将插入关于这三步的代码。
在这里插入代码片
int[][] black = new int[16][16]; //用来记录黑棋落子位置后的棋盘
int[][] white = new int[16][16]; //用来记录白棋落子位置后的棋盘
//遍历全赋值为0 和nums数组一样,为了方便赋值对应下标位置
for(int i =0; i<black.length;i++) {
for(int j =0; j<black[i].length; j++) {
white[i][j] = 0;
black[i][j] = 0;
}
}
//第一列的每行是非0 第一行的每列也是非0
for(int i=0; i<black[0].length; i++) {
black[0][i] = i;
}
for(int i=0; i<black.length; i++) {
black[i][0] = i;
}
//第一列的每行是非0 第一行的每列也是非0
for(int i=0; i<white[0].length; i++) {
white[0][i] = i;
}
for(int i=0; i<white.length; i++) {
white[i][0] = i;
}
//定义存储用户输入的坐标位置变量
Scanner input = new Scanner(System.in);
int c = 1;//黑棋落子行坐标位置
int d = 1;//黑棋落子列坐标位置
int a = 1;//白棋落子行坐标位置
int b = 1;//白棋落子列坐标位置
boolean pan = true; //判断谁落子 true 表示黑棋选手落子,false表示白棋选手落子
haha: while(true) {
if(pan) {
System.out.println("请黑棋选手输入落子行位置 列位置 (1-15):");
if(input.hasNextInt()) {
c = input.nextInt(); //行位置下标
d = input.nextInt(); //列位置下标
if(c < 1|| c>15) {
System.out.println("没有这个行位置,你已违法规则...");
return;
}
if(d < 1|| d>15) {
System.out.println("没有这个列位置,你已违法规则...");
return;
}
black[c][d] = 1; //有这个位置对应black数组下标上并在其赋值为1 表示黑棋子
}else {
System.out.println("输入有误,强制退出游戏...");
return;
}
}else {
System.out.println("请白棋选手输入落子行位置 列位置 (1-15):");
if(input.hasNextInt()) {
a = input.nextInt(); //行位置下标
b = input.nextInt(); //列位置下标
if(a < 1|| a>15) {
System.out.println("没有这个行位置,你已违法规则...");
return;
}
if(b < 1|| b>15) {
System.out.println("没有这列个位置,你已违法规则...");
return;
}
white[a][b] = 2; //有这个位置对应white数组下标上并在其赋值为2 表示白棋子
}else {
System.out.println("输入有误,强制退出游戏...");
return;
}
}
//落好子后赋给nums数组,因为它是我们的棋盘。
if(pan) {
if(nums[c][d]!=2&&nums[c][d]!=1) { //不能重叠自己的棋子和对方的棋子
nums[c][d]=black[c][d]; //把落子的位置开始赋值在棋盘上
}else {
System.out.println("你的落子位置和其他棋子位置有重叠,已违法游戏规则,将强制退出...");
return;
}
//遍历 重新绘制黑棋落子之后的棋盘,方便展示给白棋选手进行下一步落子
System.out.println("--------------------------------------------------------------");
for(int i=0; i<nums.length; i++) {
for(int j=0; j<nums[i].length; j++) {
System.out.print(nums[i][j]+"\t");
}
System.out.println();
}
pan = false; //黑棋选手落完子之后,接着就轮到白棋选手,所以赋值为false
}else {
if(nums[a][b]!=1&&nums[a][b]!=2){ //不能重叠自己的棋子和对方的棋子
nums[a][b]=white[a][b]; //落子的位置开始赋值在棋盘上
}else {
System.out.println("你的落子位置和其他棋子位置有重叠,已违法游戏规则,将强制退出...");
return;
}
//遍历重新绘制白棋落子之后的棋盘
System.out.println("--------------------------------------------------------------");
for(int i=0; i<nums.length; i++) {
for(int j=0; j<nums[i].length; j++) {
System.out.print(nums[i][j]+"\t");
}
System.out.println();
}
pan = true; //白棋选手落完子之后,接着就轮到黑棋选手,所以赋值为true
}
第三步
这一步就是判断胜负,赢了就终止游戏。那么怎么来判断输赢呢?我们首先得知道五子棋胜利的条件是什么?我相信大家都知道,那就是五子连珠,对吧。这个五子连珠横着连、竖着连、左斜线连、右斜线连都可以。所以我们就可以把分解成四个条件。
横线连:同一行5个挨在一起的列的值(1或2)相连
竖线连:同一列5个踩在一起的行的值(1或2)相连
左斜线连:根据行–、列++的顺序5个左斜在一起的值(1或2)相连
右斜线连:根据行++、列++的顺序5个右斜在一起的值(1或2)相连。
当我们知道这四个条件后,我们就可以遍历一一循环数组,去判断这四个条件是否有满足的。
接下来我将提供这一步的代码,方便大家更好的去理解。
在这里插入代码片
```// —— 输赢判断
for(int x=1;x<nums.length-4;x++) {
for(int y=1;y<nums[x].length-4;y++) {
if(nums[x][y]==1&&nums[x][y]==nums[x][y+1]&&nums[x][y+1]==nums[x][y+2]
&&nums[x][y+2]==nums[x][y+3]&&nums[x][y+3]==nums[x][y+4]) {
System.out.println("胜负已分,黑棋选手胜利");
break haha;
}
if(nums[x][y]==2&&nums[x][y]==nums[x][y+1]&&nums[x][y+1]==nums[x][y+2]
&&nums[x][y+2]==nums[x][y+3]&&nums[x][y+3]==nums[x][y+4]) {
System.out.println("胜负已分,白棋选手胜利");
break haha;
}
// | 输赢判断
if(nums[x][y]==1&&nums[x][y]==nums[x+1][y]&&nums[x+1][y]==nums[x+2][y]
&&nums[x+2][y]==nums[x+3][y]&&nums[x+3][y]==nums[x+4][y]) {
System.out.println("胜负已分,黑棋选手胜利");
break haha;
}
if(nums[x][y]==2&&nums[x][y]==nums[x+1][y]&&nums[x+1][y]==nums[x+2][y]
&&nums[x+2][y]==nums[x+3][y]&&nums[x+3][y]==nums[x+4][y]) {
System.out.println("胜负已分,白棋选手胜利");
break haha;
}
// \ 输赢判断
if(nums[x][y]==1&&nums[x][y]==nums[x+1][y+1]&&nums[x+1][y+1]==nums[x+2][y+2]
&&nums[x+2][y+2]==nums[x+3][y+3]&&nums[x+3][y+3]==nums[x+4][y+4]) {
System.out.println("胜负已分,黑棋选手胜利");
break haha;
}
if(nums[x][y]==2&&nums[x][y]==nums[x+1][y+1]&&nums[x+1][y+1]==nums[x+2][y+2]
&&nums[x+2][y+2]==nums[x+3][y+3]&&nums[x+3][y+3]==nums[x+4][y+4]) {
System.out.println("胜负已分,白棋选手胜利");
break haha;
}
// /输赢判断
if(nums[x][y]==1&&nums[x][y]==nums[(x+4)-1][y+1]&&nums[(x+4)-1][y+1]==nums[(x+4)-2][y+2]
&&nums[(x+4)-2][y+2]==nums[(x+4)-3][y+3]&&nums[(x+4)-3][y+3]==nums[(x+4)-4][y+4]) {
System.out.println("胜负已分,黑棋选手胜利");
break haha;
}
if(nums[x][y]==21&&nums[x][y]==nums[(x+4)-1][y+1]&&nums[(x+4)-1][y+1]==nums[(x+4)-2][y+2]
&&nums[(x+4)-2][y+2]==nums[(x+4)-3][y+3]&&nums[(x+4)-3][y+3]==nums[(x+4)-4][y+4]) {
System.out.println("胜负已分,白棋选手胜利");
break haha;
}
}
思路清晰了,相关的代码也给你们提示了,我们自己尝试着做一下,然后我将我完整的代码提供出来,以供大家参考。
在这里插入代码片
public class WuZiQi {
public static void main(String[] args) {
int[][] nums = new int[16][16]; //需要存储棋盘的二维数组
//遍历赋初始值全部为0
for(int i=0; i<nums.length; i++) {
for(int j=0; j<nums[i].length; j++) {
nums[i][j] = 0;
}
}
//但是第一列的每行是非0 第一行的每列也是非0
for(int i=0; i<nums[0].length; i++) {
nums[0][i] = i;
}
for(int i=0; i<nums.length; i++) {
nums[i][0] = i;
}
//遍历输出 绘制棋盘
for(int i=0; i<nums.length; i++) {
for(int j=0; j<nums[i].length; j++) {
System.out.print(nums[i][j]+"\t");
}
System.out.println();
}
int[][] black = new int[16][16]; //用来记录黑棋落子位置后的棋盘
int[][] white = new int[16][16]; //用来记录白棋落子位置后的棋盘
//遍历全赋值为0 和nums数组一样,为了方便赋值对应下标位置
for(int i =0; i<black.length;i++) {
for(int j =0; j<black[i].length; j++) {
white[i][j] = 0;
black[i][j] = 0;
}
}
//第一列的每行是非0 第一行的每列也是非0
for(int i=0; i<black[0].length; i++) {
black[0][i] = i;
}
for(int i=0; i<black.length; i++) {
black[i][0] = i;
}
//第一列的每行是非0 第一行的每列也是非0
for(int i=0; i<white[0].length; i++) {
white[0][i] = i;
}
for(int i=0; i<white.length; i++) {
white[i][0] = i;
}
//定义输入落子位置值 以及需要存储位置值的变量
Scanner input = new Scanner(System.in);
int c = 1;//黑棋落子行坐标位置
int d = 1;//黑棋落子列坐标位置
int a = 1;//白棋落子行坐标位置
int b = 1;//白棋落子列坐标位置
boolean pan = true; //判断谁落子 true 表示黑棋选手落子,false表示白棋选手落子
haha: while(true) {
if(pan) {
System.out.println("请黑棋选手输入落子行位置 列位置 (1-15):");
if(input.hasNextInt()) {
c = input.nextInt(); //行位置下标
d = input.nextInt(); //列位置下标
if(c < 1|| c>15) {
System.out.println("没有这个行位置,你已违法规则...");
return;
}
if(d < 1|| d>15) {
System.out.println("没有这个列位置,你已违法规则...");
return;
}
black[c][d] = 1; //有这个位置对应black数组下标上并在其赋值为1 表示黑棋子
}else {
System.out.println("输入有误,强制退出游戏...");
return;
}
}else {
System.out.println("请白棋选手输入落子行位置 列位置 (1-15):");
if(input.hasNextInt()) {
a = input.nextInt(); //行位置下标
b = input.nextInt(); //列位置下标
if(a < 1|| a>15) {
System.out.println("没有这个行位置,你已违法规则...");
return;
}
if(b < 1|| b>15) {
System.out.println("没有这列个位置,你已违法规则...");
return;
}
white[a][b] = 2; //有这个位置对应white数组下标上并在其赋值为2 表示白棋子
}else {
System.out.println("输入有误,强制退出游戏...");
return;
}
}
//落好子后赋给nums数组,因为它是我们的棋盘。
if(pan) {
if(nums[c][d]!=2&&nums[c][d]!=1) { //不能重叠自己的棋子和对方的棋子
nums[c][d]=black[c][d]; //把落子的位置开始赋值在棋盘上
}else {
System.out.println("你的落子位置和其他棋子位置有重叠,已违法游戏规则,将强制退出...");
return;
}
//遍历 重新绘制黑棋落子之后的棋盘,方便展示给白棋选手进行下一步落子
System.out.println("--------------------------------------------------------------");
for(int i=0; i<nums.length; i++) {
for(int j=0; j<nums[i].length; j++) {
System.out.print(nums[i][j]+"\t");
}
System.out.println();
}
pan = false; //黑棋选手落完子之后,接着就轮到白棋选手,所以赋值为false
}else {
if(nums[a][b]!=1&&nums[a][b]!=2){ //不能重叠自己的棋子和对方的棋子
nums[a][b]=white[a][b]; //落子的位置开始赋值在棋盘上
}else {
System.out.println("你的落子位置和其他棋子位置有重叠,已违法游戏规则,将强制退出...");
return;
}
//遍历重新绘制白棋落子之后的棋盘
System.out.println("--------------------------------------------------------------");
for(int i=0; i<nums.length; i++) {
for(int j=0; j<nums[i].length; j++) {
System.out.print(nums[i][j]+"\t");
}
System.out.println();
}
pan = true; //白棋选手落完子之后,接着就轮到黑棋选手,所以赋值为true
}
//判断是否输赢 ——:a[i][j]循环4次==a[i][j++] |:a[i][j]4次==a[i++][j]
// \:a[i][j]4次==a[i++][j++] /:a[i][j]4次==a[i--][j++]
// —— 输赢判断
for(int x=1;x<nums.length-4;x++) {
for(int y=1;y<nums[x].length-4;y++) {
if(nums[x][y]==1&&nums[x][y]==nums[x][y+1]&&nums[x][y+1]==nums[x][y+2]
&&nums[x][y+2]==nums[x][y+3]&&nums[x][y+3]==nums[x][y+4]) {
System.out.println("胜负已分,黑棋选手胜利");
break haha;
}
if(nums[x][y]==2&&nums[x][y]==nums[x][y+1]&&nums[x][y+1]==nums[x][y+2]
&&nums[x][y+2]==nums[x][y+3]&&nums[x][y+3]==nums[x][y+4]) {
System.out.println("胜负已分,白棋选手胜利");
break haha;
}
// | 输赢判断
if(nums[x][y]==1&&nums[x][y]==nums[x+1][y]&&nums[x+1][y]==nums[x+2][y]
&&nums[x+2][y]==nums[x+3][y]&&nums[x+3][y]==nums[x+4][y]) {
System.out.println("胜负已分,黑棋选手胜利");
break haha;
}
if(nums[x][y]==2&&nums[x][y]==nums[x+1][y]&&nums[x+1][y]==nums[x+2][y]
&&nums[x+2][y]==nums[x+3][y]&&nums[x+3][y]==nums[x+4][y]) {
System.out.println("胜负已分,白棋选手胜利");
break haha;
}
// \ 输赢判断
if(nums[x][y]==1&&nums[x][y]==nums[x+1][y+1]&&nums[x+1][y+1]==nums[x+2][y+2]
&&nums[x+2][y+2]==nums[x+3][y+3]&&nums[x+3][y+3]==nums[x+4][y+4]) {
System.out.println("胜负已分,黑棋选手胜利");
break haha;
}
if(nums[x][y]==2&&nums[x][y]==nums[x+1][y+1]&&nums[x+1][y+1]==nums[x+2][y+2]
&&nums[x+2][y+2]==nums[x+3][y+3]&&nums[x+3][y+3]==nums[x+4][y+4]) {
System.out.println("胜负已分,白棋选手胜利");
break haha;
}
// /输赢判断
if(nums[x][y]==1&&nums[x][y]==nums[(x+4)-1][y+1]&&nums[(x+4)-1][y+1]==nums[(x+4)-2][y+2]
&&nums[(x+4)-2][y+2]==nums[(x+4)-3][y+3]&&nums[(x+4)-3][y+3]==nums[(x+4)-4][y+4]) {
System.out.println("胜负已分,黑棋选手胜利");
break haha;
}
if(nums[x][y]==21&&nums[x][y]==nums[(x+4)-1][y+1]&&nums[(x+4)-1][y+1]==nums[(x+4)-2][y+2]
&&nums[(x+4)-2][y+2]==nums[(x+4)-3][y+3]&&nums[(x+4)-3][y+3]==nums[(x+4)-4][y+4]) {
System.out.println("胜负已分,白棋选手胜利");
break haha;
}
}
}
}
}