单击游戏交流网

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 108|回复: 0

用C/C++编写小游戏:第9章 俄罗斯方块

[复制链接]

1

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2022-12-3 19:16:41 | 显示全部楼层 |阅读模式
第9章  俄罗斯方块

《俄罗斯方块》(俄文“Тетрис”,英文“Tetris”)是俄罗斯数学家阿列克谢·帕基特诺夫(Алексей Пажитнов,英文:Alexey Pazhitnov)于1984年6月在测试一台新计算机的性能时而发明的一款消除类的休闲游戏。基本玩法是由四个小方格组成的不同形状的方块陆续从屏幕一个虚拟容器上方落下来,玩家通过调整方块的位置和方向,使它们在容器底部拼出完整的一行或多行。这些完整的一行会多行会随即消失,给新落下来的方块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。
游戏名“Tetris”来源于希腊语单词tetra,意思是“四”,而游戏作者阿列克谢最喜欢网球(tennis),于是他把两个词合而为一命名此游戏。
俄罗斯方块是一个风靡全球、经久不衰的游戏,同时也是一个经典的程序设计题。
9.1  游戏中的方块变体

“俄罗斯方块”的游戏主界面是一个用于摆放小型正方形的平面虚拟容器,其标准大小是:行宽为10,列高为20,以每个小正方形为单位。在下文中称这些小正方形为“方格”。
游戏中包含一组由 4 个方格组成的规则图形,英文称为Tetromino,中文直译称为“四格骨牌”,一般简称为“方块”。方块共有 7 个类别(Class),分别以 O、I、S、Z、L、J、T 这7个字母的形状来命名(中文有时称 O 型为田字型,称 L 型为倒 7 字型,J 型为 7 字型)。玩家可以以 90 度为单位旋转方块,则方块可以改变形状,同一类型的不同形状称为变体(Variant)。O型没有变体,I 型、S 型和 Z 型各有两种变体,L 型、J 型和 T 型各有四种变体,所以总共有 19 种形状。所有形状的方块都可以填入到一个 4 行 4 列的网格中,分别列出如下:



图9-1  俄罗斯方块形状

在游戏过程中,玩家按向上光标键时,方块会在同类的几个变体中循环变形。如果在程序中只设置 7 个类别,那么就需要添加算法实现在该类别中的变形,显然比较麻烦。因此可以在程序中设置 19 种类型(type),让某种变体在自己所在类别中变形即可。例如,把上图中的 19 种变体按照从左到右、从上到下编号为 1~19(每个变体右上角格点中的数字所示),则变化情况如下:

  • 1号变体为 O 型,不能变形,
  • 2号和3号变体为 I 型,可以互变;
  • 4号和5号变体为 S 型,可以互变;
  • 6号和7号变体为 Z 型,可以互变;
  • 8、9、10和11号为 L 型,可以循环变形;
  • 12、13、14和15号为 J 型,可以循环变形;
  • 16、17、18和19号为 T 形,可以循环变形。
游戏中所使用到的这 19 种方块变体,在程序中通常以其中的方格的相对坐标来描述。
按照屏幕坐标方向(水平向右为 X 轴正向,垂直向下为 Y 轴正向),通常把网格的行号和列号标注为 -1、0、1 和 2,因此每一个方格都可以用一个二维坐标描述。其中坐标为 (0, 0) 的方格可以称为基准格,通常以它来描述其它方格的相对位置。例如,O 型的其它三个方格的相对坐标为:(1, 0)、(1, 1)和(0, 1)。因此,假设一个O型方块的基准格的在容器内的坐标为 (x, y) 时,其它方格的坐标就是基准格的坐标加上各自的相对坐标:(x+1, y)、(x+1, y+1)和(x, y+1)。在程序中就可以利用这四个方格的坐标来描述一个方块。
上面以基准格的坐标 (0, 0) 和其它三个方格的相对坐标来描述方块是一种通俗易懂的方式。在现有的各种各样的俄罗斯方块的计算机程序中,还有另外几种也很常见的描述方式。
另一种常见的描述方式,是把每个 4x4 网格改成横排的方式来看待。例如 I 型的 1 号变体横排写成这样(用●表示基准格):


把它们视为排放在一维坐标上,取基准格的位置为 0,则其它三个方格的相对位置为 -4、4 和 8。当基准格在二维地图中的位置为 (x, y) 时,其它三个方格的位置为 (x-4%4, y-4/4)、(x+4%4, y+4/4) 和 (x+8%4, y+8/4)。
还有一种方式,是用 4x4 网格中各个格点的填充与空白来描述一个方块。例如用数值 1 表示填充、数值 0 表示空白,则 T 型方块的四个变体(即16、17、18、19)为:


看上去,每一个变体似乎需要用一个 4x4 的二维数组表示。但是也可以把一个变体的四行连续地写起来,例如 T 型方块的四个变体(即16、17、18、19)可以写作:
16: 0000111001000000
17: 0100110001000000
18: 0100111000000000
19: 0100011001000000
这样每个变体似乎需要用一个长度为 16 的一维数组来表示。但是考虑到每个位置上只需要表示 1 和 0 即可,所以只需要用一个二进制位来表示!16 个二进制位只需要用一个无符号的短整型数来表示即可。于是 T 型方块的四个变体(即16、17、18、19)可以按十六进制写成(开头的“0x”表示是十六进制写法):0x0E40、0x4C40、0x4D00 和 0x4640。
在程序设计中一旦选定了对数据(在本程序中就是方块)的某种描述方式,在程序中所有各个功能需要根据该表示方式来实现。因此,在对数据采用不同描述方式时,实现同一功能的语句可能会有很大差别。
继续阅读:9.2  容器的程序内部表示
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|单击游戏交流网

Copyright © 2001-2013 Comsenz Inc.Template by Comsenz Inc.All Rights Reserved.

Powered by Discuz!X3.4

快速回复 返回顶部 返回列表