C语言入门级小游戏——三子棋

news2024/12/30 3:22:40

文章目录

  • 游戏文件的创建
  • 游戏菜单
  • 重头戏,游戏正式开始
    • 棋盘的创建
      • 数据清空
      • 打印棋盘
    • 玩家下棋
    • 电脑下棋
    • 输赢的判断
      • 1.赢
      • 2.平局,游戏继续
  • 代码展示

今天我们写一个小游戏——三子棋来增加我们对编程的兴趣,
希望这篇文章对友友们有帮助!在这里插入图片描述

游戏文件的创建

这里我们需要是三个文件
test.c —— 游戏的测试
game.h —— 游戏函数的声明
game.c —— 游戏函数的实现

游戏菜单

游戏菜单,就像名字一样,是为了方便我们对游戏进行选择。
这里我们创建一个 函数menu 来引导我们开始游戏。
menu函数的功能
1.游戏的开始
2.游戏的退出
3.当选择错误时,重新选择

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

重头戏,游戏正式开始

棋盘的创建

数据清空

1.游戏在运行的过程中需要存储数据,因此我们可以创建3*3的二维数组
数组a[3][3]来存储数据。
2.这个棋盘刚打印出来的时候什么都没有,因此没下棋之前数组中存放空格。
这里我们创建一个 Initboard 函数 来把空格放到我们的数组中去。在这里插入图片描述

`//初始化棋盘为空格
void Initboard(char a[m][n], int X, int Y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < X; i++)
	{
		for (j = 0; j < Y; j++)
		{
			a[i][j] = ' ';
		}
	}
}

`

打印棋盘

然后我们需要把棋盘给打印出来,给玩家进一步游戏。
这里我们创建一个 Displayboad****函数 把我们的棋盘打印出来。

 void Displayboad(char a[m][n], int X, int Y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < X; i++)
	{ 
		//打印数据
		for (j = 0; j < Y; j++)
		{
			printf(" %c ", a[i][j]);
			if (j < Y-1)
				printf("|");
		}
		printf("\n");
		//打印分割线
		if (i < X-1)
			printf("-----------\n");
	}
}

在这里插入图片描述
注:如果未来我们的数组要变成 55,88 的呢,我们发现代码到处都要改,因此我们发现
这里我们可以定义宏,在头文件game.h 中进行宏定义。行用 m 表示,列用 n 表示
在这里插入图片描述

玩家下棋

玩家下棋时我们需要注意:
1.玩家的落子位置-1是我们数组的下标。
2.判读玩家输入的位置是否已有落子。
3.判断玩家输入的位置是否正确。
这里我们创建一个Playermove*函数来实现我们的玩家下棋
在这里插入图片描述

  void Playermove(char a[m][n], int X, int Y)
 {
	 int i = 0;
	 int j = 0;
	 printf("玩家下棋>\n");
	 printf("请输入下棋坐标,中间使用空格>\n");
	 while (1)
	 {
		 scanf("%d %d", &i, &j);
		 if (i > 0 && i <= X   && j>0 && j <=Y)
		 {
			 if (a[i - 1][j - 1] == ' ')
			 {
				 a[i-1][j-1] = '*';
				 break;
			 }
			 else
				 printf("坐标被占用,不能落子,请重新输入\n");
		 }
		 else
		 {
			 printf("输入错误,请重新输入\n");
		 }
	 }
 }

在这里插入图片描述

电脑下棋

想要完成电脑下棋,我们需要生成随机数。
生成随机数我们需要调用 rand() 函数,而使用rand函数我们又要调用函数 srand((unsignedint)time(NULL)) 这个函数只需要调用一次,我们可以把他放到主函数中
这里我们需要调用这两个头文件
1.<stdlib.h>
2.<time.h>

电脑下棋时需要注意:
1.生成的随机数小于m,n
i = rand() % X;
j = rand() % Y;

