c语言编写的小游戏【c语言编写小游戏扫雷】

while循环random模块if语句输入输出函数0介绍Python中的随机数操作较简单,不像其他高级语言那样必须用特定的公式才能产生目前我们用到的是randi

其实c语言编写的小游戏【c语言编写小游戏扫雷】的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享c语言编写的小游戏【c语言编写小游戏扫雷】的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

while 循环random 模块if 语句输入输出函数

#0## 介绍Python中的随机数操作较简单,不像其他高级语言那样必须用特定的公式才能产生

目前我们用到的是randint()方法。

图:

运行结果:

现在我们可以产生随机数了,但是只有调用一次方法才能产生一次随机数,怎么办呢?对了,可以用循环来反复做相同的事。

运行结果:

可以看到,它一直输出随机数,这并不是我们想要的,我们想要的是用户输入一个数,和这个随机数比对

对上述采取的方法是:把产生的随机数存入变量,进行判断、比对

看似没有问题,我们来运行一下运行后发现报错了:

哦,原来是没有转换类型,input返回的是字符串,字符串不能和整数比较

改后:

运行:

还是有问题!

同学们想想,当打印提示语后,用户没有重输,会一直满足那个条件,就会循环打印。那么我们可以增加重输功能,当输的不对时,就重输,就不会循环打印了;添加限制用户输入功能,这样就避免用户一直猜

1.当然,因为又加了一个功能,答对了的提示就不能放在循环外面了,2.之所以不在打印大了小了设置重输,是因为在if times >0: 中已经弄过了,这样避免输两次,也避免次数已用完还让重输

没有设置输入限制,如果用户输入的是字母,那int转换就会报错;这个我就不写了,有兴趣的同学可以在评论区写一下。

私信小编01即可获取大量Python学习资料

如何使用C语言编程实现一个推箱子游戏?技术核心和算法实现

推箱子游戏是一款很有趣味的游戏,其开发过程有一定的技巧和方法,其中涉及软中断、二维数组、键盘操作以及图形化函数等方面的知识。本游戏的开发者需要基本掌握显示器中断寄存器的设置、二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示和定位,以及部分图形函数的使用。在本章中,将使用C语言实现一个典型的推箱子游戏,向读者讲解其具体实现过程,并剖析技术核心和实现的算法。

在软件项目开发过程,规划分析是首先需要完成的工作。在本节中,将详细讲解本推箱子游戏的项目规划分析方面的工作。

本游戏一共4关,由易到难,每一关都有初始化、按键处理、重置及退出功能。

① 初始化包括屏幕初始化和每一关卡的初始化,屏幕被初始化为宽80像素,高25像素。

② 按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。

③ 每一关都可以重置,按空格键可以重置当前关。

④ 按【Esc】键可以在任何时候退出游戏。

本程序包括5个模块,分别是初始化模块、画图模块、移动箱子模块、移动小人模块和功能控制模块,如图1-1所示。各个模块的功能描述如下。

图1-1 功能模块图

(1)初始化模块

该模块包括屏幕初始化和游戏第一关的初始化。屏幕初始化用于输出欢迎信息和操作提示,游戏每一关的初始化是构建每一关的关卡。

(2)画图模块

该模块主要是被其他模块调用,用于画墙、在空地画箱子、在目的地画箱子、画小人和画目的地。

(3)移动箱子模块

该模块用于移动箱子,包括目的地之间、空地之间和目的地与空地之间的箱子移动。

(4)移动小人模块

该模块用于控制小人移动,从而推动箱子到目的地。

(5)功能控制模块

c语言编写的小游戏【c语言编写小游戏扫雷】

该模块是几个功能函数的集合,包括屏幕输出功能、指定位置状态判断功能和关卡重置功能。

游戏从第一关开始,按上下左右方向键控制小人移动来推动箱子,可以在游戏中的任何时候按【Esc】键退出。如果游戏无成功希望,可以按空格键回到当前任务的开始状态;如果成功完成当前关,则进入下一关,如果当前关是最后一关,则显示通关信息,提示游戏结束。图1-2显示了任务执行的流程。

图1-2 任务执行流程图

小人移动的方向有4个,move()函数(处理小人移动的函数)对这4个方向移动的处理都一致,只是调用函数时的参数有所不同。首先判断小人移动的方向,然后根据小人所处的当前状态、下一步状态或者下下一步状态进行适当的处理。处理过程如图1-3所示。

图1-3 小人移动流程图

经过游戏运作流程的分析和试玩过程可知,推箱子游戏是一款很有趣味的游戏,其开发过程需要一定的技巧和方法,其中涉及到软中断、二维数组、键盘操作以及图形化函数等方面的知识。本游戏的开发者需要基本掌握显示器中断寄存器的设置、二维数组及结构体的定义、键盘上键值的获取、图形方式下光标的显示和定位,以及部分图形函数的使用。

