写一个简单的小游戏 ——五子棋
程序员文章站
2022-05-25 11:47:17
...
写一个简单的小游戏 ——五子棋
- emmmmmmm,这只是一个简单的五子棋,电脑的落子也只是单纯的只用随机数产生,并没有多的逻辑处理,因此,游戏的难点在于让电脑赢,完毕。
- 代码很简单,主要的问题就是判断输入的坐标合法性,修改坐标处的显示,判断游戏的状态(也就是胜利,流局和游戏继续三个的状态),判断方法也很简单,只需要对二维数组遍历就好。
-
话不多说先上图:
- 选择界面:
- 游戏界面:
在游戏界面我设置了可以动态设置棋盘的大小( 棋盘的大小只需要在#define那里修改就可以。不过因为是在6*6棋盘下设计的界面(虽然很丑),所以6*6下效果最好。),所以它可能是这样的:
这样的:
和这样的:
- 游戏结束后输出:
- 选择界面:
-
最后附上代码:
代码分为三部分 game.h game.c 和 text.c- game.h
#ifndef __GAME_H__
#define __GAME_H__
#define R 6 //行
#define C 6 //列
void game_menu(const char a[R][C]); // 游戏界面
void choose_menu(char a[R][C]); //选择界面
void initialize_game(char a[R][C]); //初始化游戏
void player_game(char a[R][C]); //玩家落子
void computer_game(char a[R][C]); //电脑落子
char judgment(const char a[R][C]); // 判断游戏状态
void game(char a[R][C]); //游戏过程
void end_print(char game_status); //输出游戏情况
#endif // _GAME_H__
- game.c
#include"game.h"
void initialize_game(char a[R][C]) //初始化游戏
{
int i, j;
for (i = 0; i < R; i++)
for (j = 0; j < C; j++)
a[i][j] = 32;
}
void game_menu(const char a[R][C]) //游戏界面
{
/*system("cls");*/ //清屏
int i = 0, j = 0;
printf("\n\n\t-----游戏棋盘为5X5,玩家需要在下面输入要落子的位置,先行后列,中间以空格隔开!!!-----\n");
printf("\n\t\t----- 玩家落子为“ X ” 电脑落子为“ O ” -----\n");
printf("\n\n\t\t | ̄%d ̄ ̄ ̄ ̄", 1);
for (i = 2; i <= C - 1; i++)
{
printf("%d ̄ ̄ ̄ ̄", i );
}
printf("%d ̄| \n", C);
for (i = 0; i < R - 1; i++)
{
printf("\t\t %d %c", i + 1, a[i][0]);
for (j = 1; j <= C - 1; j++)
{
printf("--------%c", a[i][j]);
}
printf(" %d\n", i + 1);
printf("\t\t | |");
for (j = 1; j <= C - 1; j++)
{
printf(" |");
}
printf(" |\n");
printf("\t\t | |");
for (j = 1; j <= C - 1; j++)
{
printf(" |");
}
printf(" |\n");
}
printf("\t\t %d %c", i + 1, a[i][0]);
for (j = 1; j <= C - 1; j++)
{
printf("--------%c", a[i][j]);
}
printf(" %d\n", i + 1);
printf("\t\t |__%d________", 1);
for (i = 2; i <= C - 1; i++)
{
printf("%d________", i);
}
printf("%d__| \n", R);
}
void player_game(char a[R][C]) //玩家落子
{
int x = 1, y = 1;
game_menu(a);
while (1)
{
printf("请玩家输入落子位置:");
scanf("%d %d", &x, &y);
if ((x <= R) + (x >= 1) + (y <= C) + (x >= 1) + ((a[x - 1][y - 1]) == 32) == 5)
{
a[x - 1][y - 1] = 'X';
break;
}
else
{
printf("\n\t\t\t输入错误,请重新输入!!!\n\n");
}
}
game_menu(a);
}
void computer_game(char a[R][C]) //电脑落子
{
srand((int)time(0));
int x = 1, y = 1;
game_menu(a);
while (1)
{
x = rand() % (R + 1);
y = rand() % (C + 1);
if ((x <= R) + (x >= 1) + (y <= C) + (x >= 1) + ((a[x - 1][y - 1]) == 32) == 5)
{
a[x - 1][y - 1] = 'O';
break;
}
}
game_menu(a);
}
char judgment(const char a[R][C]) // 判断游戏状态 返回具体胜方
{
int i = 0, j = 0;
for (i = 0; i <= R - 5; i++)
{
for (j = 0; j <= C - 5; j++)
{
//行
if ((a[i][j] != ' ') + (a[i][j] == a[i][j + 1]) + (a[i][j + 1] == a[i][j + 2]) + (a[i][j + 2] == a[i][j + 3]) + (a[i][j + 3] == a[i][j + 4]) == 5)
return a[i][j];
//列
if ((a[i][j] != ' ') + (a[i][j] == a[i + 1][j]) + (a[i + 1][j] == a[i + 2][j]) + (a[i + 2][j] == a[i + 3][j]) + (a[i + 3][j] == a[i + 4][j]) == 5)
return a[i][j];
//正对角线
if ((a[i][j] != ' ') + (a[i][j] == a[i + 1][j + 1]) + (a[i + 1][j + 1] == a[i + 2][j + 2]) + (a[i + 2][j + 2] == a[i + 3][j + 3]) + (a[i + 3][j + 3] == a[i + 4][j + 4]) == 5)
return a[i][j];
//反对角线
if ((a[i][j + 4] != ' ') + (a[i][j + 4] == a[i + 1][j + 3]) + (a[i + 1][j + 3] == a[i + 2][j + 2]) + (a[i + 2][j + 2] == a[i + 3][j + 1]) + (a[i + 3][j + 1] == a[i + 4][j]) == 5)
return a[i][j + 4];
}
}
for (i = 0; i < R; i++)
{
for (j = 0; j < R; j++)
{
if (a[i][j] == ' ')
return ' ';
}
}
return 'Q';
}
void game(char a[R][C]) //游戏过程 根据judgment 返回值判断游戏是否结束
{
char game_status = ' ';
while(1)
{
game_status = judgment(a);
if (game_status != ' ')
{
break;
}
player_game(a);
game_status = judgment(a);
if (game_status != ' ')
{
break;
}
computer_game(a);
game_status = judgment(a);
if (game_status != ' ')
{
break;
}
}
game_menu(a);
end_print(game_status);
}
void end_print(char game_status) //输出游戏情况
{
if (game_status == 'X')
{
printf("\n\n\t\t\t 游戏结束,玩家获胜!!!\n");
}
if (game_status == 'O')
{
printf("\n\n\t\t\t 游戏结束,电脑获胜!!!\n");
}
if (game_status == 'Q')
{
printf("\n\n\t\t\t 游戏结束,流局!!!\n");
}
}
void choose_menu(char a[R][C]) //选择菜单
{
int c = 1;
//system("cls");
while (c)
{
//system("CLS");
printf("\n\n\t\t ====================================================\n");
printf("\t\t ====================================================\n\n");
printf("\t\t == 请选择功能: ==\n");
printf("\t\t ==\t 1.开始新游戏 0.结束游戏 ==");
printf("\n\n\t\t ====================================================\n");
printf("\t\t ====================================================\n");
printf("\t\t 请输入选项:");
scanf("%d", &c);
switch (c)
{
case 1: initialize_game(a); game(a); break;
case 0: printf("\n\n\t\t\t 游戏结束,请按任意键退出!!!\n\n"); break;
default: printf("\n\n\t\t\t 选择错误,请重新选择!!!\n\n"); break;
}
}
}
- text.c
//五子棋
#include"game.h"
void play()
{
char a[R][C];
choose_menu(a);
}
int main()
{
play();
return 0;
}
以上为代码全部分,不足之处还望指正。