前言
最近有点迷上了自制小游戏,所以就把三子棋给写完了,三子棋实现的功能是我落子,然后电脑随机落子。这个三子棋后续也可进行简单的修改,使其变为五子棋。然后我所说的基础版就是没有做图形化界面,只实现了底层基本功能。后续也会增加图形界面。
功能演示
开发环境
vc++6.0
游戏规则
规则大家都比较熟悉。 先是玩家输入坐标,在控制台打印字符‘X’,然后轮到电脑随机输入坐标,并在控制台打印‘O’。直到有一方横着或竖着或对角线的三格都为同一字符,则游戏结束,并打印出是哪一方胜利。如果在九宫格都满了的情况下没有出现胜利的情况,则打印显示该局为平局。
代码实现
1、打印地图
定义的字符型二维数组,对数组内的元素都为空格,空格就是用来落子的地方。落子的实际就是用字符’X’或者’O’来赋值给空格。
char map[3][3] = {
' ',' ',' ',
' ',' ',' ',
' ',' ',' '};
void PrintMap()
{
int i;
for(i=0;i<3;i++)
{
printf("| %c | %c | %c |\n",map[i][0],map[i][1],map[i][2]);
printf("+---+---+---+\n");//使其更加像棋盘
}
}
2、玩家落子
从键盘中输入坐标,判断该坐标是否为空格,如果是空格则可以用’X’代替空格,否则就显示该坐标被占用了。
void Play_game()
{
int x,y;
printf("<玩家下棋>坐标为(x,y):");
while(1)
{
scanf("%d %d",&x,&y);
if(x>=0 && x<=2 && y>=0 && y<=2)//设置坐标范围
{
if(map[x][y] ==' ')
{
map[x][y] = 'X';
break;
}
else printf("该坐标已被占用,请重新输入坐标\n");
}
else printf("无效坐标,请重新输入\n");
}
}
3、电脑落子
电脑需要随机落子,就要用到随机函数。先要种下一个随机种子,然后设定随机数的范围。想要使用rand()函数产生一个(a,b)区间的数,可用到公式a+rand%(b-a+1);这里使得随机数在0-2之间进行取值。 如果有想深究随机函数原理的同学,我个人推荐去看这篇文章—>C语言随机函数:rand()和srand()的使用及示例
void Computer_game()
{
srand(time(NULL));//随机种子
int x=0,y=0;
while(1)
{
x = (int)rand()%3;//x的范围为0-2
y = (int)rand()%3;//y的范围为0-2
if(map[x][y] ==' ')
{
map[x][y] = 'O';
break;
}
}
}
4、游戏结束
如果出现当一条直线或者一条斜线都是同一个符号,则游戏结束,并且返回 如果棋盘下满了都未有一方,则打印平局。扫描整个地图,判断是否还有空格存在,没有空格则说明下满了。
//判断条件,当一条直线或者一条斜线都是同一个符号,则结束
char Game_over()
{
int x,y;
//竖着的都相等
for(x=0;x<3;x++)
{
if(map[x][0] == map[x][1] && map[x][1] == map[x][2] && map[x][1] != ' ')
{
return map[x][0];//胜利
}
}
//横着的相等
for(y=0;y<3;y++)
{
if(map[0][y] == map[1][y] && map[1][y] == map[2][y] && map[1][y] != ' ')
{
return map[0][y];//胜利
}
}
//对角线相等
if(map[0][0] == map[1][1] && map[1][1] == map[2][2] && map[1][1] != ' ' )
{
return map[0][0];//胜利
}
if(map[0][2] == map[1][1] && map[1][1] == map[2][0] && map[1][1] != ' ')
{
return map[0][2];//胜利
}
//棋盘下满了,平局
if(!Full_map())
{
return 'P';
}
return 'C'; //返回C 表示游戏结束标志
}
int Full_map()
{
int x,y;
for(x=0;x<3;x++)
{
for(y=0;y<3;y++)
{
//如果整个地图中,有一个等于‘ ’,则返回1;
if(map[x][y] == ' ') return 1;
}
}
return 0;
}
5、main函数和头文件
最后就是头文件和主函数了。
#include<stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
char ret = 0;
while(1)
{
Print_map();
Play_game();
ret = Game_over();
if (ret != 'C') //用字符C游戏结束状态
break;
Computer_game();
ret = Game_over();
if (ret != 'C') //用字符C游戏结束状态
break;
system("cls");//清屏函数
}
//这里是为了跳出while循环后能够继续打印结果
system("cls");
Print_map();
if (ret == 'X')
printf("玩家赢\n");
else if (ret == 'O')
printf("电脑赢\n");
else if(ret == 'P')
printf("平局\n");
return 0;
}
总结
想要验证程序的小伙伴,可以直接把上面所有的代码复制过去就可以了。