C语言实现简单的小游戏之‘三子棋’-1.0
这是本人用C语言实现的三子棋:
利用C语言实现三子棋,首先你的C语言技术要达到会使用二维数组。
我在实现三子棋的代码中创建了三个文件:game.h(头文件) game.c(游戏函数) main.c(主函数)。
我们写代码都是从主函数开始的,game.h(头文件)是我们用来函数声明和宏定义的地方,这样game.c和main.c都可以用到宏定义的东西和声明的函数。
下面是game.h中的内容:
//这里我们创建了一个头文件-game.h 头文件里面放我们将要用函数声明。
#include <stdio.h>//scanf和printf这两个库函数的头文件包含。
#include <time.h>//time()库函数但头文件包含。
#include <stdlib.h>//rand()和srand()库函数但头文件包含。
#define HANG 3//宏定义的二维数组‘行’为 3.
#define LIE 3//宏定义的二维数组‘列’为 3.
void caidan();//自定义的菜单函数的声明。
void xuanzhe();//自定义游戏选择函数声明。
void game();//自定义游戏函数的声明。
void chushihua(char arr[HANG][LIE]);//自定义初始化二维数组函数声明。
void print(char arr[HANG][LIE]);//自定义打印棋盘函数的声明。
void wanjia(char arr[HANG][LIE]);//自定义玩家下棋函数的声明。
void dianniao(char arr[HANG][LIE]);//自定义电脑下棋函数的声明。
char panduan(char arr[HANG][LIE]);//判断谁赢函数的声明。
int pingju(char arr[HANG][LIE]);//判断平局函数的声明。
这main.c中的内容,下面看不懂的函数在上面已经注释过了。
#include "game.h"//用头文件(game.h)时需要进行声明。
//本人个人认为将主函数main()放在开头便于阅读,这样需要在主函数前面进行函数声明。
//但是我在头文件(game.h)中已进行函数声明,我这用了#include "game.h",不需要再声明了
int main()
{
caidan();
return 0;
}
void caidan()
{
printf("*************************n");
printf("*************************n");
printf("*******1. 玩游戏 *******n");
printf("*******2.不玩游戏 *******n");
printf("*************************n");
printf("*************************n");
xuanzhe();
}
void xuanzhe()
{
printf("请输入:");
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 2:
printf("游戏结束n");
break;
default:
printf("输入错误,请重新输入!n");
xuanzhe();//选择函数的调用。
break;
}
}
void game()
{
char arr[HANG][LIE] = { 0 };// rand()是生成随机数的函数
srand((unsigned int)time(NULL));//rand()函数在用之前需要调用srand()函数
chushihua(arr);//srand()的括号中必须是无符号整形而且是可变的
print(arr);//time(NULL)可以产生可变的无符号整形,这样rand()产生的随机数才是可变的
while (1)
{
wanjia(arr);
print(arr);
if (panduan(arr) != 'c')//panduan()会返回'c' 'p' '#' '*'
break;//'c'表示继续 'p'表示平局
dianniao(arr);
print(arr);
if (panduan(arr) != 'c')
break;
}
if (panduan(arr) == '#')
printf("玩家胜利!n");
else if (panduan(arr) == '*')
printf("电脑胜利!n");
else
printf("平局!n");
caidan();
}
下面是game.c中的内容:
#include "game.h"
void chushihua(char arr[HANG][LIE])//将二维数组全部初始化为空格
{
int i = 0;
int j = 0;
for (i = 0; i < HANG; i++)
{
for (j = 0; j < LIE; j++)
{
arr[i][j] = ' ';
}
}
}
void print(char arr[HANG][LIE])//打印棋盘
{
int i = 0;
int j = 0;
for (i = 0; i < HANG; i++)
{
for (j = 0; j < LIE; j++)
{
printf(" %c ", arr[i][j]);
if (j < LIE - 1)
printf("|");
}
printf("n");
if (i < HANG - 1)
{
for (j = 0; j < LIE; j++)
{
printf("---");
if (j < LIE - 1)
printf("|");
}
}
printf("n");
}
}
void wanjia(char arr[HANG][LIE])
{
int x = 0;
int y = 0;
printf("玩家下棋:");
while (1)
{
scanf("%d %d", &x, &y);
if (x > 0 && x <= HANG && y > 0 && y <= LIE)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '#';
break;
}
else
{
printf("n该棋格以被占用,请重新输入:");
}
}
else
{
printf("n输入错误,请重新输入: ");
}
}
}
void dianniao(char arr[HANG][LIE])
{
printf("电脑下棋:n");
while (1)
{
int x = rand() % HANG;//rand()是生成随机数的函数
int y = rand() % LIE;//给rand()%3生成只有0 1 2的随机数
if (arr[x][y] == ' ')
{
arr[x][y] = '*';
break;
}
}
}
char panduan(char arr[HANG][LIE])
{
int x = 0;
int y = 0;
for (x = 0; x < HANG; x++)
{
if (arr[x][0] == arr[x][1] && arr[x][1] == arr[x][2] && arr[x][2] != ' ')
{
return arr[x][0];
break;
}
}
for (y = 0; y < LIE; y++)
{
if (arr[0][y] == arr[1][y] && arr[1][y] == arr[2][y] && arr[2][y] != ' ')
{
return arr[0][y];
break;
}
}
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];
if (1 == pingju(arr))
return 'p';
return 'c';
}
int pingju(char arr[HANG][LIE])
{
int x = 0;
int y = 0;
for (x = 0; x < HANG; x++)
{
for (y = 0; y < LIE; y++)
{
if (arr[x][y] == ' ')
return 0;
}
}
return 1;
}
在看的过程中一定要结合代码中的注释一起看,不懂得地方可以私信本人!
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码