版权声明:就是码字也不容易啊 https://blog.csdn.net/qq_40946921/article/details/84444570
请参阅教材264页8.20题叙述编写一个“四子连”游戏(注:每次不仅要指定棋子的行而且还要指定列,具体效果如下图所示;此外,红黄棋手谁先下应随机生成)。
运行效果:
代码:
import java.util.Scanner;
public class JavaGame {
int row,column; //行列
String Graph[][]; //二维棋盘
String C[]={"红","黄"}; //棋子颜色
int empty; //棋盘剩余空格
public JavaGame(int r,int c){ //初始化棋盘数据
empty=r*c;
row=r;column=c;
Graph=new String[r][c];
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
Graph[i][j]=" ";
}
public void show(){ //展示棋盘
for(int i=row-1;i>=0;i--){
System.out.print("|");
for(int j=0;j<column;j++)
System.out.print(Graph[i][j]+"|");
System.out.println();
}
}
public int Input(int x ,int y,int key){ //下棋
System.out.println(y+" "+x);
if(y>=column||y<0||x>=row||x<0||!Graph[x][y].equals(" ")){
System.out.println("输入有误,请重新输入");
return 1;
}
Graph[x][y]=C[key%2];
empty--;
return 0;
}
public int judge(int x,int y) { //判断是否有人胜出
if (search(Graph[x][y], x, y, 1, 0) + search(Graph[x][y], x, y, -1, 0) == 3|| //水平探测
search(Graph[x][y], x, y, 1, 1) + search(Graph[x][y], x, y, -1, -1) == 3|| //对角探测
search(Graph[x][y], x, y, 0, 1) + search(Graph[x][y], x, y, 0, -1) == 3|| //垂直探测
search(Graph[x][y], x, y, 1, -1) + search(Graph[x][y], x, y, -1, 1) == 3) //对角探测
return 1;
return 0; //未有人获胜
}
public int search(String k, int a, int b, int z, int f) { //单向探测函数
a += z; b += f;
if (b >= column || a >= row || a < 0 || b < 0||!Graph[a][b].equals(k))
return 0;
return search(k, a , b , z, f)+1;
}
public static void main(String[] args) {
JavaGame My=new JavaGame(6,7);
Scanner input=new Scanner(System.in);
int x,y,key;
My.show();
for(int i=(int)(Math.random()*2);;){ //随机起手
System.out.print("请在"+My.C[i%2]+"棋手输入您的棋子所在行(1-6):");
x=input.nextInt();
System.out.print("所在列(1-7):");
y=input.nextInt();
if(My.Input(x-1,y-1,i)!=0) //出错后 执行下一循环(i没有++)
continue;
My.show();
if(My.judge(x-1,y-1)==1){ //判断是否有人胜出
System.out.println("恭喜,"+My.C[i%2]+"棋手赢!");
break;
}
if(My.empty==0){ //平局
System.out.println("Chess draw");
break;
}
i++;
}
}
}