五子棋演示图:
五子棋代码:
#include<iostream>
#include <stdlib.h>
using namespace std;
// -------------------- 数据设计 --------------------
/*
棋盘:
map[i][j]表示坐标(i,j)的值
0表示空地
1表示黑子
2表示白子
如: map[3][6] = 1 表示(3,6)的位置是黑子
*/
const int mapsize = 19;
int map[mapsize][mapsize] = { 0 };
// 表示当前回合数 偶数表示黑棋落子 奇数表示白棋落子
// 如: flag = 20 表示当前是第[20]次落子 由黑方落子
int flag=0;
// -------------------- 数据设计 --------------------
// -------------------- service --------------------
/*
负责人: 张三
功能: 初始化游戏数据
将棋盘的值初始化为0
当前回合设为黑棋(flag设为0)
参数: void
返回值: void
*/
void init();
/*
*难点1
负责人: 张三
功能: 根据传入的坐标(map对应位置)和flag值 判断落点后是否获胜
参数:
x: 当前回合落子的x坐标
y: 当前回合落子的y坐标
返回值:
0表示没有获胜
1表示黑子胜利
2表示白子胜利
*/
int isWin(int x, int y);
/*
负责人: 张三
功能: 在指定位置落子
如果map[x][y]是空地 则修改map[x][y]的值:改为相应颜色(flag对应颜色)
否则不操作
参数:
x: 当前回合落子的x坐标
y: 当前回合落子的y坐标
返回值:
0表示落子失败 (棋盘已经有子)
1表示落子成功
*/
int playerMove(int x, int y);
// -------------------- service --------------------
// -------------------- view --------------------
/*
功能: 展示选项, 玩家可以在这里选择进入游戏, 进入设置或退出游戏
进入游戏: 调用游戏界面函数gameView();
进入设置: 敬请期待...
退出游戏: 调用exit(0);
*/
void menuView();
/*
负责人: 张三
功能: 根据map数组 打印游戏棋盘
参数: void
返回值: void
*/
void gameView_ShowMap();
/*
负责人: 张三
功能: 根据flag的值 打印游戏胜利界面 用户可以按任意键回到主菜单
参数: void
返回值: void
*/
void winView();
/*
*难点2
负责人: 张三
功能: 游戏界面整合
初始化游戏数据(调用函数init())
while(1){
打印游戏界面(调用函数gameView_ShowMap())
接收玩家坐标输入
落子(调用落子函数playerMove())
(如果落子失败 重新开始循环)
判断游戏是否胜利(调用胜利判断函数isWin())
(如果游戏胜利 调用胜利界面函数 然后结束当前界面)
切换玩家(修改flag值)
}
参数: void
返回值: void
*/
void gameView();
// -------------------- view --------------------
int main()
{
int testflag = 0;
menuView();
//init测试代码
/*
init();
if (flag != 0) {
printf("init()错误");
exit(0);
}
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
if (map[i][j]) {
printf("init()错误");
exit(0);
}
}
}
printf("init()测试成功\n");
testflag++;
*/
//playerMove测试代码
/*
int result = 1;
result &= playerMove(2, 2);
result &= playerMove(2, 3);
result &= playerMove(2, 4);
result &= playerMove(2, 5);
if (result != 1 || (map[2][2] && map[2][3] && map[2][4] && map[2][5]) != 1)
{
printf("playerMove()错误");
exit(0);
}
flag = 1;
result &= playerMove(2, 5);
if (result != 0 || map[2][5] != 1) {
printf("playerMove()错误");
exit(0);
}
printf("playerMove()测试成功\n");
testflag++;
*/
//isWin测试代码
/*
playerMove(2, 1);
if (isWin(2, 1)) {
printf("isWin()错误");
exit(0);
}
playerMove(1, 0);
playerMove(3, 2);
playerMove(4, 3);
playerMove(5, 4);
if (isWin(1, 0) != 2) {
printf("isWin()错误");
exit(0);
}
printf("isWin()测试成功\n");
testflag++;*/
if (testflag == 3) {
cout<<"service代码测试成功\n";
}
return 0;
}
void init() {
//代码实现
//map[mapsize][mapsize] = { 0 };
for (int i = 0; i < mapsize; i++) {
for (int j = 0; j < mapsize; j++) {
map[i][j] = 0;
}
}
flag = 0;
}
int isWin(int x, int y) {
//代码实现
//水平方向
int color = flag % 2 + 1;
int count = 0;
for (int i = -4; i <= 4; i++) {
if (y + i < 0 || y + i >= mapsize) {
continue;
}
if (map[x][y + i] == color) {
count += 1;
}
else {
count = 0;
}
if (count == 5) {
return color == 1 ? 1 : 2;
}
}
//竖直方向
count = 0;
for (int i = -4; i <= 4; i++) {
if (x + i < 0 || x + i >= mapsize) {
continue;
}
if (map[x+i][y] == color) {
count += 1;
}
else {
count = 0;
}
if (count == 5) {
return color == 1 ? 1 : 2;
}
}
//从左上斜向右下
count = 0;
for (int i = -4; i <= 4; i++) {
if (x + i < 0 || x + i >= mapsize || y + i < 0 || y + i >= mapsize) {
continue;
}
if (map[x + i][y + i] == color) {
count += 1;
}
else {
count = 0;
}
if (count == 5) {
return color == 1 ? 1 : 2;
}
}
//从左下斜向右上
count = 0;
for (int i = -4; i <= 4; i++) {
if (x - i < 0 || x - i >= mapsize || y + i < 0 || y + i >= mapsize) {
continue;
}
if (map[x - i][y + i] == color) {
count += 1;
}
else {
count = 0;
}
if (count == 5) {
return color == 1 ? 1 : 2;
}
}
return 0;
}
int playerMove(int x, int y) {
//代码实现
if (map[x][y] == 0) {
map[x][y] = (flag % 2) ? 2 : 1;
return 1;
}
else {
return 0;
}
}
void menuView() {
//代码实现
cout << " 游戏主页面\n";
cout << "1.进入游戏\n";
cout << "2.进入设置\n";
cout << "3.退出游戏\n";
cout << "请输入选项:";
int k = 0;
cin >> k;
system("cls");
if (k == 1) { gameView(); }
else if (k == 2) { cout << "敬请期待"; }
else if (k == 3) { exit(0); }
}
void gameView_ShowMap() {
//代码实现
cout << "黑子:X,白子:O\n";
cout << " ";
for (int i = 0; i < mapsize; i++) {
cout << i<<" ";
if (i < 10) {
cout << " ";
}
}
cout << endl;
for (int i = 0; i < mapsize; i++) {
cout << i<<" ";
if (i < 10) {
cout << " ";
}
for (int j = 0; j < mapsize; j++) {
//cout << map[i][j] << " ";
if (map[i][j] == 0)cout << ' ' << " ";
if (map[i][j] == 1)cout << 'X' << " ";
if (map[i][j] == 2)cout << 'O' << " ";
}
cout << endl;
}
}
void winView() {
//代码实现
system("cls");
if (flag % 2) {
cout << "白方(O)胜\n";
}
else {
cout << "黑方(X)胜\n";
}
}
void gameView() {
//代码实现
int color = 1;
while (1) {
//打印游戏界面(调用函数gameView_ShowMap())
gameView_ShowMap();
//接收玩家坐标输入
int x, y;
if (flag % 2 == 0) { cout << "黑子执棋,"; }
else{ cout << "白子执棋,"; }
cout << "请输入落子位置:";
cin >> x >> y;
if (x < 0 || x >= mapsize || y < 0 || y >= mapsize||map[x][y]!=0) {
system("cls");
cout << "输入错误,请重新输入:\n";
continue;
}
system("cls");
playerMove(x, y);
if (isWin(x, y)) {
gameView_ShowMap();
winView();
cout << "是否返回主页面?\n";
cout << "1.返回主页面\n";
cout << "其它.结束游戏\n";
cout << "请输入:";
char m = '0';
cin >> m;
system("cls");
if (m == '1') {
init();
menuView();
}
else {break;}
}
flag += 1;
color = (color == 1) ? 2 : 1;
//落子(调用落子函数playerMove())
//(如果落子失败 重新开始循环)
//判断游戏是否胜利(调用胜利判断函数isWin())
//(如果游戏胜利 调用胜利界面函数 然后结束当前界面)
//切换玩家(修改flag值)
}
}
这个代码的chatgpt解释:
这段代码是一个简单的五子棋游戏的实现,包括数据设计、服务功能和视图展示。它实现了以下主要功能:
-
init()
函数用于初始化游戏数据,将棋盘的值全部初始化为0,当前回合设为黑棋。 -
isWin(int x, int y)
函数用于判断落子后是否获胜。它检查水平、竖直、以及两个对角线方向上是否有五个连续的相同颜色的棋子,以判断游戏是否结束。 -
playerMove(int x, int y)
函数用于在指定位置落子,如果该位置为空地则进行落子,否则返回落子失败。 -
menuView()
函数用于展示游戏主页面,玩家可以选择进入游戏、进入设置或退出游戏。 -
gameView_ShowMap()
函数用于打印游戏棋盘。 -
winView()
函数用于打印游戏胜利界面。 -
gameView()
函数整合了游戏界面逻辑,实现了游戏循环,玩家输入落子位置,判断是否胜利,切换玩家等功能。
该代码虽然是一个基本的五子棋实现,但还可以进一步完善和优化,例如:
- 实现更高级的电脑下棋策略,增加游戏的挑战性和趣味性。
- 添加更多的用户界面交互,例如选择棋子颜色、设置难度等。
- 优化界面显示,可以使用更漂亮的棋盘绘制方法,让界面更美观。
- 增加异常处理,对用户的输入进行合法性检查,以防止程序崩溃或出错。
总之,这段代码是一个简单的五子棋游戏框架,可以作为起点进行进一步开发和完善。