C语言:三子棋小游戏

news2024/12/23 13:35:43

简介:

目标很简单:实现一个 三子棋小游戏。三子棋大家都玩过,规则就不提及了。本博文中实现的三子棋在对局中,电脑落子是随机的,不具有智能性,玩家的落子位置使用键盘输入坐标。下面开始详细介绍如何实现一个简单的三子棋游戏。

步骤一:制定框架

想要实现一个小游戏,第一件事就是制定框架,那么制定框架是什么意思?怎么制定框架?

#include"chess.h"
int main()
{
	int n = 0;
	do
	{
		menu();
		printf("input:\n");
		scanf("%d", &n);
		switch(n)
		{
		case 1:
			game();
			break;
		case 0:
			printf("exit\n");
			break;
		default:
			printf("input error,input again:\n");
			break;
		}
	} while(n);
	return 0;
}

这里的menu函数只是一个打印函数,定义如下:

void menu()
{
	printf("**************\n");
	printf("*** 1.play ***\n");
	printf("*** 0.exit ***\n");
	printf("**************\n");
}

将main函数写全就是制定了一个完整的框架,只要我们输入1,就会进入game函数(之后实现)进行游戏,输入0就会退出游戏,结束程序,输入其他数会让我们重新输入。整个过程就是这么简单。我们只需要实现了game的过程,整个游戏就制作完成了。

那么game函数怎么实现呢?

步骤二:实现game函数

 我们在做一个项目的时候,需要把函数的声明放在头文件里,函数的定义放在源文件里,但是具体情况可以根据个人偏好来,我个人是喜欢把主函数里会用到的函数声明放进头文件里,定义放在源文件里。如果在函数的定义中需要实现另外一个函数,就在另外一个函数的声明和定义就都放在源文件里。

要实现game函数,我们需要先将game的流程想清楚:

我们默认玩家先下棋,玩家输入一个合法坐标,然后电脑在下棋。并且每当玩家或者电脑下棋之后需要判断对局是否结束,如果结束,那么最后落子的一方胜利。另外,在玩家或者电脑下棋之后我们需要将棋盘和棋子打印出来。

void game()
{
	char pieces[ROW][COL] = { 0 };
	piecesInit(pieces, ROW, COL);
	board(pieces, ROW, COL);
	while (1)
	{
		system("cls");
		board(pieces, ROW, COL);
		printf("player move!\n");
		playerMove(pieces, ROW, COL);
		system("cls");
		board(pieces,ROW,COL);
		if (judge(pieces, ROW, COL))
		{
			printf("you win\n");
			break;
		}
		printf("computer move!\n");
		computerMove(pieces, ROW, COL);
		Sleep(1000);
		system("cls");
		board(pieces, ROW, COL);
		if (judge(pieces, ROW, COL))
		{
			printf("you lose\n");
			break;
		}
	}
}

pieces二维数组是用来储存棋子位置信息的,玩家的棋子是星号,电脑的棋子是井号

下面对game函数中用到的函数进行解释:

piecesInit:将pieces初始化,使得每一个元素都是空格,这样初始状态就不会打印出棋子

board:传入pieces数组,将棋盘和棋子一并打印

playerMove:玩家下棋,将pieces中的一个空格元素变为星号

computerMoe:电脑下棋,将pieces中的一个空格元素变为井号

judge:返回值是int,如果对局结束了就返回1,未结束返回0

这样整个game的流程就形成了

步骤三:实现game函数中的各个函数

