目录
前言
一.什么是三子棋?
二.三子棋(N子棋)设计思路
1.主函数
2.数组的初始化
3.菜单
4.游戏主体
(1).棋盘
(2).下棋
(3).判断胜负
三.最终代码
源文件1
源文件2
头文件
在了解了二维数组之后,我们便可以完成我们的第二个游戏——三子棋(N子棋)
三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。
设计一切程序的开始,都要确立好主函数。
而N子棋本质上便是一个行为N、列为N的二维函数。
由于二维数组的行和列只能为常量表达式,所以我们选择在头文件中用“#define“”定义全局变量N作为二维数组的行和列。
以下程序的撰写皆以三子棋为例
如此我们便初步得到了一个主函数
int main()
{
char arr[N][N];
return 0;
}
为保证主函数的简便,我们将其他部分打包为自定义函数。
为了使游戏更加整洁,我们选择将数组所有元素初始化为‘ ’
void new(char arr[N][N]) { int i,j; for(i=0;i
int main()
{
char arr[N][N];
new(arr);
return 0;
}
首先游戏需要有一个菜单供玩家选择游玩
由于这是一个简单的游戏,所以我们可以设置开始游戏与退出两个选项。
int menu() { int input=0; printf("1——开始游戏 2——退出\n"); printf("请选择=>"); scanf("%d",&input); if(input==1) { printf("加载中---\n"); sleep(1); return 1; } else if(input==2) printf("正在退出\n"); else printf("输入错误,请重新输入\n"); }
在这里我们自定义了一个具有返回值的函数menu(),而这个返回值将决定游戏的运行
由上述代码可知,当返回值为1时开始游戏
首先先将自定义函数game(arr)作为游戏主体放置在主函数中
int main()
{
char arr[N][N];
new(arr);
if(menu()==1)
{
game(arr);
}
return 0;
}
在开始下棋之前,我们需要有一个棋盘来让我们更加直观的观看下棋的过程
void list(char arr[N][N]) { int i,j; for(i=0;i
这样我们便可以得到一个这样的棋盘
随着二维数组的改变,这个棋盘也会不断变化,所以我们需要多次引用这个自定义函数
首先,我们将我们下一步棋(选用O)与电脑下一步棋(选用X)算作一个整体
我们便可以以这个整体作循环来完成下棋这一过程
a.自己下棋
首先我们先写出一个基础的主体
int x,y;
printf("请输入坐标=>");
scanf("%d%d",&x,&y);
arr[x-1][y-1]='O';
之后我们便可以为此加“亿点点”细节
首先为了避免在已经下过棋子的位置上重复下棋,或者为了避免输入的坐标不合法(超出数组范围),我们都可以使用分支与循环函数。
而为了美观和便利,我们可以选择使用清屏函数——system("cls")和上面讲到的list(arr)函数。
while(1)
{
system("cls");
list(arr);
int x,y;
printf("请输入坐标=>");
scanf("%d%d",&x,&y);
if(x>0&&x<=N&&y>0&&y<=N)
{
if(arr[x-1][y-1]!='O'&&arr[x-1][y-1]!='X')
{
arr[x-1][y-1]='O';
break;
}
else
printf("该位置存在棋子,请重新输入\n");
}
else
printf("不存在该坐标,请重新输入\n");
}
这样我们自己下一步棋的代码便初步完成了。
b.电脑下棋
想要让电脑在任意空位置下棋(在数组中为任意一个为‘ ’的元素赋值为‘X’),我们要运用到之前在猜数字游戏中学习到的随机数。
而想要让随机值在一次游戏中顺序不变,我们选择将srand()函数放置在主函数中。
int main()
{
srand((unsigned int) time(NULL));
char arr[N][N];
new(arr);
if(menu()==1)
{
game(arr);
}
return 0;
}
while(1)
{
int a,b;
a=rand()%N;//使随机值范围在数组范围之内
b=rand()%N;//使随机值范围在数组范围之内
if(arr[a][b]!='O'&&arr[a][b]!='X')
{
printf("电脑思考中---\n");
sleep(2);
arr[a][b]='X';
list(arr);
break;
}
}
而sleep()函数与list()函数也是让程序更加美观便利。
c.整合
在完成上述两方的下棋后,我们便可以将其整合
while(1) { while(1) { system("cls"); list(arr); int x,y; printf("请输入坐标=>"); scanf("%d%d",&x,&y); if(x>0&&x<=N&&y>0&&y<=N) { if(arr[x-1][y-1]!='O'&&arr[x-1][y-1]!='X') { arr[x-1][y-1]='O'; count++; break; } else printf("该位置存在棋子,请重新输入\n"); } else printf("不存在该坐标,请重新输入\n"); } while(1) { int a,b; a=rand()%N; b=rand()%N; if(arr[a][b]!='O'&&arr[a][b]!='X') { printf("电脑思考中---\n"); sleep(2); arr[a][b]='X'; count++; list(arr); break; } } }
上述代码是自动选择玩家先手,我们也可以通过分支语句来让玩家选择先手情况,这里就不再多做赘述。
当我们完成上述代码后,在一定程度上便可以开始游玩,但我们还需要判断游戏的胜负来终止这一次的游戏。
而这种判断,应该在每一步棋子下完之后就进行一次。
胜负应该如何判断呢?
我们知道,三子棋胜负有三种判断方式——横向连一行、纵向连一列或者对角线连成一排
所以我们要通过三次不同的判断来完成胜负的判断
在这里,我选用的是通过count变量,当一排数组内存在‘O’或‘X’,我们将count “+1”或“-1”,这样当count=3或-3时,便能判断出胜负
int end(char arr[N][N])
{
int count_1=0,count_2=0,count_3=0;
int i,j;
for(i=0;i
当然游戏不只是胜负,还存在平局的情况
三子棋平局时便是将棋盘填满
我们选择变量count,在下每一步棋时,我们将count+1,当变量等于9时,若没有判断出胜负,便是平局的情况。
int end(char arr[N][N],int count) { int count_1=0,count_2=0,count_3=0; int i,j; for(i=0;i
这样,我们便可以将这件代码组合在一起,完成程序的设计
#include
#include"mean.h"
void game(char arr[N][N])
{
int count=0;
list(arr);
while(1)
{
while(1)
{
system("cls");
list(arr);
int x,y;
printf("请输入坐标=>");
scanf("%d%d",&x,&y);
if(x>0&&x<=N&&y>0&&y<=N)
{
if(arr[x-1][y-1]!='O'&&arr[x-1][y-1]!='X')
{
arr[x-1][y-1]='O';
count++;
break;
}
else
printf("该位置存在棋子,请重新输入\n");
}
else
printf("不存在该坐标,请重新输入\n");
}
int m=0;
m=end(arr,count);
if(m==1)
{
list(arr);
break;
}
while(1)
{
int a,b;
a=rand()%N;
b=rand()%N;
if(arr[a][b]!='O'&&arr[a][b]!='X')
{
printf("电脑思考中---\n");
sleep(2);
arr[a][b]='X';
count++;
list(arr);
break;
}
}
m=end(arr,count);
if(m==1)
{
list(arr);
break;
}
}
}
int main()
{
srand((unsigned int) time(NULL));
char arr[N][N];
new(arr);
if(menu()==1)
{
game(arr);
}
return 0;
}
#include
#include"mean.h"
int menu()
{
int input=0;
printf("1——开始游戏 2——退出\n");
printf("请选择=>");
scanf("%d",&input);
if(input==1)
{
printf("加载中---\n");
sleep(1);
return 1;
}
else if(input==2)
printf("正在退出\n");
else
printf("输入错误,请重新输入\n");
}
void list(char arr[N][N])
{
int i,j;
for(i=0;i
#define N 3
void list(char arr[N][N]);
int menu();
void new(char arr[N][N]);
int end(char arr[N][N],int count);