c语言中的2d游戏编程教程:snake

本教程的目的是通过示例教授2D游戏编程和C语言。作者曾在20世纪80年代中期编写游戏程序,并在90年代担任微处理器的游戏设计师一年。虽然其中的大部分内容与当今大型3D游戏的编程无关,但对于小型休闲游戏来说,这将是一个有用的介绍。...

本教程的目的是通过示例教授2D游戏编程和C语言。作者曾在20世纪80年代中期编写游戏程序,并在90年代担任微处理器的游戏设计师一年。虽然其中的大部分内容与当今大型3D游戏的编程无关,但对于小型休闲游戏来说,这将是一个有用的介绍。

实现snake

像snake这样的游戏,对象在2D区域上移动,可以将游戏对象表示为2D网格或一维对象数组。这里的“对象”是指任何游戏对象,而不是面向对象编程中使用的对象。

游戏控制

这些键在W=向上、A=向左、S=向下、D=向右的情况下移动。按Esc键退出游戏,按f键切换帧速率(这与显示不同步,所以可以很快),按tab键切换调试信息,按p键暂停。暂停后,标题会改变,蛇会闪烁,

在snake中,主要的游戏对象是

  • 陷阱和水果

出于游戏的目的,INT数组将容纳每个游戏对象(或蛇的部分)。这也有助于将对象渲染到屏幕缓冲区中。我为游戏设计了如下图形:

  • 水平蛇身-0
  • 垂直蛇身-1
  • 头部4 x 90度旋转2-5次
  • 尾部4 x 90度旋转6-9
  • 方向变化的曲线。10-13
  • 苹果-14
  • 草莓-15
  • 香蕉-16
  • 陷阱-17
  • 查看snake图形文件snake.gif

因此,在定义为block[WIDTH*HEIGHT]的网格类型中使用这些值是有意义的。由于网格中只有256个位置,我选择将其存储在一个一维数组中。16 x16网格上的每个坐标都是0-255的整数。我们使用了ints,所以你可以把网格变大。一切都由#定义,宽度和高度均为16。由于snake图形为48 x 48像素(GRWIDTH和GRHEIGHT#定义),窗口最初定义为17 x GRWIDTH和17 x GRHEIGHT,仅略大于网格。

这对游戏速度有好处,因为使用两个索引总是比使用一个索引慢,但这意味着不是从蛇的Y坐标中加减1来垂直移动,而是减去宽度。添加1以向右移动。然而,我们还定义了一个宏l(x,y),它在编译时转换x和y坐标。

什么是宏(a macro)?

#define l(X,Y)(Y*WIDTH)+X

第一行是索引0-15,第二行是索引16-31,以此类推。如果蛇位于第一列并向左移动,则在向左移动之前,必须检查坐标%WIDTH==0,右墙坐标%WIDTH==WIDTH-1。%是C模运算符(类似于时钟算术),并返回除法后的余数。31第16部分剩下15部分。

管理蛇

游戏中使用了三个方块(整数数组)。

  • snake[],一种环形缓冲区
  • 形状[]-保存蛇形图形索引
  • dir[]-保持蛇的每个部分的方向,包括头部和尾部。

在游戏开始时,蛇有两段长,一头一尾。两者都可以指向4个方向。对于北部,头部指数为3,尾部指数为7,对于东部头部指数为4,尾部指数为8,对于南部头部指数为5,尾部指数为9,对于西部,头部指数为6,尾部指数为10。虽然蛇是两段长的,但头部和尾部总是相隔180度,但蛇长大后,它们可以相隔90度或270度。

游戏开始时,头部在120处朝北,尾部在136处朝南,大致位于中部。只需花费大约1600字节的存储空间,我们就可以通过将蛇的位置保存在上面提到的snake[]环形缓冲区中,在游戏中获得明显的速度提升。

什么是环形缓冲器(a ring buffer)?

环形缓冲区是一个内存块,用于存储一个固定大小的队列,该队列必须足够大以容纳所有数据。在这种情况下,这只是为了蛇。数据被推到队列的前面,然后从后面取出。如果队列的前面碰到了块的末尾,那么它会绕过去。只要街区足够大,队伍的前面就永远赶不上后面。

从尾部到头部(即向后)的蛇的每个位置(即单个int坐标)都存储在环形缓冲区中。这给了速度上的好处,因为无论蛇走多远,只有头部、尾部和头部后的第一个部分(如果存在)在移动时需要改变。