2.判断电脑下的位置是否为空
这里我们创建一个Computermovie
函数
来实现我们的玩家下棋
在这里插入图片描述

 void Computermovie(char a[m][n], int X, int  Y)
 {
	 int i = 0;
	 int j = 0;
	 printf("电脑下棋\n");
	 while (1)
	 {
		 i = rand() % X;
		 j = rand() % Y;
         if (a[i][j] == ' ')
		 {
			 a[i][j] = '#';
			 break;
		 }
		 
	 }
 }
 int Isfull(char a[m][n], int X, int Y)
 {
	 int i = 0;
	 int j = 0;
	 for (i = 0; i < X; i++)
	 {
		 for (j = 0; j < Y; j++)
		 {
			 if (a[i][j] != ' ')
				 return  1;
		 }

	 }
	 return 0;

 }

在这里插入图片描述

输赢的判断

在我们下棋过程中,每下一次棋我们都要进行输赢的判断。
判断要返回四种不同的状态
玩家赢 --> ’ * ’
电脑赢 --> ‘#’
平局 --> ‘Q’
游戏继续 --> ‘C’
这里我们创建一个Iswin函数来实现我们的输赢判断
因为每下一次棋我们就要进行输赢的判断,所以函数的位置如下
在这里插入图片描述
在这里插入图片描述
在输赢判断的时候可能出现以下三种情况

1.赢

在赢的时候我们需要注意
1.判断行
2.判断列
3.判断对角线

char  Iswin(char a[m][n], int X, int  Y)
 {
	 int i = 0;
	 for (i = 0; i < X; i++)
	 {
		 if (a[i][0] == a[i][1] && a[i][1] == a[i][2] && a[i][1]!=' ')
			 return a[i][0];
		 
	 }
	 for (i = 0; i < X; i++)
	 {
		 if (a[0][i] == a[1][i] && a[1][i] == a[2][i] && a[2][i] != ' ')
			 return a[1][i];
	 }
	 if (a[0][0] == a[1][1] && a[1][1] == a[2][2] && a[2][2] != ' ')
		 return a[0][0];
	 if (a[0][2] == a[1][1] && a[1][1] == a[2][0] && a[1][1] != ' ')
		 return a[1][1];
}

2.平局,游戏继续

平局判断的时候我们创建一个函数Isfull,
如果棋盘满了,又没有分出输赢,则为平局
如果棋盘没满,又没有分出输赢,则继续游戏

int Isfull(char a[m][n], int X, int Y)
 {
	 int i = 0;
	 int j = 0;
	 for (i = 0; i < X; i++)
	 {
		 for (j = 0; j < Y; j++)
		 {
			 if (a[i][j] == ' ')
				 return  0}

	 }
	 return 1;

 }

注:函数返回1,则为平局,向game函数返回Q
函数返回0,则继续游戏,向game函数返回C在这里插入图片描述

 if (Isfull(a, m,n ) == 1)
	{
		 return 'Q';
	 }
	 else
		 return 'C';

代码展示

game.h —— 游戏函数的声明

#define  _CRT_SECURE_NO_WARNINGS
#define m 3
#define n 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void Initboard(char a[m][n], int X, int Y);
void Displayboad(char a[m][n], int X, int Y);
void Playermove(char a[m][n], int X, int Y);
void Computermovie(char a[m][n], int X, int  Y);

game.c —— 游戏函数的实现

