今天用c语言来实现一个简单有趣的小游戏————三子棋!
三子棋的规则应该都不陌生吧 -_- .......
我一步,你(电脑)一步,无论是谁,每下完一步,就判断是否有三颗棋子在一条直线上,若在,则谁WIN!!
(这句话有待会写代码的逻辑思路哟!!)
好啦,现在开始着手如何实现整个代码 0.0 -------- 0.0
该程序分三个文件来完成 test.c(存放main函数) game.c(存放各种游戏函数) game.h(存放函数声明等)
先分析一下逻辑:
一:玩一个游戏,肯定得放在一个循环里,玩完一次又来一次,知道选择退出为止>>>>>>
所以我们在main函数里提供一个循环,进入循环就选择输入菜单,决定是否进入游戏,选择游戏开始则进入playgame()函数,选择退出就退出这个循环,程序结束。这里我们要保证main函数里的简洁性,现在,main函数就搭建好了----------代码1---------test.c
int main()
{
srand((unsigned int)time(NULL)); //产生随机数种子
int key = 0;
do
{
menu();
scanf("%d", &key);
if (key)
{
playgame();
}
else
{
printf("游戏结束\n");
break;
}
} while (key);
return 0;
}
二:首先,我们需要提供一个游戏菜单--------------代码2--------game.c
void menu()
{
printf("************** 欢迎光临 ******************\n");
printf("**************** 请选择 *********************\n");
printf("*****************1.开始游戏 ****************\n");
printf("*****************0.结束游戏 ****************\n");
}
三:进入游戏后,得打印一个棋盘吧,这就得思考一下了,棋盘用什么打印呢?待会棋盘还得放棋子呢,到底如何创建棋盘呢。嘿嘿,这里就得用到我们的二维数组了,想一想很nice吧!!创建棋盘二维数组后,则应该初始化吧(全初始化为空格),则需要一个初始化函数-------------代码三-------game.c
(memset为一个提供内存初始化的库函数,需引入头文件string.h)
void arr_init(char arr[ROW][CLO], int row, int clo)
{
memset(&arr[0][0],' ',row*clo*sizeof(arr[0][0]));
}
四:棋盘创建好了得打印出来吧,so,打印棋盘为一个函数-----------------代码4-------game.c
void print(char arr[ROW][CLO], int row, int clo)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < clo; j++)
{
printf(" %c ", arr[i][j]);
if (j <(clo - 1))
{
printf("|");
}
}
printf("\n");
for (j = 0; j < clo; j++)
{
printf("---");
if (j <(clo - 1))
{
printf("|");
}
}
printf("\n");
}
printf("\n");
}
五:每下一部棋之前,我们是不是得判断棋盘是否已经满了,若满了,则游戏结束,为平局,所以需要一个判断是否满盘的函数--------代码五------test.c
int judge_full(char arr[ROW][CLO],int row, int clo)
{
int i = 0;
int j = 0;
int num = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < clo; j++)
{
if (arr[row][clo] == ' ')
{
num++;
break;
}
}
}
if (num > 0)
return 1;
else
return 0;
}
六:判断完是否满盘后,若游戏没结束,则该玩家下棋啦,则需要一个玩家下棋的函数----------代码六--------test.c
void play_man(char arr[ROW][CLO])
{
int row = 0;
int clo = 0;
do
{
printf("请输入你要下的行和列:\n");
scanf("%d%d", &row, &clo);
if (row > 3 || clo > 3 || row < 0 || clo < 0)
{
printf("输入有误,请重新输入\n");
continue;
}
else if (arr[row-1][clo-1] != ' ') //坑二,不要写成arr[row][clo];
{
printf("这里有棋了,请重新输入\n");
continue;
}
else
{
arr[row - 1][clo - 1] = '0';
break;
}
} while (1);
}
七:玩家下完棋,是不是得判断是否赢了(此时也得判断是否盘满),若赢了,则游戏结束,若没赢,游戏继续,所以需要一个判断是否赢的函数---------代码七--------test.c
int judge(char arr[ROW][CLO])
{
int i = 0;
for (i = 0; i < 3; i++) //检测行
{
if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][2] != ' '))
{
return 1;
}
}
for (i = 0; i < 3; i++) //检测列
{
if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[2][i] != ' '))
{
return 1;
}
}
if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[0][0] != ' '))
{
return 1;
}
if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && ((arr[0][2] != ' ')))
{
return 1;
}
return 0;
}
八:若游戏没有结束,是不是得有一个电脑下棋的函数,此时则需要引入随机数的生成来完成电脑的下棋步骤---------代码八------------test.c
void play_computer(char arr[ROW][CLO])
{
while (1)
{
int row = rand() % 3;
int clo = rand() % 3;
if (arr[row][clo] == ' ')
{
arr[row][clo] = '1';
break;
}
}
}
九:(重点)上面二到八介绍了每一个步骤所需要的函数模块,此时,我们需要写一个playgame()函数来将二到八所有代码衔接到一起,来完成:
while(1)
<><><><><>打印棋盘------判断满盘------玩家输入------判断输赢、判断满盘-----电脑输入------判断输赢<><><><><><>
这样一个大循环
同样放入game.c文件中
void playgame()
{
char arr[ROW][CLO] = { 0 };
arr_init(arr,ROW,CLO);
int flag = 0;
print(arr, 3, 3);
while (1)
{
if (judge_full(arr, 3, 3))
{
printf("平局\n");
break;
}
play_man(arr);
print(arr, 3, 3);
flag = judge(arr);
if (flag)
{
printf("玩家赢\n");
break;
}
else if (judge_full(arr, 3, 3))
{
printf("平局\n");
break;
}
play_computer(arr);
Sleep(2000);
print(arr, 3, 3);
flag = judge(arr);
if (flag)
{
printf("电脑赢\n");
break;
}
}
}
最后,完成game.h头文件,提供每个函数的原型(声名)
#include<stdio.h>
#include<Windows.h>
#include<string.h>
#define ROW 3
#define CLO 3
void playgame();
void arr_init(char arr[ROW][CLO], int row, int clo);
void print(char arr[ROW][CLO], int row, int clo); //打印棋盘
void menu(); //打印菜单
void play_man(char arr[ROW][CLO]); //人类下棋
int judge(char arr[ROW][CLO]); //判断输赢
void play_computer(char arr[ROW][CLO]); //电脑下棋 都可以写成char arr[][3],但不能写成char arr[][];
int judge_full(char arr[ROW][CLO], int row, int clo); //判断棋盘是否已满