火狐体育登入:用 ESP32 制造《俄罗斯方块》掌上游戏机

  1984 年,一位名叫阿列克谢·帕基特诺夫(Alexey Pajitnov) 的工程师,在其时的

在线订购

  1984 年,一位名叫阿列克谢·帕基特诺夫(Alexey Pajitnov) 的工程师,在其时的苏联科学院核算机中心工作。他的工作使命是测验新硬件设备的兼容性,比较单位分配的正式使命,更招引他的是研讨怎么运用核算机进行文娱。为此,帕基特诺夫开端测验在核算机上开发一些简略的游戏,经过一段时间的测验后,他从一款拼图游戏上取得了创意,考虑让不同形状的图形顺次下落,在矩形底部堆叠起来,使之排列成完好的一行后消除。在别的两位伙伴的帮忙下,帕基特诺夫在Electronika 60 核算机上完成了这款名为“Tetris”(俄语:Тетрис)的游戏,由于这个类型的核算机没有图形接口,所以游戏只运用空格和实心方块来表明形状(见图 1)。

  依据另一位当事人的回想,“Tetris”这个单词是阿列克谢自己创造并坚持运用的,来自反映俄罗斯方块图画根本结构的“四”(希腊语:tetra)和阿列克谢自己最喜欢的运动“网球”(tennis)的组合。今日咱们更习气称号这个游戏为《俄罗斯方块》。

  1985 年,《俄罗斯方块》的开发者之一 ——瓦丁·格拉西莫夫在 MS-DOS 下移植了《俄罗斯方块》(见图 2),伴随着 PC 的推行,游戏得以敏捷遍及。

  关于“80 后”来说,图 3 所示的《俄罗斯方块》掌上游戏机承载了许多高兴的回想。

  我这次运用ESP32 调配 ILI9341TFT LCD 来制造一个《俄罗斯方块》掌上游戏机,挑选的硬件如附表所示。

  硬件中最为杂乱的是 ILI9341 TFT 显现屏,它运用 SPI 接口进行通讯。丝印上的 SCL 和 SDA 分别是 CLK 和 MOSI(显现屏能够看作一个单纯的输出设备,因而MISO 是能够省掉的);RES 用于显现屏复位,在初始化显现屏时是必需的;DC用于告诉显现屏当时传输的是数据(Data)仍是指令(Command);CS 是 SPI 接口用于片选的信号,假如当时 SPI 总线上还有其他设备,能够用于选中需求的通讯设备;BLK 用于操控显现屏背光是否敞开,在这个项目中没有封闭显现屏的需求,因而直接悬空,显现屏会一向坚持背光翻开的状况。

  确认运用的硬件之后,就能够开端着手规划电路了,我运用立创 EDA 制作电路图和 PCB,成果如图 5、图 6 所示。能够看到电路很简略,除了前面说到的 TFT 显现屏便是 PS/2 摇杆,后者输出 2 路模拟信号和一个数字信号,分别是x 轴和y 轴坐标、按键信号。

  立创 EDA 供给在线预览东西,PCB 制作完成后能够直接检查终究作用(见图 7)。

  硬件规划完成后即可进行软件规划,比较硬件,软件规划要杂乱得多。代码全体能够看作两部分,一部分是在 screen[Width][Height]数组中核算界面的形状, 代码在Get Next PosRot() 和 Revise Screen() 函数中;别的一部分是经过 ILI9341 TFT 显现屏将前面的数组显现出来,代码在 Draw() 函数中。这样规划的优点是逻辑和硬件别离,便于调试和移植到不同显现接口的设备上。

  代码中最重要的数据结构是关于形状的寄存。游戏有 7 种形状(见图 8),能够看到每种形状都由 4 个方块组成,因而能够用方块的坐标表明形状。

  比方,图 8 所示的这个形状,以记载坐标的方法,可用 {{-1,1},, ,} 来表明。

  当它旋转后, 变成图9所示的形状,以记载坐标的方法,可表明为 {,, ,}。

  详细到代码中,我用 blocks[ ] 数组记载了每一种形状的悉数改换成果,旋转便是指向下一个内容。例如 blocks[ ] 数组中的一个形状界说如下:

  其间结尾处的深绿色1表明这个形状的色彩索引,浅绿色2表明这个形状有 2 个形状。{{-1,0},, ,}对应图10所示的形状,其间的 x 表明 (0,0) 这个原点。

  了解了上面的数据结构,就不难理解GetNextPosRot() 函数了。这个函数的功用是放置重生成形状、呼应按键动作(比方,左右移动和旋转)和触发下落。游戏的难度不同体现为图形不同的下降速度。游戏依据当时积分的不同运用不同的下降速度,详细代码在 GetNextPosRot() 函数中。

  Score2Level() 函数回来当时分数对应的延时,当时分数越高,下落速度越快。

  ReviseScreen() 函数处理下落的进程,此外计分功用也在该函数中:在消除行时,依据一次性消除的行数核算分数,详细在 DeleteLine() 函数中。每次取得的分数 = 消除层数的平方。

  此外,《俄罗斯方块》还要具有显现“下一个图形”的功用。为此,我在 Draw()函数中完成了对应的制作“下一个图形”的功用。这里有特别需求留意的当地,比方, 咱们定 义了一个 image[20][20] 图画,可是想将它里边 10×20 的内容显现出来,是不能够直接运用 tft.fillImage() 的,会呈现紊乱,由于这个函数会默许将显现Buffer 认为是 20×20 巨细的。解决方法是创立别的的 Buffer,先把数据存进去,再运用 fillImage() 函数制作。

  正版《俄罗斯方块》出售了 1.25 亿份,遭到 50 多个国家和地区的玩家喜欢,有超越50 种言语的版别,运转在街机、家用游戏机、掌上游戏机、PC、手机等几十种游戏平台上。历经近 40 年,小方块的魅力经久不衰,《俄罗斯方块》游戏能够称得上是传奇。


相关标签:
    相关产品
    地区产品 / city
      在线客服
      火狐体育网官方下载

      热线电话

      13930904978

      上班时间

      周一到周五

      公司电话

      0319-5536156

      二维码
      线