c语言实现三子棋 我们需要掌握二维数组,自定义函数,循环结构,选择结构以及利用时间戳设置随机变量等知识即可。
要实现三子棋首先我们写出大概的框架然后通过函数一步一步实现。
例如下面我们将游戏的框架放在文件test.c(内容如下)
~~~c
#include "game.h" //将所有的头文件放在一个文件里统一调用
int main()
{
menu(); //菜单栏
input(); //按菜单提示输入
srand((unsigned int)time(NULL)); //通过时间戳 设置随机数
//这个时间戳可能才开始想不到,但根据后面需要,要加在这里
system("pause");
return 0;
}
~~~
按照我们的想法,将我们所用到的自定义函数具体实现放到文件game.c (内容如下)
~~~c
#define _CRT_SECURE_NO_WARNINGS 1 //使scanf函数正常使用
#include "game.h" //将所有的函数头文件放在 game.h这个文件里然后统一调用,使内容更加清晰
//游戏菜单
void menu()
{
printf("**********************\n");
printf("****1.play 0.quit****\n");
printf("**********************\n");
}
//选择栏
void input()
{
int input = 0; //初始化要放在do-while外面
do
{
scanf("%d", &input);
switch (input)
{
case 0:
printf("成功退出游戏!!!\n");
break;
case 1:
printf("准备进入游戏\n");
game();
break;
default:
printf("输入有误,请重新输入!!!\n");
break;
}
} while (input); //0为假,非0即真
}
//游戏算法
void game()
{
char arr[3][3] = { 0 };
fomart(arr);//初始化棋盘
display(arr);//打印棋盘,给玩家展示
//下棋
while (1)
{
player(arr); //玩家走 将玩家输入的坐标传到数组arr
display(arr); //打印棋盘,将玩家下棋的位置打印展示
player_win(arr); //玩家获胜
int ret = player_win(arr);
if (ret == 0)
{
printf("玩家获胜!!!\n");
printf("****1.play 0.quit****\n");
break;
}
//平局要放到电脑走之前,玩家先下,最后一步也是由玩家完成的,电脑将无子可下!!!
tie(arr);
int jug = tie(arr);
if (jug) // 退出返回1,则表明棋盘已下满,打印平局,结束游戏
{
printf("平局\n");
printf("****1.play 0.quit****\n");
break;
}
computer(arr); //电脑走
display(arr); //打印棋盘
computer_win(arr); //电脑获胜
ret = computer_win(arr);
if (ret == 1)
{
printf("电脑获胜\n");
printf("****1.play 0.quit****\n");
break;
}
}
}
//棋盘初始化
void fomart(char arr[3][3])
{
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
arr[i][j] = ' ';
}
}
}
//打印棋盘
void display(char arr[3][3])
{
int i = 0;
int j = 0;
int t = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf(" %c ", arr[i][j]);
if (j < 2)
{
printf("|");
}
}
printf("\n");
if (i <= 1)
{
for (t = 0; t < 3; t++)
{
printf("---");
if (t < 2)
{
printf("|");
}
}
printf("\n");
}
}
}
//玩家下棋
void player(char arr[3][3])
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入您所要下的坐标\n");
scanf("%d%d", &x, &y);
if (1 <= x && x <= 3 && y <= 3 && y >= 1) //所下的坐标合法化
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '*'; //非程序员的一般人不了解数组,所以按照正常人的思维设计
break;
}
else
{
printf("该坐标已被占用\n");
}
}
else
{
printf("输入非法\n");
}
}
}
//电脑下棋
void computer(char arr[3][3])
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % 3; //设置随机数模3 取余为0,1,2 使其坐标合法化
y = rand() % 3;
if (arr[x][y] == ' ')
{
printf("电脑走\n");
Sleep(1000); //睡眠一秒,给玩家一种游戏代入感
arr[x][y] = '#';
break;
}
}
}
//玩家赢
int player_win(char arr[3][3])
{
if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] != ' ') //横三
{
return 0;
}
else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] != ' ') //横三
{
return 0;
}
else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] != ' ') //横三
{
return 0;
}
else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] != ' ') //对角线
{
return 0;
}
else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] != ' ') //对角线
{
return 0;
}
else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] != ' ') //竖三
{
return 0;
}
else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[2][1] != ' ') //竖三
{
return 0;
}
else if (arr[0][2] == arr[1][2] && arr[2][2] == arr[1][2] && arr[2][2] != ' ') //竖三
{
return 0;
}
}
//电脑赢
int computer_win(char arr[3][3])
{
if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] != ' ') //横三
{
return 1;
}
else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] != ' ') //横三
{
return 1;
}
else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] != ' ') //横三
{
return 1;
}
else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] != ' ') //对角线
{
return 1;
}
else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] != ' ') //对角线
{
return 1;
}
else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] != ' ') //竖三
{
return 1;
}
else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[2][1] != ' ') //竖三
{
return 1;
}
else if (arr[0][2] == arr[1][2] && arr[2][2] == arr[1][2] && arr[2][2] != ' ') //竖三
{
return 1;
}
}
//平局
int tie(char arr[3][3])
{
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
if (arr[i][j] == ' ') //如果数组有空格则棋盘未下满,继续下棋
{
return 0;
}
}
}
return 1; //退出返回1,则表明棋盘已下满
}
~~~
为了使代码内容更易于人们阅读 我们将所有的函数的头文件以及函数声明放在同一个文件里game.h(内容如下)
~~~c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
void game(); //游戏算法
void fomart(char arr[3][3]); //初始化棋盘
void input(); //选择栏,按提示输入
void menu(); //菜单
void display(char arr[3][3]); //打印棋盘
void player(char arr[3][3]); //玩家下棋
void computer(char arr[3][3]); //电脑下棋
int player_win(char arr[3][3]); //玩家获胜
int computer_win(char arr[3][3]); //电脑获胜
int tie(char arr[3][3]); //平局
~~~
这样我们就完成了整个三子棋的制作,完结撒花~~~
建议使用vs编译器,亲测有效~~~