定义二维数组char status[20][20],用于记录屏幕一个点的状态。其中,“0”表示什么都没有,“b”表示箱子,“w”表示目的地,“i”表示箱子在目的地。首先将屏幕20×20范围内的状态初始化为0。然后根据具体情况,在画箱子时,将箱子所在点的状态改为“b”;在画墙壁时,将墙壁所在点的状态改为“w”;在画目的地时,将目的地所在点的状态改为“m”;当箱子被推到目的地时,箱子所在点的状态改为“i”,如果每一关中所有目的地的状态都为“i”,则说明该关已完成。

定义全局变量,char far *printScreen=(char far*)0xB8000000,用于在屏幕上输出字符。彩色显示器的字符缓冲区首地址为0xB8000000,每一个字符占2个字节(第一个字节为ASCII值,第二个字节为颜色值),字符模式下屏幕宽80像素,高25像素,一屏可以写80×25个字符。

定义结构体struct winer,用于判断每一关是否已完成。其中x用于存放目的地的横坐标,y用于存放目的地的纵坐标。如果所有表示目的地坐标对应的状态都为“i”,即箱子在目的地,则表示已经过关,可以进入下一关。该结构体的初始化在每一关的初始化时进行,具体代码如下所示。

系统函数是整个项目的灵魂,项目中的功能都是通过函数实现的,所以本阶段的工作十分重要。在本阶段要提前做好分析和规划工作,力争为后面的工作打好基础。

(1)函数原型:void putoutChar(int y,int x,char ch,char fc,char bc)

(2)功能:putoutChar()函数用于在屏幕上的指定位置输出指定的字符。其中,x、y指明输出的位置,ch表示输出的字符,fc表示输出的字符颜色,bc表示背景色。

(1)函数原型:void printWall(int x,int y)

(2)功能:printWall()函数用于画墙壁,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画绿色墙,用小方块表示墙(ASCII值为219)。

(1)函数原型:void printBox(int x,int y)

(2)功能:printBox()函数用于在非目的地画箱子,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景白色箱子,用ASCII值为10的字符表示箱子。

(1)函数原型:void printBoxDes(int x,int y)

(2)功能:printBoxDes()函数用于在目的地画箱子,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画黄色箱子,仍用ASCII值为10的字符表示箱子。

(1)函数原型:void printDestination(int x,int y)

(2)功能:printDestination()函数用于画目的地,传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画黄色目的地,用心形表示(ASCII值为003)。

(1)函数原型:void printDestination1(int x,int y,winer **win,winer **pw)

(2)功能:printDestination1()函数与printDestination()函数功能基本相同,都是画目的地函数,但是printDestination1()增加了记录每一个目的地位置的功能。其中x、y指明目的地的位置,每一关的所有目的地位置存放在结构体struct winer中,形成一条链表,**winer返回链表的头,**pw则指向链表的尾部。

(1)函数原型:void printMan(int x,int y)

(2)功能:printMan()函数用于画小人,x、y指明画的位置。该函数通过软中断来实现,首先设置寄存器AX的高位和低位,设置高位0xa表示在光标位置显示字符;设置低位02(ASCII值),表示输出的字符;然后设置寄存器CX为01,表示重复输出的次数,这里只输出一次;最后产生类型为0x10的中断,表示显示器输出。

(1)函数原型:void init()

(2)功能:init()函数用于初始化屏幕。该函数首先用两个for循环初始化屏幕20*20范围内的状态,初始化为0,以后根据实际情况重新赋值;然后设置屏幕输出状态,设置寄存器AX的高位为0,低位为3,表示以80*25的彩色方式显示;最后移动光标到指定的位置输出操作提示信息以及版权信息。

(1)函数原型:winer *initStep1()、winer *initStep2()、winer *initStep3()、winer *initStep4()

(2)功能:这几个函数分别初始化游戏的第一关到第四关。这些函数的功能和实现步骤相似。首先根据需要在指定的位置画墙壁和画箱子,在这里可以设置游戏的难度,初始化的墙壁越复杂,箱子越多,则游戏就越难。游戏的第一关至第四关难度依次增加。然后分别调用printDestination1()和printMan()函数画目的地和小人。函数返回包含各个目的地位置的链表。

(1)函数原型:void moveBoxSpacetoSpace(int x,int y,char a)、void moveBoxDestoSpace(int x,int y, char a)、void moveBoxSpacetoDes(int x,int y,char a)、void moveBoxDestoDes(int x,int y,char a)

