首先对于这样一个小游戏的实现所需要的代码肯定是比较多的,我建议在源文件中创建三个文件夹。我个人是命名为game.c game.h 以及text.c。
text.c
中代码为游戏运行的主体部分,游戏实现的逻辑部分主要在这里。
game.c中代码是text.c中需要用到的自定义函数。
game.h中是text.c和game.c需要应用的头文件以及game.c中函数的声明,并且在text.c与game.c中写上
#include"game.h"
(在这里我先不介绍函数的具体实现步骤哦,将在底下为大家展示。)
接下来给大家在注释中讲一讲text.c中需要的代码。
#include"game.h"
int main()
{
//创建二维数组对应井字棋的九格子
char arr[ROW][COL] = {0};//ROW 与 COL都是在game.h中的常量#define ROW 3 #define COL 3
srand(time(NULL));
int z = 0;//这两条代码都是为了之后随机落子准备的,以及玩家或电脑先手随机做准备
do
{
menu1();//打印菜单选择1开始游戏选择2结束游戏。
int i = 0;
while (1)
{
scanf("%d", &i);
if (i == 1)
break;
else if (i == 2)
{
printf("游戏结束\n");
break;
}
else
{
printf("输入错误,请重新输入\n");
}
}
Sleep(500);
system("cls");//清空上一步开始游戏的菜单,为下一步打印游戏开始时的棋盘做准备
if (i == 2)
break;
init(arr, ROW, COL);//由于一开始的棋盘是空的,所以要对arr初始化使其每一个元素都存放‘ ’
Printf(arr, ROW, COL);//打印棋盘,供玩家或电脑选择落子位置
z = rand() % 2 + 1;
char ret = 0;
//由随机值z决定玩家先手还是电脑电脑先手
if (z == 1)
{
while (1)//循环玩家落子,判定胜负,电脑落子,判定胜负的过程
{
player_move(arr);//玩家落子的函数
ret = Judge(arr);//判断胜负函数,利用返回值确定是玩家获胜或者电脑获胜或者游戏继续,或者是无人胜出,平局。
//有人获胜或平局跳出循环,游戏继续则不进行操作,循环继续
if (ret == '*')
{
printf("玩家获胜\n游戏结束\n");
break;
}
else if (ret == '#')
{
printf("电脑获胜\n游戏结束\n");
break;
}
else if (ret == 'T')//游戏继续
{
;
}
else
{
printf("平局\n游戏结束\n");
break;
}
computer_move(arr);//电脑落子的函数
ret = Judge(arr);
if (ret == '*')
{
printf("玩家获胜\n游戏结束\n");
break;
}
else if (ret == '#')
{
printf("电脑获胜\n游戏结束\n");
break;
}
else if (ret == 'T')//游戏继续
{
;
}
else
{
printf("平局\n游戏结束\n");
break;
}
}
}
else if (z == 2)//这里交换电脑与玩家的落子顺序改变先手。
{
while (1)
{
computer_move(arr);
ret = Judge(arr);
if (ret == '*')
{
printf("玩家获胜\n游戏结束\n");
break;
}
else if (ret == '#')
{
printf("电脑获胜\n游戏结束\n");
break;
}
else if (ret == 'T')
{
;
}
else
{
printf("平局\n游戏结束\n");
break;
}
player_move(arr);
ret = Judge(arr);
if (ret == '*')
{
printf("玩家获胜\n游戏结束\n");
break;
}
else if (ret == '#')
{
printf("电脑获胜\n游戏结束\n");
break;
}
else if (ret == 'T')
{
;
}
else
{
printf("平局\n游戏结束\n");
break;
}
}
}
menu2();打印菜单2供玩家选择再来一局或者退出游戏
int j = 0;
while (1)
{
scanf("%d", &i);
if (i == 1)
{
system("cls");//为了实现游戏重新开始,所以清空原来屏幕的内容
break;
}
else if (i == 2)
{
printf("游戏结束\n");
j++;
break;
}
else
{
printf("输入错误,请重新输入\n");
}
}
if (j==1)
{
break;
}
} while (1);
return 0;
}
对于需要引用的头文件以及函数我们放在game.h 中
#include<stdio.h>
#define ROW 3
#define COL 3
#include<time.h>
#include<stdlib.h>
//打印开局时的菜单
void menu1(void);
//打印结束时的菜单
void menu2(void);
//初始化棋盘
void init(char* str, int row, int col);
//打印期棋盘
void Printf(char* str, int row, int col);
//玩家落子
void player_move(arr);
//电脑落子
void computer_move(arr);
//判断游戏结束与否
char Judge(char* str);
最后我们需要关注的是game.c中函数的实现部分
#include"game.h"
void menu1(void)
{
printf("****************\n");
printf("***1.开始游戏***\n");
printf("***2.退出游戏***\n");
printf("****************\n");
printf("tip:玩家执'*'电脑执'#'\n先手方随机\n");
}
void menu2(void)
{
printf("****************\n");
printf("***1.再来一局***\n");
printf("***2.退出游戏***\n");
printf("****************\n");
printf("tip:玩家执'*'电脑执'#'\n先手方随机\n");
}
void init(char* str, int row, int col)
{
for (int i = 0; i < ROW; i++)
{
for (int n = 0; n < COL; n++)
{
*(str+3*i+n) =' ';
}
}
}
void Printf(char* str, int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int n = 0; n < col; n++)
{
printf(" %c ",*(str+3*i+n));
if (n < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (int n = 0; n < col; n++)
{
printf("---");
if (n < col - 1)
{
printf(" ");
}
}
printf("\n");
}
}
}
void player_move(char* str)
{
printf("请输入坐标 行 列\n");
int x = 0, y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL&& *(str + 3 * (x - 1) + y - 1) == ' ')
{
Sleep(500);
system("cls");
printf("玩家回合:\n");
*(str + 3 * (x - 1) + y - 1) = '*';
Printf(str, ROW, COL);
printf("电脑回合:\n");
Sleep(1000);
break;
}
else
printf("输入坐标有误请重新输入\n");
}
}
void computer_move(char* str)
{
printf("请输入坐标 行 列\n");
int x = 0, y = 0;
while(1)
{
x = rand() % 3 + 1;
y = rand() % 3 + 1;
system("cls");
printf("电脑回合:\n");
if (*(str + 3 * (x - 1) + y - 1) == ' ')
{
*(str + 3 * (x - 1) + y - 1) = '#';
Printf(str, ROW, COL);
printf("玩家回合:\n");
break;
}
else
continue;
}
}
char Judge(char* str)
{
for (int i = 0; i < ROW; i++)
{
if (*(str + 3 * i + 0) == *(str + 3 * i + 1) && *(str + 3 * i + 0) == *(str + 3 * i + 2) && *(str + 3 * i + 0) != ' ')
{
return *(str + 3 * i + 0);
}
}
for (int i = 0; i < COL; i++)
{
if (*(str + 0 + i) == *(str + 3 + i) && *(str + 0 + i) == *(str + 6 + i) && *(str + 0 + i) != ' ')
{
return *(str + 0 + i);
}
}
if ((*(str + 0) == *(str + 3 + 1) && *(str + 3 + 1) == *(str + 6 + 2) && *(str + 3 + 1) != ' ') || (*(str + 0 + 2) == *(str + 3 + 1) && *(str + 3 + 1) == *(str + 6 + 0) && *(str + 0 + 2) != ' '))
{
return *(str + 3 + 1);
}
int count = 0;
for (int i = 0; i < 9; i++)
{
if (*(str + i) != ' ')
count++;
}
if (count < 9)
return 'T';
}