使用工具:vs2022
第一步,创建三个文件:game.c(游戏函数的具体实现),game.h(游戏函数的声明),test.c(主函数)
当以上三个文件都创建好以后,进入test.c源文件中编写代码,代码如下 >:
#define _CRT_SECURE_NO_WARNINGS
//引用自己编写的函数声明
#include "game.h"
int main()
{
int i = 1;
//随机数
srand((unsigned int )time(NULL));
while (i)
{
//打印菜单
game_menu();
//选择 游戏/退出
scanf("%d", &i);
//进入switch循环,开始游戏
switch (i)
{
case 1:
//开始游戏
game_play();
break;
case 0:
i = 0;
printf("退出成功!");
break;
default:
printf("输入错误,请重新输入:>\n");
break;
}
}
return 0;
}
以上是主函数的逻辑,游戏函数全部写在game.c中,声明全部写在game.h中
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二步:
进入game.h,代码如下>:
//以下所有函数都在game.c中实现
#define _CRT_SECURE_NO_WARNINGS
//头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//数组大小
#define ROW 3
#define COL 3
//游戏菜单
void game_menu();
//数组初始化
void init_arr(char arr[ROW][COL], int row, int col);
//打印棋盘
void game_che(char arr[ROW][COL], int row, int col);
//玩家下棋
void game_player(char arr[ROW][COL], int row, int col);
//电脑下棋
void game_npc(char arr[ROW][COL], int row, int col);
//判断输赢
char game_yes_no(char arr[ROW][COL], int row, int col);
//开始游戏
void game_play();
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第三步:
进入game.c,代码如下 >:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//游戏菜单
void game_menu()
{
printf("**************************\n");
printf("*** 1,开始游戏(Play) ***\n");
printf("*** 0,退出游戏(Exit) ***\n");
printf("**************************\n");
}
//数组初始化
void init_arr(char arr[ROW][COL], int row, int col)
{
//把每个数组元素都初始化为空格
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
//打印棋盘
void game_che(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//外层循环控制行
for (i = 0; i < row; i++)
{
//内层循环控制列
for (j = 0; j < col; j++)
{
printf(" %c ",arr[i][j]);
//打印到最后已列,不打印 |
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
int k = 0;
//打印到最后一行,不再打印分割线
if (i < row - 1)
{
for (k = 0; k < row; k++)
{
printf("---");
if (k < row - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
//玩家下棋
void game_player(char arr[ROW][COL], int row, int col)
{
//由于是在命令提示符中玩游戏,所以只能输入数组下标实现落子功能
//下标和数组元素下标一致
//玩家输入坐标,然后将坐标元素改成 *
//玩家输入坐标不能越界,
//已经落子的坐标不能再次落子
int i = 0;
int j = 0;
while (1)
{
printf("请输入坐标:>\n");
scanf("%d %d", &i, &j);
//判断玩家输入的坐标是否越界
if (i < row && j < col)
{
//判断玩家输入的坐标是否已经落子
if (arr[i][j] == ' ')
{
arr[i][j] = '*';
break;
}
else
{
printf("此坐标已被落子,请重新输入坐标\n");
}
}
else
{
printf("坐标越界,请重新输入坐标\n");
}
}
}
//电脑下棋
void game_npc(char arr[ROW][COL], int row, int col)
{
printf("\n电脑落子>:");
while (1)
{
//电脑生成随机数
//在使用rand函数之前,要先使用srand函数,srand函数在test.c中使用一次即可
int i = rand() % row;
int j = rand() % col;
//判断坐标是否落子,如果随机生成的坐标被落子,那么继续循环
//直到生成没有被落子的下标
if (arr[i][j] == ' ')
{
//电脑落子为 #
arr[i][j] = '#';
printf("%d %d\n",i,j);
break;
}
}
}
//判断输赢
char game_yes_no(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
//判断每行的字符是否一致,如果一致,跳出游戏循环
for (i = 0; i < col; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2] != ' ')
{
return arr[i][0];
}
}
//判断每列的字符是否一致,如果一致,跳出游戏循环
for (i = 0; i < row; i++)
{
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[2][i] != ' ')
{
return arr[0][i];
}
}
//判断两个对角线
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] != ' ')
{
return arr[0][0];
}
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] != ' ')
{
return arr[0][2];
}
//判断棋盘是否下满
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
//如果有任意一个数组元素为 空格,说明棋盘还没有下满
if (arr[i][j] == ' ')
{
return 'y';
}
}
}
//否则,以上条件都不满足,和局
return 'c';
}
//开始游戏
void game_play()
{
//棋盘是3 * 3 的,所以我们创建一个二维数组
char arr[ROW][COL];
//初始化二维数组
init_arr(arr, ROW, COL);
//打印棋盘
game_che(arr, ROW, COL);
char ch = ' ';
while (1)
{
//玩家下棋
game_player(arr, ROW, COL);
//打印棋盘
game_che(arr, ROW, COL);
//判断输赢和平局
ch = game_yes_no(arr,ROW, COL);
//只要ch 不等于 y ,说明游戏已经分出胜负,不然就是平局,此时跳出循环
//到下方判断
if (ch != 'y')
{
break;
}
//电脑下棋
game_npc(arr, ROW, COL);
//不论输赢,最后一次打印棋盘
game_che(arr, ROW, COL);
//判断输赢和平局
ch = game_yes_no(arr, ROW, COL);
if (ch != 'y')
{
break;
}
}
// * 玩家赢
// # 电脑赢
// c 平局
if (ch == '*')
{
printf("玩家赢!\n");
}
else if (ch == '#')
{
printf("电脑赢!\n");
}
else if (ch == 'c')
{
printf("平局!\n");
}
}