void board(char pieces[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		printf(" %c | %c | %c \n",pieces[i][0],pieces[i][1],pieces[i][2]);
		if (i < row - 1)
		{
			printf("---|---|---\n");
		}
	}
}//如果不理解,可以在自己的电脑上把棋盘敲出来,就会明白board函数的原理,不敲出来不可能搞明白
void playerMove(char pieces[ROW][COL],int row,int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("x:\n");
		scanf("%d", &x);
		printf("y:\n");
		scanf("%d", &y);
		x--;//用户输入的起始位置是1,而数组下标起始位置是0
		y--;
		if (x < 0 || x>2 || y < 0 || y>2 || pieces[x][y] != ' ')//判断是否非法
			printf("error,again\n");
		else
		break;//正确输入,退出循环
	}
	pieces[x][y] = '*';
}
void computerMove(char pieces[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % 3;//取0到2的一个数
		y = rand() % 3;
		if (x >= 0 && x <= 2 && y >= 0 && y <= 2 && pieces[x][y] == ' ')//如果位置合法
		{
			pieces[x][y] = '#';
			break;
		}
	}
}
int judge(char pieces[ROW][COL], int row, int col)
{
	//判断是否有一行三个棋子一样
	for (int i = 0; i < row; i++)
	{
		int sum = pieces[i][0] + pieces[i][1] + pieces[i][2];
		if (sum == 3 * '*' || sum == 3 * '#')
			return 1;
	}
	//判断是否有一列三个棋子一样
	for (int j = 0; j < col; j++)
	{
		int sum = pieces[0][j] + pieces[1][j] + pieces[2][j];
		if (sum == 3 * '*' || sum == 3 * '#')
			return 1;
	}
    //判断两个对角线是否有三个棋子一样
	int sum1 = pieces[0][0] + pieces[1][1] + pieces[2][2];
	int sum2 = pieces[0][2] + pieces[1][1] + pieces[2][0];
	if (sum1 == 3 * '*' || sum1 == 3 * '#' || sum2 == 3 * '*' || sum2 == 3 * '#')
		return 1;
	return 0;
}

这样就实现了一个简单的三子棋,看看效果如何:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/964397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年王炸面试题每日一练--为什么会有精度的损失

基本数据类型中为什么会出现精度损失&#xff0c;怎么样会避免出现精度损失 loat 32位 出现精度损失的原因&#xff1a; 输入的值为十进制&#xff0c;而在计算的过程中&#xff0c;是要把十进制的小数位值在有限位的情况下转变为二进制的小数&#xff0c;就会出现精度的损失…

十一、MySQL(DQL)聚合函数

1、聚合函数 注意&#xff1a;在使用聚合函数时&#xff0c;所有的NULL是不参与运算的。 2、实际操作&#xff1a; &#xff08;1&#xff09;初始化表格 &#xff08;2&#xff09;统计该列数据的个数 基础语法&#xff1a; select count(字段名) from 表名; &#xff1b;统…

绿色光伏代步工具

太阳能是可再生能源&#xff0c;光线的来源是太阳&#xff0c;几乎不会枯竭。相比化石燃料等非可再生能源&#xff0c;太阳能的利用不会对资源造成耗竭和短缺问题&#xff0c;在现今社会中的文化&#xff0c;旅游层面&#xff0c;也已经得到充分的发展和拓展出多方面的应用模式…

JAVA 求最小公因数

JAVA 求最小公因数 文章目录 JAVA 求最小公因数方法一&#xff1a;枚举法的第一种方法一&#xff1a;枚举法的第二种方法二&#xff1a;展转相除法(欧几里德算法)方法三&#xff1a;递归拓展 求最小公倍数公式为 题目&#xff1a;任意输入两个整数&#xff0c;如何求他们的最大…

使用VisualStudio制作上位机(六)

文章目录 使用VisualStudio制作上位机&#xff08;六&#xff09;第五部分&#xff1a;应用程序打包第一步&#xff1a;勾选为Release模式第二步&#xff1a;生成解决方案第三步&#xff1a;将我们额外添加的文件放入到Release这个文件夹里 使用VisualStudio制作上位机&#xf…

400. 第 N 位数字

链接&#xff1a; ​​​​​​400. 第 N 位数字 题解&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 class Solution { public:int findNthDigit(int n) {int len1;//初始数字长度为1int base1;//初始范围为1~9while(n>(long)len…

ROS机器人编程ROS机器人编程---------(三)创建工作空间和功能包

创建工作空间和功能包 创建工作空间 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace编译工作空间 cd ~/catkin_ws/ catkin_make设置环境变量 source devel/setup.bash检查环境变量 echo $ROS_PACKAGE_PATH创建功能包 cd ~/catkin_ws/src catkin_crea…

【word密码】如何限制word文件中部分内容?

Word文件中有一部分内容不想他人编辑&#xff0c;我们可以设置限制编辑&#xff0c;可以对一部分内容设置限制编辑&#xff0c;具体方法如下&#xff1a; 我们将需要将可以编辑的地方选中&#xff0c;然后打开限制编辑功能 然后勾选限制编辑设置界面中的【限制编辑】和【每个人…

RT-Thread 中断管理学习(一)

