C语言之三子棋基础版

前言

最近有点迷上了自制小游戏,所以就把三子棋给写完了,三子棋实现的功能是我落子,然后电脑随机落子。这个三子棋后续也可进行简单的修改,使其变为五子棋。然后我所说的基础版就是没有做图形化界面,只实现了底层基本功能。后续也会增加图形界面。

功能演示

在这里插入图片描述

开发环境

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;
}

总结

想要验证程序的小伙伴,可以直接把上面所有的代码复制过去就可以了。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是小白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值