将其向后储存也是有益的,因为当蛇获得食物时,它会在下次移动时生长。这是通过将磁头在环形缓冲区中移动一个位置并将旧磁头位置更改为一个段来实现的。蛇由头部、0-n段)和尾巴组成。

当蛇吃食物时,atefood变量设置为1并在函数DoSnakeMove()中检查

移动蛇

我们使用两个索引变量headindex和tailindex来指向环形缓冲区中的头部和尾部位置。它们从1(人头指数)和0开始。因此,环形缓冲区中的位置1保存板上蛇的位置(0-255)。位置0保留尾部位置。当snake向前移动一个位置时,tailindex和headindex都将增加1,当它们达到256时,将环绕为0。所以现在头部所在的位置就是尾部所在的位置。

即使是一条非常长的蛇,蜿蜒盘绕成200段。每次移动时,只有头部索引、头部旁边的线段和尾部索引会发生变化。

注意,由于SDL的工作方式,我们必须在每一帧绘制整个蛇。每个元素都被绘制到帧缓冲区中,然后翻转以便显示。这有一个优点,虽然我们可以画蛇平稳移动几个像素,而不是整个网格位置。

  • 发表于 2021-09-15 04:44
  • 阅读 ( 86 )
  • 分类:编程

你可能感兴趣的文章

目标c(objective c)和敏捷的(swift)的区别

...wift Objective C和Swift是广泛用于IOS和Mac应用程序开发的编程语言。Objective C是一个具有面向对象和其他新特性的C语言的超级集合。Swift是苹果开发的一种新语言。Objective C和Swift的关键区别在于,Objective C是一种通用编程语言,它在C...

  • 发布于 2020-10-19 22:48
  • 阅读 ( 368 )

python(python)和c语言(c language)的区别

python(python)和c语言(c language)的区别 编程语言允许人类为计算机创建一组有意义的指令来执行任务。Python和C是两种高级编程语言。Python和C语言的关键区别在于Python是一种多范式语言,C是一种结构化编程语言。本文讨论了每种...

  • 发布于 2020-10-24 05:03
  • 阅读 ( 306 )

寻找最好的编程语言?从这里开始!

...个从未接触过的编程新手,最重要的问题是:“哪种编程语言适合我?” ...

  • 发布于 2021-03-12 12:24
  • 阅读 ( 303 )

用unity编写游戏:初学者指南

...子里的游戏引擎”--一个物理和渲染引擎,带有几种脚本语言的挂钩,几乎可以适应任何类型的视频游戏。 ...

  • 发布于 2021-03-13 11:55
  • 阅读 ( 235 )

初学者最容易学习的6种编程语言

... 然而,学习编程就是要找到合适的语言,就像它是一个陶冶的过程。在任何情况下,这里有六个最简单的编程语言初学者。 ...

  • 发布于 2021-03-16 10:37
  • 阅读 ( 283 )

所以你想制作iphone应用程序?10个初学者项目

...你想尝试创建iPhone应用程序,你可以学习几种不同的编程语言。但其中只有一个是专门为iOS创建的:Swift。苹果从一开始就为**macOS、iOS、watchOS和tvOS应用构建了这种语言。它包含了许多特性,这些特性使它非常适合初学者。 ...

  • 发布于 2021-03-16 13:41
  • 阅读 ( 268 )

9个最好的代码游戏,以建立你的编程技能

...器人走向成功的人工智能——使用Java、Scala、C#等真正的语言。要开始学习,请查看Robocode基础知识和教程。 ...

  • 发布于 2021-03-17 21:19
  • 阅读 ( 447 )

适合初学者的最佳unity 3d教程

...平台上创建游戏的强大引擎。当Unity编辑器运行在C#编程语言上时,甚至可以不用编码来开发游戏。 ...

  • 发布于 2021-03-21 15:28
  • 阅读 ( 336 )

7统一游戏开发语言学习:哪种最好?

...的真正核心将是决定其行为的代码。为游戏开发学习哪种语言可能很难——但在统一的情况下,这很简单。 ...

  • 发布于 2021-03-21 18:18
  • 阅读 ( 258 )

学习c#编程的7个实际原因

选择要学习的编程语言可能很难。不同的语言擅长不同的事情,有一个既定的目标可以让事情变得更容易。如果你想学编程,但又不确定该走什么样的职业道路呢? ...

  • 发布于 2021-03-21 18:41
  • 阅读 ( 383 )