C语言实战 | “贪吃蛇”游戏

简介: 【7月更文挑战第5天】在C语言实战中,本文档介绍了如何构建一个简单的“贪吃蛇”游戏。游戏的核心是控制蛇移动并增长,当吃掉食物时,蛇的身体变长。数据结构使用固定大小的数组表示蛇的位置,变量存储食物位置和蛇的长度。初始化后,利用非阻塞式`getKey()`函数实现WASD键盘控制蛇的运动方向。虽然蛇的边界检测和吃食物后的增长尚未详细说明,但提到了这些问题作为练习留给读者解决,并预告将在后续章节讨论模块化编程以简化复杂代码。

image.png


C语言实战——“贪吃蛇”游戏



# 01、综合案例

“贪吃蛇”是一款非常经典的休闲益智类游戏,玩法非常简单,通过上、下、左、右键控制蛇的运动方向,使蛇可以吃到食物。吃到食物之后,蛇会变得越来越长,如果撞上自己的身体或者墙壁,游戏就结束。这款游戏有几十年的历史,在此期间,衍生了各种版本,如增加多人对战模式、障碍物等新型玩法。

image.png


■ 图5.12“贪吃蛇”游戏示意图

本章需要完成的版本非常简单,按键控制“贪吃蛇”上、下、左、右运动,当“贪吃蛇”吃到食物时,身体会变得越来越长。如图5.12所示,上面4个小方块构成的是“贪吃蛇”,中间单独的方块是“食物”。

  1. 初始化数据
    “贪吃蛇”游戏主要包含两个重要角色:“贪吃蛇”和“蛋”。完成游戏的第一步,需要找到合适的数据类型存储游戏元素。“贪吃蛇”由一组方块组成,可以使用一维数组来存储“贪吃蛇”的位置信息。简易版的“贪吃蛇”游戏,假定每次屏幕上只出现一个“蛋”,所以只需要单个变量就能存储“蛋”的位置信息。
    “贪吃蛇”吃到“蛋”之后,身体会变长,而数组一旦定义之后,长度就固定了,那有没有可变长的数组呢?C语言在新的C99标准中支持“可变长数组”,但是很多编译器暂时不支持C99标准。不妨先将问题简化处理,先定义一个空间较大的数组,就像平时做预算时,把额度定得大一些,留下空间以备不时之需。同理,最开始时,将数组的大小设置大一些,留下足够的空间,应付不断变长的“贪吃蛇”。
    选择好了合适的数据类型,就可以定义合适的数据类型保存数据。
    保存“蛋”位置的变量为:

    image.png


    保存“贪吃蛇”的数据数组为:

    image.png


    另外,还需要变量记录贪吃蛇的长度,初始长度为4:

    image.png

    1. 显示“贪吃蛇”
      初始化数据之后,根据数据信息,可以将“贪吃蛇”“蛋”显示在屏幕上,代码如下:
      image.png
      编译并运行代码, “贪吃蛇”和“蛋”显示在屏幕上。
    2. 按键控制“贪吃蛇”运动方向
      接下来实现按键W、S、A、D控制“贪吃蛇”上、下、左、右运动。例5.3中实现的“贪吃蛇”游戏与经典版的“贪吃蛇”游戏有一点点区别,经典版中的游戏中,“贪吃蛇”一直沿着某个方向运动,按键按下改变其运动方向。这个问题很容易就能解决,需要使用到项目提供的getKey()函数,getKey()函数是在getch()函数的基础上加工而成的。它们之间的区别在于getch()函数是阻塞式函数,意思是这个函数不执行完,程序就一直停在这里,使用getch()函数时,必须按下任意键,才能执行后面的程序。getKey()函数是非阻塞式函数,如果想实现经典版“贪吃蛇”运动模式,就需要改用项目提供的getKey()函数。解决方法是定义一个变量记录“贪吃蛇”运动的方向,分别使用1、2、3、4代表方向上、下、左、右,如果有方向键按下,“贪吃蛇”的运动方向根据按键发生变化,否则就按原方向继续运动,代码如下:
      image.png
      image.png
      image.png
      image.png
      编译并运行代码,“贪吃蛇”会一直沿着某个方向运动,除非通过按键改变运动方向。如果贪吃蛇运动到屏幕的边界,即将要出界,该如何处理?读者可以尝试完善程序,解决这个问题。

完成了通过按键控制“贪吃蛇”运动方向的任务之后,如果继续完成“贪吃蛇”吃到“蛋”变长的任务,容易出现错误。因为代码已经较为复杂了,继续再往上添加新的代码,可能产生错误,导致整个代码都无法运行。第6章将会讲解模块化程序设计,将程序分解成一个个独立的小模块,然后再将其组合成完整的项目。模块化的设计会降低程序设计的复杂度和难度,使得程序结构更清晰、层次更明确、更容易扩充、可维护性高。

目录
相关文章
|
1月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
100 0
|
14天前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
26 1
|
1月前
|
编译器 C语言
猜数字游戏实现#C语言
猜数字游戏实现#C语言
83 1
|
1月前
|
存储 C语言
揭秘C语言:泊舟的猜数字游戏
揭秘C语言:泊舟的猜数字游戏
|
1月前
|
存储 定位技术 API
C语言项目实战:贪吃蛇
C语言项目实战:贪吃蛇
|
1月前
|
C语言
初学者指南:使用C语言实现简易版扫雷游戏
初学者指南:使用C语言实现简易版扫雷游戏
37 0
|
1月前
|
C语言
C语言扫雷游戏(详解)
C语言扫雷游戏(详解)
40 0
|
1月前
|
C语言
【C语言】实践:贪吃蛇小游戏(附源码)(三)
【C语言】实践:贪吃蛇小游戏(附源码)
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
35 3
|
13天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
28 6