JAVA 8.20 游戏:四子连(Java&C++)
四子连是一个两个人玩的棋盘游戏,在游戏中,玩家轮流将有颜色的棋子放在一个六行七列的垂直悬挂的网格中:
这个游戏的目的是在对手实现一行、一列或者一条对角线上有四个相同颜色的棋子之前,你能先做到。程序提示两个玩家交替的下红子Red或黄子Yellow。当放下一子时,程序在控制台重新显示这个棋盘,然后确定游戏状态(赢、平局还是继续):
-----此题源自《java语言程序设计》习题8.20
对象分析:
属性:棋盘:Graph、top——二维字符(串)组模拟栈组;
棋子:C(颜色)——奇偶交替变换
方法:下棋:input()——修改二维组
判断输赢:judge()——判断胜出
显示棋盘:show()——展示棋盘
胜出条件:四子连珠
代码思路:每次下棋之后都要进行判断,是否有人胜出,怎么判断呢?可以在下棋之后,从4个方向判断是否出现了四子连珠(注意边界,易出现bug),具体实现,请看代码。
注意:边界要判断仔细
双向检测连珠,有可能你最后一次是下3个棋子中间胜出
C++版:
#include<iostream>
#include<string>
using namespace std;
class Chess {
public:
Chess(); //初始化成员数据
void show(); //显示棋盘
int input(int y,int key); //下棋
int judge(int y); //判断结果
string C[2] = { "red","yellow" };
private:
string Graph[6][7];
int top[7]; //模拟栈
};
Chess::Chess(){
memset(top, -1, sizeof(top)); //数组top初始化为-1
for (int i = 0; i < 6; i++) { //初始化Graph
for (int j = 0; j < 7; j++) {
Graph[i][j] = " ";
}
}
}
void Chess::show(){
for (int i = 5; i >= 0; i--) {
cout << "|";
for (int j = 0; j < 7; j++)
cout << Graph[i][j] << "|";
cout << endl;
}
}
int Chess::input(int y,int key) {
if (y > 6 || y < 0){ //越界检测
cout << "y is out of range[0,6]" << endl;
return 1;
}
if (top[y] == 5) {
cout << "x is out of range" << endl;
return 1;
}
Graph[++top[y]][y] = toupper(C[key % 2][0]); //赋值操作
return 0;
}
int Chess::judge(int y) {
int kx[8] = { 0, 1, 1, 1 }, //八个方向(4个正方向,另外4个负方向取反)
ky[8] = { 1, 1, 0,-1 };
int a, b, count = 0;
int x = top[y];
for (int i = 0; i < 4; i++) { //八个方向检测
a = x; //数据初始化
b = y;
count = 0;
for (int j = 0; j < 3; j++) { //检测四个正方向
a += kx[i];
b += ky[i];
if (b > 6 || a > 5 || a < 0 || b < 0 || Graph[a][b] == " ") //边界检测
break;
if (Graph[a][b] == Graph[x][y] )
count++;
}
a = x;
b = y;
for (int j = 0; j < 3; j++) { //检测四个负方向
a -= kx[i];
b -= ky[i];
if (b > 6 || a > 5 || a < 0 || b < 0 || Graph[a][b] == " ") //边界检测
break;
if (Graph[a][b] == Graph[x][y]) //逻辑判断
count++;
}
if (count == 3) //四子相连,此人胜出
return 1;
}
for (int i = 0; i < 7; i++) { //只要有一列未满,返回0
if (top[i] != 5)
return 0;
}
return -1; //全满,返回-1(平局)
}
int main() {
Chess myChess;
myChess.show();
int tmp,key;
for (int i = 0;;) { //i奇偶决定颜色
cout << "Drop a "<< myChess.C[i % 2] <<" disk at column(0-6): ";
cin >> tmp;
if (myChess.input(tmp, i)) //bug检测
continue;
system("cls"); //清屏
myChess.show();
key = myChess.judge(tmp); //key判断输赢,平局
if (key==1) {
cout << "The " << myChess.C[i % 2] << " player won" << endl;
break;
}
else if (key == -1) {
cout << "Chess draw" << endl;
break;
}
i++;
}
return 0;
}
Java版:
类似,思路框架如上,代码请自己写。
//Java中对应C++的赋值操作
Graph[++top[y]][y]=C[key%2].toUpperCase().substring(0,1);
//Java中对应C++逻辑判断:
Graph[a][b].charAt(0) == Graph[x][y].charAt(0) ;