中断管理 什么是中断&#xff1f;简单的解释就是系统正在处理某一个正常事件&#xff0c;忽然被另一个需要马上处理的紧急事件打断&#xff0c;系统转而处理这个紧急事件&#xff0c;待处理完毕&#xff0c;再恢复运行刚才被打断的事件。生活中&#xff0c;我们经常会遇到这样…

LDAP服务器如何重启

1、find / -name ldap 该命令只会从根路径下查看ldap文件夹 find / -name ldap2、该命令会从根路径/查看所有包含ldap路径的文件夹&#xff0c;会查询出所有&#xff0c;相当于全局查询 find / -name *ldap*2、启动OpenLADP 找到LDAP安装目录后&#xff0c;执行以下命令 #直…

Mysql主从服务安装配置

1.下载地址 MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ 2.安装配置 1.下载解压后&#xff0c;拷贝一份作为slave的安装目录 3.配置my.ini 由于下载mysql8版本&#xff0c;解压后&#xff0c;没有相关的my…

每日一题-动态规划(从不同类型的物品中各挑选一个,使得最后花费总和等于1000)

四种类型的物品&#xff0c;每一种类型物品数量都是n&#xff0c;先要从每种类型的物品中挑选一件&#xff0c;使得最后花费总和等于1000 暴力做法10000^4 看到花费总和是1000&#xff0c;很小且固定的数字&#xff0c;肯定有玄机&#xff0c;从这里想应该是用dp&#xff0c;不…

数据库-DQL

DQL&#xff1a;用来查询数据库表中的记录 关键字&#xff1a;SELECT 语法&#xff1a; select&#xff1a;字段列表 from&#xff1a;表名列表 where&#xff1a;条件列表 group by&#xff1a;分组列表 having&#xff1a;分组后条件列表 order by&#xff1a;排序字段列表…

解决windows下安装python并终端运行python弹出windows商店的最终解决方案

最近在windows下安装了python&#xff0c;在终端中运行python命令的时候总是会弹出windows商店 为了解决这个问题&#xff0c;我修改系统的环境变量也一直不起作用&#xff0c;只有指定绝对路径时才能正常启动&#xff0c;这个问题困扰了我很长一段时间&#xff0c;后来了解到…

Linux知识点 -- Linux多线程(四)

Linux知识点 – Linux多线程&#xff08;四&#xff09; 文章目录 Linux知识点 -- Linux多线程&#xff08;四&#xff09;一、线程池1.概念2.实现3.单例模式的线程池 二、STL、智能指针和线程安全1.STL的容器是否是线程安全的2.智能指针是否是线程安全的 三、其他常见的各种锁…

Window11下载安装jdk8-jdk11与环境变量的配置

目录 一、下载jdk 二、安装jdk 三、配置环境变量 四、检查JDK是否配置成功 一、下载jdk jdk8下载链接&#xff1a;请点击网址 jdk11下载链接&#xff1a;请点击网址 二、安装jdk 按照提示一步一步安装即可。 默认安装位置&#xff1a;C:\Program Files\Java 三、配置…

NetSuite海鲜书 - 知识会汇编 用户篇 2023

NetSuite2021年初夏&#xff0c;NetSuite知识会成立。它由本人&#xff0c;上海德之匠信息技术有限公司的毛岩喆&#xff08;江湖人称Rick&#xff09;发起建立。建立的初衷秉承Rick个人博客“学问思辨&#xff0c;企业信息化路上的行者”的理念&#xff0c;期望能够在NetSuite…

linux操作系统中的动静态库(未完)

1. 静态库与动态库 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使用库的…

复旦国际MBA《人力分析战略》课程深度探讨最优解决方案

“近年来的各种社会变化和不确定性极大地促使我们真正重新审视我们的工作条件&#xff0c;以及思考如何呈现最好的工作和生活状态。”MIT斯隆管理学院Emilio J. Castilla教授指出&#xff0c;“由于期望发生了变化&#xff0c;无论是管理者还是员工&#xff0c;对工作场所的看法…

Java后端开发面试题——多线程

创建线程的方式有哪些&#xff1f; 继承Thread类 public class MyThread extends Thread {Overridepublic void run() {System.out.println("MyThread...run...");}public static void main(String[] args) {// 创建MyThread对象MyThread t1 new MyThread() ;MyTh…