今天学习了一个鹏哥讲的三子棋游戏,学完之后自己总结了一下,特此分享出来,提醒自己不要忘记。虽然很简单,但是还是要理清其中的逻辑。经过这个游戏的学习,我感觉出画图理清逻辑的重要性。好多程序写不出来,感觉就是逻辑关系没有理清楚,所以以后的学习要多画图,要把关系理清晰,才是重中之重。好了,我把我初次画的图分享出来吧!
接下来一步一步来创建这个游戏:
第一步创建一个新项目:
现在写完了一部分代码,先来测试一下是不不是能够正常打印数组,和前面的逻辑是否正确,为了简单点直接截图了:
经过测试,初始化数组和打印数组等等功能的逻辑都是正确的:
接着我把全部程序都写完了:
// 下面是game.c文件的全部内容:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化函数
void InitArr(char arr[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' '; // 数组中的每一个元素都初始化成 ‘ ’空格
}
}
}
// 打印数组
void Display(char arr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//printf(" %c | %c | %c \n", arr[i][0], arr[i][1], arr[i][2]);
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1)
printf("|"); //如果不是最后一列就打印 |
}
printf("\n");
if (i < row - 1) // 如果是倒数第二行以前就执行
{
//printf("---|---|---\n");
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
// 玩家下棋
void WanJia(char arr[ROW][COL], int row, int col)
{
printf("玩家请下棋:\n");
int x = 0, y = 0; // 玩家输入的坐标
while (1)
{
printf("请输入坐标:");
scanf("%d %d", &x, &y);
printf("\n");
if ((x >= 1 && x <= row) && (y >= 1 && y <= col)) // 检测用户输入的是不是 1到 row(3)
{
if (arr[x - 1][y - 1] = ' ') // 如果用户输入的行列是空字符
{
arr[x - 1][y - 1] = '*';
break;
}
else
printf("输入错误,请重新输入\n");
}
}
}
// 判断数组是不是都输入满了
int IsFull(char arr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if ( arr[i][j] == ' ')
return 0;
}
}
return 1; // 前面没有检测到不满,这里就是满了。
}
// 判断输赢
char IsWin(char arr[ROW][COL], int row, int col)
{
// 判断每一行是不是都是一样的字符
int i = 0;
for (i = 0; i < row; i++)
{
// 如果这一行的字符都相等 且 不是空字符
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][1] != ' ')
return arr[i][1];
}
// 判断每一列是不是都是一样的字符
int j = 0;
for (j = 0; j < col; j++)
{
if(arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[1][j] != ' ')
return arr[1][j];
}
// 判断每个对角线是不是都是一样的字符
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[1][1] != ' ')
{
return arr[1][1];
}
// 判断是不是平局
// 判断是不是输入满了 如果满了就返回1 否则就返回0
int ret = IsFull(arr, row, col);
if (ret == 1)
return 'Q'; // 如果已经填满了 就是平局(因为前面两个判断都是谁赢了)
// 上面的谁?赢了 平局都没有符合条件的, 所以下面就剩下继续了
return 'C';
}
// 电脑下棋
void DianNao(char arr[ROW][COL], int row, int col)
{
printf("电脑开始下棋!\n");
while (1)
{
int x = rand() % row; //使用随机数 对行数 取余 都是不足一行的数
int y = rand() % col; // 在调用rand() 函数之前 一定要先设置 srand()
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
break; // 如果向数组里面写完了值, 就跳出循环
}
}
}
//***********************************************************************************
// 下面是game.h头文件的内容:
#pragma once
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
// 声明常量
#define ROW 3 // ROW 代表3行 以后想要改变行数从这里直接改
#define COL 3 // COL 代表3列 以后想要改变列数从这里直接改
// 声明函数
//初始化数组
void InitArr(char arr[ROW][COL], int row, int col);
// 打印数组
void Display(char arr[ROW][COL], int row, int col);
// 玩家下棋
void WanJia(char arr[ROW][COL], int row, int col);
// 判断输赢
char IsWin(char arr[ROW][COL], int row, int col);
// 电脑下棋
void DianNao(char arr[ROW][COL], int row, int col);
//***********************************************************************************
// 下面是test.c的文件内容 主函数在这个文件里
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("****************************\n");
printf("****** 1、开始游戏 *******\n");
printf("****** 0、结束游戏 *******\n");
printf("****************************\n");
}
void game()
{
// 1、创建数组
char arr[ROW][COL];
// 2、初始化数组
InitArr(arr, ROW, COL);
// 3、打印数组
Display(arr, ROW, COL);
// 创建接收结果的变量
char ret = 0;
while (1)
{
// 玩家下棋
WanJia(arr,ROW, COL);
// 打印数组
Display(arr, ROW, COL);
// 判断输赢
ret = IsWin(arr, ROW, COL);
if (ret != 'C')
break; // 如果返回结果不是C就跳出循环
// 电脑下棋
DianNao(arr, ROW, COL);
// 打印数组
Display(arr, ROW, COL);
// 判断输赢
ret = IsWin(arr, ROW, COL);
if (ret != 'C')
break; // 如果返回结果不是C就跳出循环
}
if (ret == '*')
printf("********************玩家赢!*********************\n");
if (ret == '#')
printf("####################电脑赢######################\n");
if (ret == 'Q')
printf("QQQQQQQQQQQQQQQQQ 平局 QQQQQQQQQQQQQQQQQ\n");
// 打印数组
Display(arr, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); // 先设置了srand() ,后面才能使用随机数函数rand().
do
{
menu();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏!\n");
game();
break;
case 0:
printf("结束游戏!\n");
break;
default:
printf("输入错误,重新输入!\n");
break;
}
} while (input);
}
按照上面的代码写三个文件,就能写出三字棋游戏了,我们来看看运行后的效果吧!
好了,这就是我这一上午的时间写的这么多的代码了。特此记录一下,防止自己忘记过程。