(2)功能:这几个函数实现的功能分别是人空地移动箱子到空地、从目的地移动箱子到空地、从空地移动箱子到目的地和中从目的地移动箱子到目的地。x、y指明小人当前所处的位置,字符a表示移动的方向,有“u”“d”“l”和“r”4个值,分别表示向上、下、左、右移动。这几个函数的实现原理大致相似。对于前面两个函数,首先判断移动的方向,从小人所在的位置沿着移动的方向移动一步画小人,移动两步画箱子(调用printBox()函数),并设置状态为“b”;对于后面两个参数,首先判断移动的方向,从小人所在的位置沿着移动方向移动一步画小人,移动两上在目的地画箱子(调用printBoxDes()函数),并设置状态为“i”,表明箱子在目的地上。

(1)函数原型:int judge(int x,int y)

(2)功能:judge()根据结构体struct[x][y]中存的值来判断该点的状态。

(1)函数原型:void moid(int x,int y,char a)

(2)功能:Move()函数根据按下的键来处理小人的移动。整个项目的核心是实现推箱子处理,即通过函数move()来实现小人的移动。小人移动的方向有上(“u”)、下(“d”)、左(“l”)、右(“r”)4个,4个方向的处理方式一样。首先判断移动的方向,然后根据小人的当前位置、下一步位置以及下下一步位置所在的状态进行处理。

① 若下一步所在位置的状态为墙壁(“w”),则直接退出,不做任何处理。

② 若下一步所在位置的状态为目的地(“i”)或者什么都没有(“0”),则:

c语言编写的小游戏【c语言编写小游戏扫雷】

  • 若当前位置的状态为目的地,则在当前位置画目的地(调用printDestination()函数)、在下一步位置画小人(调用printMan()函数)。
  • 若当前位置的状态为非目的地,则输出空格清空当前位置的小人,并在下一步位置画小人(调用printMan()函数)。

