0

0

人人都可以用C语言写推箱子小游戏

星夢妙者

星夢妙者

发布时间:2025-09-25 08:51:27

|

983人浏览过

|

来源于php中文网

原创

c语言是许多程序员的入门语言,其重要性不言而喻,因为它奠定了许多编程习惯和逻辑思维的基础。我通过学习c语言,编写了一个推箱子小游戏,提升了我的逻辑能力。现在,我想与大家分享这个推箱子小游戏项目。

GitHub 仓库地址:https://www.php.cn/link/9a66e987aff9a6d0f673189ca1e72f78

首先,让我们看一下游戏运行的最终效果。

人人都可以用C语言写推箱子小游戏最终的效果图

这是一个在 Windows Dos 界面下运行的小游戏,游戏界面上显示了推箱子的地图。其中,# 表示地图的边界,P 表示推箱子的小人,X 表示箱子,O 表示箱子需要推到的目标位置。

立即学习C语言免费学习笔记(深入)”;

游戏操作使用 W(w)、S(s)、A(a)、D(d) 键,分别对应小人向上、下、左、右移动。

在编写这个小游戏时,我们面临了一些挑战:

  1. 如何保存游戏地图?

  2. 游戏如何运行?

  3. 如何在固定位置上不断更新游戏地图?

  4. 小人的移动逻辑如何实现?

  5. 游戏如何结束?

  6. 如何保存游戏地图?

    C语言只有基本的数据类型,而游戏地图是二维的平面结构。我们可以使用二维数组来保存游戏地图,具体代码可在 GitHub 仓库中的 关卡.h 文件中找到。

    人人都可以用C语言写推箱子小游戏游戏地图

  7. 游戏如何运行?

    由于推箱子游戏在结束前需要不断接收用户输入,我们可以设置一个标志来判断游戏是否结束,并将此标志设置为 while 循环的条件。在每次循环中,接收用户输入,根据输入值决定小人的移动方向(上下左右),这里可以使用 switch 语句来判断。每一次循环对应一次用户输入。

  8. 如何在固定位置上不断更新游戏地图?

    在每次循环中,首先显示当前的地图以便用户进行下一次移动。我们将游戏地图设置为全局变量,这样小人移动后,地图上的字符改变将是永久的,然后打印出局部改变的新地图。程序不断循环,一遍遍打印地图,使得地图上的字符可以不断改变,但地图的位置无法固定。我们可以通过刷新界面来实现这一点。刷新本质上是除旧迎新,即清除原来的界面,再显示新的界面。C语言中可以使用 system("cls") 函数清除控制台内容,然后再显示新的地图内容。

    小人的移动逻辑属于具体的程序实现,我们稍后再讨论,先来说说程序如何结束。

    LobeHub
    LobeHub

    LobeChat brings you the best user experience of ChatGPT, OLLaMA, Gemini, Claude

    下载
  9. 游戏如何结束?

    前面提到设置一个标志来判断游戏是否结束,但游戏何时结束呢?推箱子的目标是将每个箱子推到目标位置,这是一种结束情况。由于每次循环都要判断,可以将其写成一个函数。另一种情况是用户不想玩了想退出,这里只考虑了这两种情况,读者可自行考虑其他情况。

    到目前为止,我们可以写出程序的大致框架:外部一个大循环,每次循环先刷新界面,接收用户输入,处理用户输入,判断游戏是否结束。

    人人都可以用C语言写推箱子小游戏程序大致框架

  10. 小人的移动逻辑如何实现?

    在上面的程序截图中,可以看到我将小人的上下左右移动分别写到了四个函数中,分别是 MoveToUp()、MoveToDown()、MoveToLeft()、MoveToRight()。以 MoveToUp() 函数为例,我们来分析小人移动的逻辑。

    理论上,小人可以上下左右移动,但由于有地图的限制,小人不能穿墙,只能在允许的道路上移动。例如,小人想向上移动,但如果上面一格有限制物(如墙),就不允许移动。

    人人都可以用C语言写推箱子小游戏不能向上移动

    而如果上面一格没有限制物,小人就可以向上移动。

    人人都可以用C语言写推箱子小游戏可以向上移动

    因此,我们需要对小人理论上可以移动到的位置(下一位置)进行判断。如果下一位置不是限制物(箱子和箱子要移动到的位置),小人就可以移动。如果有限制物,就不能移动。我们需要记录一个坐标点的值,游戏开始时,小人的初始位置作为当前位置。小人向上移动时,下一位置的横坐标就是小人当前位置的横坐标减一,纵坐标不变。然后根据下一位置的横纵坐标找到具体的字符值,如果是空的或目标位置,小人就可以移动。如果下一位置是箱子,我们还要考虑箱子的下一位置。由于小人和箱子在一条线上移动,小人向上移动时,箱子的下一位置的横坐标就是小人下一位置的横坐标减一,两者的纵坐标相同。同样,我们也要对箱子下一位置的字符值进行判断,如果是空格或箱子可以移动的位置,就可以移动。小人向上移动的代码如下:

    人人都可以用C语言写推箱子小游戏小人向上移动

    小人向下、向左、向右移动的代码类似,只需修改小人移动的下一坐标。向下移动时,下一位置的横坐标是小人的横坐标加一,纵坐标不变。具体代码请参见 GitHub 仓库中的 控制.cpp 文件。

    到这里,整个程序就完成了,可以运行整个程序,效果如下,你能发现哪里有 Bug 吗?

    人人都可以用C语言写推箱子小游戏有Bug的效果图

    细心的你可能已经发现了,当小人移动到箱子要移动的目标位置,再移出,这个位置就会“消失”。这是因为我们在移动之前没有关注这个位置(上一位置)原本的值。我们可以记录这个“上一位置”的值,但这样考虑的问题就比较多了,尤其是在箱子和小人都在箱子要移动的目标位置时,情况很复杂。实际上,我们的程序大体上是没什么问题的,只是箱子要移动的目标位置会出现“字符消失”。这只是个小 Bug,微软的做法是发布补丁,我们也可以给这个程序打个“补丁”。箱子要移动的位置是不变的,我们可以用一个二维数组来存放这些特殊位置。这些特殊位置的值也是特殊的,要不就是目标位置,要不就是箱子,要不就是小人,而不能是空白字符。我们可以写一个“补丁”函数来修复这个 Bug。在每个方向的移动函数结尾加上这个修复函数。该函数判断特殊位置是否为空白字符,如果是,就将特殊位置的值改为目标位置的字符值,这里是字符 “O”,这样就“修复”了程序的 Bug,“字符消失”的问题也被解决了。

    人人都可以用C语言写推箱子小游戏修复函数

    我将程序划分成了不同的文件,GitHub仓库也有程序目录的说明文件,读者在阅读代码时,会注意到 extern 关键字的使用,这个关键字是为了拆分的多个文件之间共用某个变量或者函数。通过更换关卡中的游戏地图,可以实现推箱子的多个关卡,读者有兴趣可自己尝试改进,本文也是起到一个抛砖引玉的作用。

    最后想说的是,写程序很注重逻辑,无论用什么语言,程序的逻辑都是一样的,无非就是哪种语言更方便,更快捷。写程序真正玩的是逻辑,只有逻辑清晰,代码才能写得好,否则顶多也是代码的搬运工。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

397

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

618

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

354

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

258

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

600

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

525

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

640

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

601

2023.09.22

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++教程
C++教程

共115课时 | 13.1万人学习

Java 教程
Java 教程

共578课时 | 48.7万人学习

Webpack4.x---十天技能课堂
Webpack4.x---十天技能课堂

共20课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号