IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言之三子棋基础版 -> 正文阅读

[C++知识库]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;
}

总结

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 11:44:21  更:2021-09-01 11:47:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 20:34:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计