#define  _CRT_SECURE_NO_WARNINGS
#include"game.h"
//数据清空
void Initboard(char a[m][n], int X, int Y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < X; i++)
	{
		for (j = 0; j < Y; j++)
		{
			a[i][j] = ' ';
		}
	}
}
//打印棋盘
 void Displayboad(char a[m][n], int X, int Y)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < X; i++)
	{ 
		//打印数据
		for (j = 0; j < Y; j++)
		{
			printf(" %c ", a[i][j]);
			if (j < Y-1)
				printf("|");
		}
		printf("\n");
		//打印分割线
		if (i < X-1)
			printf("-----------\n");
	}
}
 //玩家下棋
 void Playermove(char a[m][n], int X, int Y)
 {
	 int i = 0;
	 int j = 0;
	 printf("玩家下棋>\n");
	 printf("请输入下棋坐标,中间使用空格>\n");
	 while (1)
	 {
		 scanf("%d %d", &i, &j);
		 if (i > 0 && i <= X   && j>0 && j <=Y)
		 {
			 if (a[i - 1][j - 1] == ' ')
			 {
				 a[i-1][j-1] = '*';
				 break;
			 }
			 else
				 printf("坐标被占用,不能落子,请重新输入\n");
		 }
		 else
		 {
			 printf("输入错误,请重新输入\n");
		 }
	 }
 }
 //电脑下棋
 void Computermovie(char a[m][n], int X, int  Y)
 {
	 int i = 0;
	 int j = 0;
	 printf("电脑下棋\n");
	 while (1)
	 {
		 i = rand() % X;
		 j = rand() % Y;
         if (a[i][j] == ' ')
		 {
			 a[i][j] = '#';
			 break;
		 }
		 
	 }
 }
 //平局判断函数
 int Isfull(char a[m][n], int X, int Y)
 {
	 int i = 0;
	 int j = 0;
	 for (i = 0; i < X; i++)
	 {
		 for (j = 0; j < Y; j++)
		 {
			 if (a[i][j] == ' ')
				 return  0;
		 }

	 }
	 return 1;

 }

 char  Iswin(char a[m][n], int X, int  Y)
 {
	 //赢
	 int i = 0;
	 for (i = 0; i < X; i++)
	 {
		 if (a[i][0] == a[i][1] && a[i][1] == a[i][2] && a[i][1]!=' ')
			 return a[i][0];
		 
	 }
	 for (i = 0; i < X; i++)
	 {
		 if (a[0][i] == a[1][i] && a[1][i] == a[2][i] && a[2][i] != ' ')
			 return a[1][i];
	 }
	 if (a[0][0] == a[1][1] && a[1][1] == a[2][2] && a[2][2] != ' ')
		 return a[0][0];
	 if (a[0][2] == a[1][1] && a[1][1] == a[2][0] && a[1][1] != ' ')
		 return a[1][1];
	 //平局判断
	 if (Isfull(a, m,n ) == 1)
	{
		 return 'Q';
	 }
	 else
	 //继续游戏
		 return 'C';

game.c —— 游戏函数的实现

#define  _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu()
{
	//目录
	printf("*******************************\n");
	printf("************* 1.play **********\n");
    printf("************* 0.exit **********\n");
	printf("*******************************\n");
}

void game()
{
	char k = 0;
	char a[m][n] = { 0 };
	Initboard(a, m, n);
	Displayboad(

`c
a, m, n);
	while (1)
	{
		//玩家下棋
		Playermove(a, m,n);
		//打印棋盘
		Displayboad(a, m,n);
		//判断输赢
		k=Iswin(a,m,n);
		if (k == '*')
		{
			printf("玩家赢\n");
			break;
		}
	
		
		//电脑下棋
		Computermovie(a,m,n);
		//打印棋盘
		Displayboad(a,m,n);
		//判断输赢
		k = Iswin(a, m, n);
		if (k == '*')


		{
			printf("玩家赢\n");
			break;
		}
		if (k == '#')
		{
			printf("电脑赢\n");
			break;
		}
		if (k == 'Q')
		{
			printf("平局\n");
			break;
		}
		if (k == 'C')
			printf("继续游戏\n");
	}
	
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	;
	menu();
	do
	{
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,请重新选择");
			break;
		}
	} while (1);
	
    return 0;
}

在这里插入图片描述

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

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

相关文章

测试进阶-软件测试的分类

目录 按照测试对象划分界面测试 *可靠性测试如何进行可靠性测试 容错性测试文档测试兼容性测试 *易用性测试 *安装卸载测试 *安全测试性能测试内存泄漏测试 按照是否查看代码划分黑盒测试白盒测试灰盒测试 按照开发阶段划分测试金字塔单元测试集成测试系统测试回归测试冒烟测试…

行政前台快递管理软件使用教程

行政前台快递如何管理&#xff0c;是每个行政人员永远避不开的话题。 不管是从行政相关的论坛中&#xff0c;还是从身边从事行政相关工作的亲友口中&#xff0c;亦或是某些公司前台堆积的快递&#xff0c;我们都能看到、听到行政相关人员抱怨“行政前台快递管理为什么这么难”…

办公环境监测与智能控制软硬件全套解决方案

心理学研究表明&#xff0c;良好的工作环境对员工的身心健康及提高工作效率有积极影响。 不仅如此&#xff0c;近几年国家尤其提倡“碳中和”与“碳达峰”政策&#xff0c;并提出“节约能源、美化环境”的重要目标。以“企业数字化转型”为根本&#xff0c;一切事物都在朝着智能…

因子图优化

最大后验概率估计问题 我们常将状态估计问题建模为最大后验估计&#xff08;MAP&#xff09;。之所以命名为最大后验估计&#xff0c;是因为它在给定了观测 Z \bm Z Z的情况下&#xff0c;最大化状态 X \bm X X的后验概率密度 p ( X ∣ Z ) p(\bm X|\bm Z) p(X∣Z) X M A P …

迅为RK3568开发板驱动教程更新了兄弟们,思路更科学

驱动视频全新升级&#xff0c;并持续更新~更全&#xff0c;思路更科学&#xff0c;入门更简单。 迅为基于iTOP-RK3568开发板进行讲解&#xff0c;本次更新内容为第九期&#xff0c;主要讲解设备模型&#xff0c;共计29讲。 教程观看链接&#xff1a;B站搜索-迅为电子 课程目录…

Mysql——SUM()函数

目录 一、前期准备工作 新建表如下&#xff1a; 插入的数据如下&#xff1a; 二、SUM()函数的用法 1.求和&#xff0c;返回指定列的总和 SUM 函数可以对单个列求和&#xff0c;也可以对多个列运算后求和&#xff0c;计算中忽略 NULL 值 SUM函数与分组 GROUP BY 使用&a…

MySQL调优系列(五)——索引详解

一、索引的定义 数据库索引就像是书前面的目录&#xff0c;能加快数据库的查询速度。 索引是一种数据结构&#xff0c;用于帮助我们在大量数据中快速定位到我们想要查找的数据。 是一种帮助MySQL高效获取数据的数据结构。 ps&#xff1a;大多数情况下&#xff0c;索引查询都是…

计算机图形学 | 实验九:纹理贴图和天空盒

计算机图形学 | 实验九&#xff1a;纹理贴图和天空盒 计算机图形学 | 实验九&#xff1a;纹理贴图和天空盒实验概述顶点数据立方体顶点数据天空盒顶点数组 纹理载入创建纹理纹理读取纹理绑定 使用纹理立方体着色器顶点着色器片元着色器 天空盒着色器顶点着色器片元着色器 立方体…

管好【SD-WEBUI】中大量的模型:模型信息预览插件(Part.3)

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;模型预览图&#xff08;一&#xff09;模型信息预览插件&#xff08;Model Preview&#xff09;&#xff08;1.1&#xff09;示例&#xff08;Markdown描述提示词备注&#xff09;&#xff08;1.2&#xff0…

AI大模型驱动下,数字虚拟人与虚拟场景为高等学院建设带来何种改变?

继今年年初美国人工智能研究实验室OpenAI推出ChatGPT&#xff08;一种人工智能驱动的自然语言处理工具&#xff09;之后一段时间里&#xff0c;阿里、百度、商汤等一众国内IT巨头纷纷发布了各自的AI大模型&#xff08;可浅理解为用于AI学习用的超大量数据&#xff09;&#xff…

运动控制轴单位设置(H5U PLC)

H5U PLC运动控制相关应用,请参看下面博客文章 10轴总线控制(汇川H5UPLC+总线伺服编程应用)_RXXW_Dor的博客-CSDN博客H5UPLC控制总线伺服的详细配置过程,可以参看下面的文章链接:汇川H5U PLC通过EtherCAT总线控制SV660N和X3E伺服_ethercat总线伺服如何控制_RXXW_Dor的博客-C…

使用MFT进行加密文件传输的7个好处

至少&#xff0c;托管文件传输&#xff08;MFT&#xff09;解决方案是一种产品&#xff0c;它包含入站和出站文件传输的所有方面&#xff0c;同时使用行业标准的网络协议和无缝加密。它可以从单个集中管理点在您的网络&#xff0c;系统&#xff0c;应用程序&#xff0c;贸易伙伴…

2024王道数据结构考研丨第二章:线性表

2024王道数据结构考研笔记专栏将持续更新&#xff0c;欢迎 点此 收藏&#xff0c;共同交流学习… 文章目录 第二章&#xff1a;线性表2.1线性表的定义2.2顺序表的定义2.2.1静态分配:2.2.2动态分配 2.2顺序表的基本操作1.插入操作 &#xff1a;平均时间复杂度O(n)2.删除操作&…

小白怎么入门网络安全?看这篇文章就够啦!(2023最新)

作为一名从业多年的网络安全工程师&#xff0c;我了解到&#xff0c;网络安全是一个高度技术密集的领域&#xff0c;它涵盖了网络架构、网络协议、操作系统、编程语言、密码学、安全漏洞、入侵检测和应急响应等多个方面。如果你是零基础的小白&#xff0c;想要进入这个行业&…

5个设计师必备的页面设计工具!

在现代科技飞速发展的时代&#xff0c;设计软件的选择越来越多。本文将盘点 5 大主流页面设计工具其中&#xff0c;即时设计是一款协同页面设计工具&#xff0c;提供在线编辑和保存等功能&#xff0c;同时拥有免费设计素材和在线留言评论等实用功能。它的云端协作设计使得复杂的…

街电入局两轮电动车充电,讲出了“跃迁”式的新故事?

以共享单车为起点&#xff0c;中国的共享经济正蓬勃发展。国家信息中心披露的数据显示&#xff0c;2022年&#xff0c;中国共享经济市场交易规模约38320亿元&#xff0c;同比增长约3.9%。 虽然同属共享经济&#xff0c;但与部分共享单车企业嫁入“豪门”全身而退不同&#xff…

【接口自动化测试】cookie绕过验证码自动登录?(保持登录状态)

目录 前言 cookie工作原理 cookie绕过登录 【自动化测试工程师学习路线】 1、自动化测试必备Python编程内容​ 2、Web UI 自动化测试基础内容​ 3、Web UI 自动化测试实战内容​ 4、APP UI 自动化测试基础内容​ 5、APP UI 自动化测试实战内容​ 6、API 接口自动化测…

实验四 面向对象分析与设计——UML类图与时序图

一、实验目的&#xff1a; 掌握面向对象分析中静态结构模型与动态行为模型的基本思想。学会识别系统中的类、类的属性和操作以及类之间的关系&#xff0c;掌握UML类图的绘制方法。了解时序图的作用和组成元素&#xff0c;掌握UML时序图的绘制方法。 二、实验仪器及实验环境&a…

ATA-2000系列高压放大器在压电陶瓷中的典型应用

ATA-2000系列高压放大器在压电陶瓷中的典型应用 压电陶瓷介绍&#xff1a; 压电陶瓷是一种能够将机械能和电能互相转换的陶瓷材料。压电陶瓷除具有压电性外&#xff0c;还具有介电性、弹性等,已被广泛应用于医学成像、声传感器、声换能器、超声马达等。压电陶瓷利用其材料在机…

改进YOLOv7 | 头部解耦 | 将YOLOX解耦头添加到YOLOv7 | 涨点杀器

改进YOLOv7 | 头部解耦 | 将YOLOX解耦头添加到YOLOv7 论文地址:https://arxiv.org/abs/2107.08430 文章目录 改进YOLOv7 | 头部解耦 | 将YOLOX解耦头添加到YOLOv71. 解耦头原理2. 解耦头对收敛速度的影响3. 解耦头对精度的影响4. 代码改进方式第一步第二步第三步第四步第五步参…