③ 若下一步所在位置的状态为箱子(“b”),则:

  • 如果下下一步位置的状态为“0”,则把箱子从空地移动到空地(调用moveBoxSpacetoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestinanion()函数))。
  • 如果下下一步位置的状态为目的地,则把箱子从空地移动到目的地(调用moveBoxSpacetoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。
  • 其他情况则直接返回,不做任何处理。

④ 若下一步所在位置的状态为箱子在目的地(“i”),则:

  • 如果下下一步位置的状态为“0”,则把箱子从目的地移动到空地(调用moveBoxDestoSpace()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。
  • 如果下下一步位置的状态为目的地,则把箱子从目的地移动到目的地(调用moveBoxDestoDes()函数),然后把光标移动到下一步位置(如果当前位置的状态为目的地,则应先画目的地(调用printDestination()函数))。
  • 其他情况则直接返回,不做任何处理。

(1)函数原型:void reset(int i)

(2)功能:reset()函数用于重置当前关。该函数首先判断当前关是第几关,然后调用init()函数和初始化当前关的函数进行重置。

主函数首先设置寄存器AX的高位和低位,显示器软中断,进行显示状态的设置,初始化屏幕,初始化第一关,并显示操作提示信息和版权信息。然后根据按下的键(bioskey(0)函数返回按下的键值)进行处理,处理过程由move()函数进行(如果按下【Esc】键,则退出程序)。对于每一关,如果所有的表示目的地的状态都由“m”变成了“i”,则表示通过该关,可以进入下一关。

现在既有项目规划书,也有函数规划。有了这些资料,整个设计思路就十分清晰了,只需遵循规划书的方向,并参照规划函数即可轻松完成编码工作。

程序预处理部分包括加载头文件、定义全局变量和定义数据结构,并对它们进行初始化工作。具体实现代码如下所示。

该模块主要用于对屏幕和关卡的初始化,初始化关卡时是调用画图模块中画图函数。该模块包括以下几个函数。

① void init():初始化屏幕的大小、显示方式、显示操作提示信息和版权信息。

② winer *initStep1():初始化游戏的第一关。

③ winer *initStep2():初始化游戏的第二关。

④ winer *initStep3():初始化游戏的第三关。

⑤ winer *initStep4():初始化游戏的第四关。

具体实现代码如下所示。

该模块主要用于画图操作,包括画墙、画箱子、画目的地和画小人等。该模块包括以下几个函数。

① void printWall(int x,int y):用于画墙。

② void printBox(int x,int y):在空白地(非目的地)画箱子。

③ void printBoxDes(int x,int y):在目的地画箱子。

④ void printDestination(int x,int y):画目的地函数。

⑤ void printDestination1(int x,int y,winer **win,winer **pw):画目的地函数,并记录每个目的地的位置。

⑥ void printMan(int x,int y):画小人函数。

具体实现代码如下所示。

该模块是实现箱子的移动。根据游戏规则,箱子可以在空地之间、目的地之间、空地和目的地之间来回移动,因此,实现本模块共有以下4个函数。

① void moveBoxSpacetoSpace(int x,int y,char a):把箱子从空地移动到空地。

② void moveBoxDestoSpace(int x,int y,char a):把箱子从目的地移动到空地。

③ void moveBoxSpacetoDes(int x,int y,char a):把箱子从空地移动到目的地。

④ void moveBoxDestoDes(int x,int y,char a):把箱子从目的地移动到目的地。

具体实现代码如下所示。

移动小人模块是本程序的核心模块,仅由move()函数来实现。move()函数控制小人的移动,并调用画图模块、移动箱子模块中的函数来实现箱子的重画、移动等操作。其操作流程如图1-3所示,具体实现代码如下所示。

功能控制模块包括屏幕输出功能、关卡重置功能和坐标位置状态的判断功能。该模块包括以下几个函数。

① void putoutChar(int y,int x,char fc,char bc):在屏幕上指定的位置输出指定的字符。

② int judge(int x,int y):判断位置(x,y)处的状态,状态值可参见1.2节。

③ void reset (int i):重置关卡。

具体实现代码如下所示。

用户评论


赋流云

小时候玩过扫雷,感觉这个游戏很有意思!用C语言写一个小游戏挺酷炫的,有机会我要试试看。

    有9位网友表示赞同!


轨迹!

哇,太厉害了,居然用C语言实现了一个扫雷游戏!我都忘了C语言还能做这样有趣的事情。视频演示做的很详细,我也想试试自己动手来完成一个,学习一下c语言实现算法的过程。

    有19位网友表示赞同!


最怕挣扎

感觉这个代码写的非常简洁明了,理解起来还是比较容易的,对新手来说是一个很好的入门案例。

    有20位网友表示赞同!


淡淡の清香

游戏界面设计还可以,但音乐比较单调,缺少一些趣味性,希望作者能加强这方面的设计,会更有沉浸感!

    有16位网友表示赞同!


高冷低能儿

扫雷这个游戏老了又少人玩。现在用C语言重新开发出来,也算是一种新鲜的玩法。可惜我很久没碰过汇编语言编程了,希望能看到更多用C语言写的创意小游戏。

    有10位网友表示赞同!


尘埃落定

这个C语言编写的小游戏难度还是挺高的呀!新手真有点不容易上手。不过学习技术的路上就是不断挑战自己嘛!

    有9位网友表示赞同!


别在我面前犯贱

很遗憾,游戏界面设计太普通了,看着不太耐看,希望能结合一些更酷炫的元素,提升游戏的视觉体验.

    有16位网友表示赞同!


浮世繁华

这个C语言编写的小游戏“扫雷”真不错啊!我本来想找一个类似的游戏下载玩的,结果这里发现了。这真是个好网站,感谢作者分享这种宝贵的资源。希望作者能出更多有意思的C语言作品吧!

    有15位网友表示赞同!


聽風

代码简洁易懂,逻辑清晰,适合作为入门C语言编程的练习素材。点赞!👏

    有16位网友表示赞同!


漫长の人生

虽然游戏玩法简单,但用C语言实现还是挺不容易的。尤其是在处理游戏逻辑和界面交互的时候,作者一定花费了不少的时间和精力。佩服!

    有19位网友表示赞同!


何年何念

以前学过扫雷这个游戏,这款新出的C语言版本感觉更有趣,操作体验也更流畅。

    有12位网友表示赞同!


来瓶年的冰泉

我也喜欢玩扫雷,用C语言编写的小游戏让我看到了程序员的巧思和创意。希望以后能看到更多用C语言编写的有趣小游戏!

    有17位网友表示赞同!


念初

这个“扫雷”游戏功能有限,缺少一些其他的元素会更吸引人 玩,希望能加入一些新的玩法,变得更加丰富多彩。

    有13位网友表示赞同!


あ浅浅の嘚僾

<p>学习编程的难度很高。像这种把游戏运用到学习过程里是很好的一种方法! 很值得我参考学习一下!</p>

    有19位网友表示赞同!


反正是我

用C语言编写小游戏的“扫雷”是我童年玩过的最经典游戏之一,这款小游戏非常地还原了原有的版本,带回了我的许多记忆!

    有19位网友表示赞同!


颓废i

感觉这个游戏的界面设计有点老旧,颜色比较单调,缺少一些现代化的元素。

    有18位网友表示赞同!


巷陌繁花丶

学习C语言一直都很困难,但我更喜欢玩游戏,看到这篇文章我突然想要尝试一下用C语言写小游戏了!

    有18位网友表示赞同!


江山策

程序员的创意很棒! 用C语言实现扫雷真是个不错的想法,希望能开发出更多有趣的小游戏!

    有20位网友表示赞同!

程序开发

天语e62评测:详细参数解析与刷机指南

2025-7-10 16:20:14

程序开发

在线购物退货退款指南:淘宝操作全解析

2025-7-10 17:18:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索