俄罗斯方块说明
- 格式:doc
- 大小:413.50 KB
- 文档页数:23
俄罗斯方块七种形状的名称俄罗斯方块是一款非常经典的游戏,它的七种形状也成为了人们熟知的名字。
下面,我们就来一一介绍这七种形状的名称以及它们的特点。
1. I型方块I型方块是最简单的形状,它由四个小方块组成,排列成一条直线。
这种形状在游戏中非常灵活,可以用来填充狭长的缺口或者创造更大的空间。
但是,I型方块也容易造成堆积,不慎使用就会出现堆叠不平衡的问题。
2. O型方块O型方块是一个正方形,由四个小方块组成。
这种形状在游戏中非常稳定,可以用来填充空隙或者创造更大的平面。
因为没有边缘和角落,O型方块不会轻易被其他方块影响,所以在游戏中往往能起到稳定作用。
3. T型方块T型方块是一个由四个小方块组成的T字形。
这种形状在游戏中非常灵活,可以用来填充缺口或者创造新的形状。
T型方块的特点是它有一个突出的小方块,可以用来填补空隙或者改变方块的方向。
4. L型方块L型方块是一个由四个小方块组成的L字形。
这种形状在游戏中非常常见,可以用来填补缺口或者创造新的形状。
L型方块的特点是有一个突出的小方块和一个突出的边缘,可以用来填补空隙或者改变方块的方向。
5. J型方块J型方块是一个由四个小方块组成的J字形。
这种形状在游戏中非常常见,可以用来填补缺口或者创造新的形状。
J型方块的特点是有一个突出的小方块和一个突出的边缘,可以用来填补空隙或者改变方块的方向。
6. S型方块S型方块是一个由四个小方块组成的S字形。
这种形状在游戏中非常常见,可以用来填补缺口或者创造新的形状。
S型方块的特点是有两个突出的小方块和两个突出的边缘,可以用来填补空隙或者改变方块的方向。
7. Z型方块Z型方块是一个由四个小方块组成的Z字形。
这种形状在游戏中非常常见,可以用来填补缺口或者创造新的形状。
Z型方块的特点是有两个突出的小方块和两个突出的边缘,可以用来填补空隙或者改变方块的方向。
以上就是俄罗斯方块七种形状的名称和特点。
这七种形状在游戏中的运用非常重要,掌握它们的特点可以帮助我们更好地进行游戏。
俄罗斯方块游戏机说明书
1.游戏介绍
俄罗斯方块是一款风靡全球的游戏,它曾经造成的轰动可以说是游戏史上的一件大事。
究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。
对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而随着游戏的发展,现在已经有
了液晶屏的俄罗斯方块游戏机,画面也更加酷炫,操作更加的真实多样,用户可进行更加酣畅淋漓的游戏体验。
其模式还增加了积分制,使用户既
能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。
通过高分记录,来展现自己的技术水平。
2.游戏规则
本次设计制作的俄罗斯方块游戏机,编写的程序在液晶屏的显示是不同的方块依次下落,可以在其下落的过程中控制它的变换,移动和开始暂停。
赢:把每行填满消除,填满一行消除一行并计算其得分情况
败:当方框内被堆满,而且无法消除时,将显示失败并显示总分
3.游戏操作
此游戏机通电后,其界面显示如下:
板子上有五个按键,依次时:开始/暂停、上下左右控制按键,可通过左右键选择需要的关卡。
按开始按键即可进入游戏界面,如下图:
可通过左右移动下落的方块,来控制方块下落的位置,消除得分。
如果来不及摆放可按暂停按键来停止下落。
当方块充满顶部且无法消除时,则显示你失败啦,需要重新来选择关卡继续游戏。
如下图:。
9999合一俄罗斯方块键盘说明键盘是玩这款游戏最常用的输入设备之一、通过键盘上的不同按键来控制方块的移动、旋转和下落。
本文将为大家详细介绍9999合一俄罗斯方块游戏的键盘按键及其功能。
1.上箭头(↑)键:使用上箭头键可以旋转方块。
每次按下上箭头键,方块将顺时针旋转90度。
玩家可以通过反复按下上箭头键来使方块得到不同的旋转角度。
2.下箭头(↓)键:使用下箭头键可以加速方块的下落速度。
通常,方块会以一定的速度自动下落,但是通过按下下箭头键,玩家可以加速方块的下落,使方块更快地堆叠在底部。
3.左箭头(←)键:使用左箭头键可以将方块向左移动一个单位。
每次按下左箭头键,方块将水平移动一个单位。
玩家可以通过反复按下左箭头键来将方块移动到所需的位置。
4.右箭头(→)键:使用右箭头键可以将方块向右移动一个单位。
每次按下右箭头键,方块将水平移动一个单位。
玩家可以通过反复按下右箭头键来将方块移动到所需的位置。
5.空格键:使用空格键可以直接将方块放置在堆中的最底部。
按下空格键后,方块将立即下落并堆叠在底部。
6. Enter键:使用Enter键可以重新开始游戏。
当玩家输掉游戏或者想要重新开始时,可以按下Enter键重新开始。
7.P键:使用P键可以暂停游戏。
按下P键后,游戏会暂停,玩家可以选择继续游戏或者退出。
除了上述常用的按键之外,不同的游戏版本和不同的平台可能还有其他一些特殊按键或功能。
玩家可以根据自己所使用的游戏平台和设备来了解和使用这些特殊功能。
总的来说,9999合一俄罗斯方块游戏的键盘说明非常简单明了。
通过上下左右箭头键来控制方块的移动和旋转,通过空格键来快速放置方块。
希望这份键盘说明能够帮助到你,玩得愉快!。
俄罗斯方块小游戏俄罗斯方块是一款经典的益智小游戏,玩家需要操作不同形状的方块,将它们放置在游戏区域内,以创建完整的水平行,当一行被填满时,该行将被消除并获得得分。
游戏的目标是尽可能地消除更多的行并获得更高的得分。
游戏规则:1. 游戏区域是一个矩形区域,通常是10个宽度和20个高度的格子。
2. 游戏开始时,一个随机的方块会从游戏区域的顶部落下。
3. 玩家可以通过左右移动方块来调整它的位置,还可以旋转方块使其适应不同的形状。
4. 一旦方块落到底部或者另一个方块上,它将固定在该位置。
5. 当一行被完全填满时,该行将被消除并获得得分。
6. 消除多行将获得更高的得分,例如一次消除两行会比分别消除两次一行得分更高。
7. 当方块堆积到达游戏区域的顶部时,游戏结束。
术语和技巧:1. 方块形状:俄罗斯方块由四个小方块组成,可以是不同的形状,例如长条形、正方形、L形、T形等。
2. 下落速度:方块下落的速度会逐渐加快,玩家需要适应不同的速度来操作方块。
3. 消除连击:如果玩家成功连续消除多行,将会获得额外的得分奖励。
4. 持久力:玩家需要保持冷静和集中,快速做出决策,并将方块放置到最佳位置,以避免堆积过高。
创造性和想象力:1. 策略:玩家可以尝试不同的策略,例如优先消除多行、保留空间以便后续方块的放置等。
2. 速度挑战:玩家可以尝试在更快的下落速度下游戏,以增加挑战和乐趣。
3. 多人游戏:俄罗斯方块也可以与其他玩家进行对战,看谁能够更快地消除行并干扰对手。
通过以上的介绍,读者应该能够完全理解俄罗斯方块的玩法和规则。
这款游戏简单易懂,但又有足够的挑战性和乐趣,可以让玩家尝试不同的策略和方法,提高自己的技巧,并享受游戏带来的快乐。
火拼俄罗斯方块新手入门教程俄罗斯方块是一款经典的益智游戏,相信很多人小时候都玩过。
对于新手来说,可能对游戏规则和策略还不太熟悉。
下面是一个针对新手的入门教程,帮助你快速上手并提高游戏水平。
一、游戏规则俄罗斯方块是由七种不同形状的方块组成,玩家需要操作方块使其拼成完整的一行或多行,拼满的行会消除,并获得相应的得分。
随着游戏进行,方块会逐渐加速下降,难度也会相应增加。
二、操作方式1.左右移动:使用键盘的左右箭头键来左右移动方块的位置,可以将方块移动到你需要的位置。
2.加速下降:按下键盘的下箭头键,可以加速方块的下降速度。
3.旋转方块:使用键盘的上箭头键或者空格键来旋转方块,适当的旋转可以使得方块更好地拼接到已有的方块上。
三、基本策略1.空隙利用:当方块下降时,不要着急将它放在最下方,可以先让方块悬空,留出空隙,以便更好地进行拼接。
2.消除优先:尽量将方块放在已有方块上方的空隙中,这样能够优先消除行。
消除行有助于释放出更多的空间,并提高得分。
3.高层建筑:尽量将方块放在下方,能够确保在后续拼接中有更多的空间可供利用。
4.预判下落点:在方块下降过程中,要学会预判方块下落的位置,做好相应调整,以便更好地拼接。
5.快速下降:当方块已经到达合适的位置时,可以加速下降,以便快速进入下一个方块的拼接。
四、高级技巧1.T字型方块的利用:T字型方块能够将一些较小的空隙填满,是非常有用的方块之一,合理利用它能够获得更高的得分。
2.横向拼接:当出现一块凸起的方块时,可以尝试从侧面将方块填充进去,这样能够释放更多的空间,并获得消除行的机会。
3.节奏感:将游戏节奏掌握好,避免因为匆忙而操作失误。
可以通过连续消除行来延长方块下降的时间,提高游戏的连贯性。
4.留存空隙:在游戏进行到较高难度时,留存一些空隙,以备后续方块的拼接。
注意控制空隙的分布,避免一些无法填充的空白区域。
五、注意事项1.不要等待完美:不要一直等待完美的方块状态,相信自己的判断,及时行动。
俄罗斯方块规则说明
俄罗斯方块规则说明
一、基本规则
1、游戏空间
玩家在一个10x20范围的空间内,进行游戏
2、游戏包含多种图形
正方形
Z型(左向,右向)
T型
L型(左向,右向)
长条
3、下落规则
每次系统随机从屏幕上方正中下落一个图形
系统会提示下一个图形
4、玩家操作
玩家使用键盘控制当前下落图形
(1)玩家可以控制图形的移动(左移或右移)
(2)玩家可以控制下落加速
(3)玩家可以旋转图形(90度旋转)
(4)当图形下落至游戏空间底部或接触其他触底图形时,下落停止,玩家无法继续操控此图形
5、消除规则
当玩家控制的下落图形填满横向一行所有空格时,本行自动消除
6、计分规则
每当玩家消除一行时,玩家得100分
一次消除的行数越多可以得到更多的分数
一次消除2行得分
一次消除3行得分
一次消除4行得分
在屏幕左上角第一行显示玩家目前游戏的得分
在屏幕左上角第二行显示玩家已经消除的行数
在屏幕左上角第三行显示玩家当前的游戏速度
在屏幕右上角第一行显示玩家的最高得分
在屏幕右侧,显示玩家每种图形使用的次数
7、结束规则
当正中图形无法下落时,游戏结束
出现GAMEOVER的字样
玩家按键,重新回到开始菜单
8、胜利规则
当消除行数达到30行,本关过关
播放奖励舞蹈画面,根据玩家本关的表现,跳舞人数会产生变化在屏幕左侧出现游戏分数计算
过关之后,图形下落速度自动加速1级。
俄罗斯方块规则说明
一、基本规则
1、游戏空间
玩家在一个10x20范围的空间内,进行游戏
2、游戏包含多种图形
正方形
Z型(左向,右向)
T型
L型(左向,右向)
长条
3、下落规则
每次系统随机从屏幕上方正中下落一个图形
系统会提示下一个图形
4、玩家操作
玩家使用键盘控制当前下落图形
(1)玩家可以控制图形的移动(左移或右移)
(2)玩家可以控制下落加速
(3)玩家可以旋转图形(90度旋转)
(4)当图形下落至游戏空间底部或接触其他触底图形时,下落停止,玩家无法继续操控此图形
5、消除规则
当玩家控制的下落图形填满横向一行所有空格时,本行自动消除
6、计分规则
每当玩家消除一行时,玩家得100分
一次消除的行数越多可以得到更多的分数
一次消除2行得分
一次消除3行得分
一次消除4行得分
在屏幕左上角第一行显示玩家目前游戏的得分
在屏幕左上角第二行显示玩家已经消除的行数
在屏幕左上角第三行显示玩家当前的游戏速度
在屏幕右上角第一行显示玩家的最高得分
在屏幕右侧,显示玩家每种图形使用的次数
7、结束规则
当正中图形无法下落时,游戏结束
出现GAMEOVER的字样
玩家按键,重新回到开始菜单
8、胜利规则
当消除行数达到30行,本关过关
播放奖励舞蹈画面,根据玩家本关的表现,跳舞人数会产生变化在屏幕左侧出现游戏分数计算
过关之后,图形下落速度自动加速1级。
〈俄罗斯方块规则简述〉 游戏元素: [元素] 方块[规格] 5×5像素 [颜色] 黑色[状态] 透明,不透明 [核心规则]元素: Fangkuai_bitmap(方块美术图文件名) 规格: 5×5像素 黑色变量: alpa (alpa=1为透明,alpa=0为不透明)场景构成:[形状] 长方形,长>宽[规格] 由M ×N 个元素方块构成,M 表示长,N 表示宽,一个方块大小为一个计量单位 比如:18×12 表示长度为18个方块大小,宽度为12个方块大小。
[颜色] 透明[状态] 所有方块alpa=1 [核心规则]构成元素: M ×N 个Fangkuai_bitmap 方块识别: 引入数组ALL[X,Y]来对每一个方块在场景中的位置做唯一的标记,X 的数值对应M 的数值,Y 的数值对应N 的数值。
例如:18×12大小的场景,由18×12个方块组成,那么用ALL[X ,Y]来标记方块变量赋值: alpa=1(默认初始状态)X 标记Y 标记这样,坐标[1,1]就表示图中黑色的方块, 坐标[18,12]就表示图中红色的方块依次类推。
积木生成:[元素] 方块[规格] 由4个方块按照一定规则组合而成,如图:共计19件[颜色]黑色[状态]不透明[核心规则]积木是通过场景中以下坐标标记的方块的alpa值来生成的:[1,Y\2-1] [1,Y\2] [1,Y\2+1][2,Y\2-1] [2,Y\2] [2,Y\2+1][3,Y\2-1] [3,Y\2] [3,Y\2+1]生成积木的时候,更改相应的方块变量值,其变量alpa=0以下坐标标记的方块为需要更改alpa值的方块:(参考场景构成的[方块识别] )积木代号:A_1积木代号:A_2积木代号:B_1积木代号:B_2积木代号:C_1积木代号:C_2积木代号:C _3积木代号:C_4积木代号:D_1积木代号:D_2积木代号:D_3积木代号:D_4积木代号:E_1积木代号:F_1积木代号:F_2积木代号:G_1积木代号:G_2积木代号:G_3积木代号:G_4碰撞检测规则:[碰撞规则](在方块下落之前,我们要先进行碰撞检测。
俄罗斯方块说明E-Mail:leyafo@起源:俄罗斯方块(Tetris, 俄文:Тетрис)是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。
俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
由于俄罗斯方块具有的数学性、动态性与知名度,也经常拿来作为游戏程序设计的练习题材。
俄罗斯方块的基本规则:1、一个用于摆放小型正方形的平面虚拟场地,其标准大小:行宽为10,列高为20,以每个小正方形为单位;2、方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名;3、通过设计者预先设置的随机发生器不断地输出单个方块到场地顶部,以一定的规则进行移动、旋转、下落和摆放,锁定并填充到场地中。
每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并且以此来换取一定的积分或者其他形式的奖励。
而未被消除的方块会一直累积,并对后来的方块摆放造成各种影响。
4、如果未被消除的方块堆放的高度超过场地所规定的最大高度(并不一定是20或者玩家所能见到的高度),则游戏结束。
以上文字来源于百度百科.一.设计方案当前的下落方块下一次要出的方块,此区域对应一个4*4的数组. 被画红的区域坐标点映射为1显示分数,和当前游戏速度的区域游戏区域,下落方块堆放的地方.此区域对应一格21*11的数组.下文简称<游戏区>或<大数组>以上就是整个程序的界面了.程序主要由一个11*21 的2维数组 (,控制下落后的方块显示)二个4*4的二维数组 分别控制当前下落方块 和下一次方块的显示..3个数组都为int 型,有图形的地方设为1没有图形的地方设为0;1.产生方块方块一共有7种图形. 每个图形占4个格子..首先由用rand 函数 产生0~6的随机数. 然后设定好7种图形在4*4的2维数组所占的坐标点.选中其中的一个之后,在用rand 函数产生0~3的随机数进行旋转(方块最多转3次,转4次的话就会转回来了). 这样就尽可能的保证方块的随机性了.2.方块旋转田字形方块不能旋转,排除出去1字形方块旋转只需要对二维数组进行简单的行列互换即可.其他的方块的旋转规律为(1,1)的位置不动.移动其他3块方块的位置如下面左图所示 00的位置放到02 , 02的位置放到22, 22的位置放到20 以此类推.4.方块消除如果一行满了(二维数组中某一行全部为1),消除这一行.操作方法:1.先把这一行的数据全部都设置为0,2.和上面的行进行交换,直到顶部为止. (箭头表示两行数据进行交换)这一块是不必移动的 主要移动这两块区域5画图基本思路:根据2维数组的值画图,为1就画个小框,为0就不管.以2维数组的下标为坐标. 然后定义一个getpoint函数. (返回一个cpoint数组.)在此函数内部扫描2维数组, 如果为1就把当前的下标值存入cpoint数组.扫描返回的那个的cpoint数组,进行图形填充.以上就是简单的设计方案.=============================================以下是函数的说明代码一共有两个类.CData 产生数据的地方CTetrisView MFC的视图类根据CData 所产生的数据进行画图和判断方块的移动以及旋转是否合法.CData类就是上面设计方案的实现所以不用介绍了.以下介绍view类数据成员.UINT m_speed; //游戏速度UINT m_score; //游戏分数CBrush m_brush; //背景画刷BOOL m_bDone; //用于判断方块是否构建好了CDC *m_PaintDC; //游戏兼容dc , 专门用于画图CBitmap *m_Pbitmap; //兼容位图int m_y; //统一的y坐标int m_x; //统一的x坐标std::vector<CPoint>m_point; //4块方块所在的坐标CRect m_rectgame //游戏区域的矩形大小CRect m_rectnext; //下一次出方块区域的矩形大小Fmod 组件用于连续播放游戏的背景音乐.FMOD::System *system;FMOD::Sound *sound;FMOD::Channel *channel;成员函数OnDraw(CDC* pDC)游戏的主要绘图,用于绘制游戏的界面,以及刷新后的图形显示..InitGame();初始化游戏1.创建兼容设备dc ,2.填充画面背景,.3.产生当前要出的方块. 和下一块方块4.设定m_y,m_x的初始值.用于画图.5画出当前下落的方块,和下一次要出的方块.6.播放背景音乐,设定定时器.DrawBlock(vector<CPoint> point,int x,int y,CDC* pDC)根据传入的point数组,在x,y上面画矩形.矩形的大小宽=游戏矩形(m_rectgame)的宽/11;长=游戏矩形(m_rectgame)的宽/21;DrawNext(CDC *dc)画出下一次要出的方块, 画之前先把背景抹掉DownBlock(vector<CPoint>point,BOOL Style).方块下落2种下落方式,根据style判断,是哪一种下落方式FAST:马上下落,SLOW:一格一格的下落SLOW下落:扫描当前方块下面是否有方块,(扫描大数组中指定的坐标是否为1).如果到了最底部直接返回. 并把m_bdone设置为true.表示这块方块已经放好了.FAST下落:直接判断下面是否有方块,如果没有就下落一格.再递归调用此函数的FAST风格.直到下面有方块或者到最底部为止.MoveBlock(BOOL op)根据op判断方块是否是向左移动,还是向右移动.并且判断方块是否已经构建好了.然后擦除当前位置的方块.再用CanMove函数判断方块移动是否合法,不合法的话退回来.把方块画回原来的位置/合法的画在新位置上画上方块.CanMove(vector<CPoint> point)判断方块所在的位置是否合法.有2种情况是不合法的1,超出左右两边的墙了2.左右两边已经堆放了其他的方块.OnStart()响应Game------Start消息.初始化游戏.把所有的数据清0;OnTimer(UINT nIDEvent) 定时器消息(相当于电脑自动地在按键盘的向下键)擦除先前位置的方块让方块一格一格地下降.画出新位置的方块.再调用Running函数让游戏周而复始的出方块直到游戏结束.OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)响应键盘按键消息如果游戏结束,直接返回不响应按键操作.其中"+" "-" 加游戏速度和减游戏速度.ClearBlock(vector<CPoint> point,CDC* dc)把当前位置的方块图像擦除.方法跟画方块差不多.就是把那一块地方填充黑色背景.void CTetrisView::Transform()方块旋转把当前的形状保存首先判断方块旋转后是否合法不合法的情况:1.方块旋转后超出了游戏的界面. 比如靠墙的时候不能旋转;2.旋转后覆盖到了已经堆好的方块,3已经到了最底部了(方块已经构造好了).不合法的话就把原来的形状变回来.Running()程序的活水源头首先判断方块是否已经构建完成.然后判断构建完成后的方块是否已经到了最顶部了,如果到了最顶部的话就干调定时器,关调背景音乐.结束游戏.直接返回.如果方块没到顶部. 把这一次的方块准备好, 并取得下次所需的方块.设置m_x,m_y的初值(.方块最开始出现的地方.)画出当前的方块和下一次的方块.MappingArray(vector<CPoint> point)根据坐标把有方块的地方映射为1.并且判断最上面一行是否有方块.然后调用消除方块的函数,查看是否达到了消除一行的条件了.DropBlock(int sign,CDC *dc)首先调用data类的dropblock 函数判断是否达到消除一行的条件了,如果data类的m_count 大于0.就表示达到了消除方块的条件.调用Refresh()刷新整个游戏区域.Refresh()首先把游戏区的图像全部擦除,(用fillrect填充黑色).然后再根据m_gameblock二维数中为1的那以块进行画方块的操作.ShowData()显示分数信息ChangeSpeed(UINT nChar)改变游戏速度并显示。
俄罗斯方块最详解(C语言实现)俄罗斯方块最详解做每一件事前,都会有一个粗略的构想。
编程更应该这样,现在先说一些大的、粗略的东西。
******************************************************************************* **************************************************************************************** *********目录:●屏幕的划分●图形显示●三种坐标。
绝对坐标、相对坐标、左上角坐标●方块的构造●动画效果●键盘控制●判断方块碰撞●消行●变形●关于菜单的制作●附录(完整的源程序)******************************************************************************* **************************************************************************************** *********1、屏幕的划分将整个屏幕划分成四部分:a、一个没盖的杯子;b、一个不断下落4*4数组的盒子;c、一个给预览下一个方块4*4数组的盒子;d、提示信息。
由于提示信息比较简单,这里只讨论前三样。
没盖的杯子:即平时说玩这款游戏时,下落方块不可超出的那个边界,下落的方块从这个“杯口”的上方往下下落,方块只在“杯子”里移动、变形、停止。
游戏空间指的是整个游戏主要的界面(呵呵,其实就是所说的“杯子”)。
实际上是一个宽10格子、高20格子的游戏板。
用一个全局数组GameSpace[22][12]表示。
表示的时候:GameSpace[x][y]为1时表示游戏板上(x,y)这个位置上已经有方块占着了,GameSpace[x][y]为0表示游戏板上这位置还空着。
俄罗斯方块单人版1、需求分析俄罗斯方块,或称积木游戏,它是利用一些形状各异却又是用正方形组成的方块,经过不同位置不同角度的变化之后,堆积在一起的一种智力游戏。
2、概要设计而从编程的角度讲,只需要提供各种方块的图形,提供几个键盘操作键以供方块的形状和位置的变化,提供几个功能函数以供游戏的正常进行。
各种方块图形:利用数组定形,然后利用随机函数随机地不按顺序地按游戏的需要而出现。
功能函数将在变量函数里面介绍。
3、详细设计添加位图:封面:IDB_BITMAP1背景:IDB_BITMAP2方块:IDB_BITMAP4添加菜单:开始:ID_MENU_START接着就是定义变量了,但是,由于这个游戏要添加的变量和函数太多了,要建一个新类。
是否应该先添加应该类呢?最好是这样。
因为新类将会涉及到变量。
添加普通类Crussia,见下图。
图4-1-1添加变量函数:由于两个类一共有很多变量函数,列举如下:View.h :Public://俄罗斯类CRussia russia;//开始标志bool start;//封面CBitmap fenmian;//暂停BOOL m_bPause;//开始菜单afx_msg void OnMenuStart();//计时器afx_msg void OnTimer(UINT nIDEvent);//键盘操作afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);// Russia.h:Public://游戏数组int Russia[100][100];// 当前图形int Now[4][4];//上一图形int Will[4][4];//变换后的图形int After[4][4];//当前图形的左上角位置CPoint NowPosition;//当前可能出现的图形形状数,int Count;//游戏结束bool end;//级别int m_Level;//速度int m_Speed;//分数int m_Score;//行列数int m_RowCount,m_ColCount;//方块CBitmap fangkuai;//背景CBitmap jiemian;//显示分数等内容void DrawScore(CDC*pDC);//消行void LineDelete();//方块移动void Move(int direction);//方块变化,即方向键上键操作bool Change(int a[][4],CPoint p,int b[][100]);//是否与原来方块接触,或与边界接触bool Meet(int a[][4],int direction,CPoint p);//显示下一个方块void DrawWill();//显示界面void DrawJiemian(CDC*pDC);//开始void Start();然后,就可以一步一步地实现游戏了。
函数依然是一个一个添加,如果有还没定义的函数,添加空函数。
以保证程序的条理性和可运行性。
设置窗口大小:BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){if( !CFrameWnd::PreCreateWindow(cs) )return FALSE;// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT cscs.cx=500;cs.cy=590;return TRUE;}构造函数:CMy4_1View::CMy4_1View(){// TODO: add construction code herefenmian.LoadBitmap(IDB_BITMAP1);start=false;m_bPause=false;}CRussia::CRussia(){jiemian.LoadBitmap(IDB_BITMAP2);fangkuai.LoadBitmap(IDB_BITMAP4);}画图函数:void CMy4_1View::OnDraw(CDC* pDC){CMy4_1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCDC Dc;if(Dc.CreateCompatibleDC(pDC)==FALSE)AfxMessageBox("Can't create DC");//没有开始,显示封面if( !start){Dc.SelectObject(fenmian);pDC->BitBlt(0,0,500,550,&Dc,0,0,SRCCOPY);}//显示背景elserussia.DrawJiemian(pDC);}开始时是设start为假,它就会在OnDraw()函数中画封面,而当开始游戏,start为真,那么,它干什么呢?画背景!其函数如下:界面函数:还是那个道理,当有一些客户区生效(被挡住或最小化)时,它必须重画,而如果游戏只是玩了一半,它必然在重画时必须把原先已经出现的方块、分数等也显示出来,怎么办?就必须在画封面的同时也画出它们。
当然,刚开始时它们是不会符合条件的。
void CRussia::DrawJiemian(CDC*pDC){CDC Dc;if(Dc.CreateCompatibleDC(pDC)==FALSE)AfxMessageBox("Can't create DC");//画背景Dc.SelectObject(jiemian);pDC->BitBlt(0,0,500,550,&Dc,0,0,SRCCOPY);//画分数,速度,难度DrawScore(pDC);//如果有方块,显示方块//游戏区for(int i=0;i<m_RowCount;i++)for(int j=0;j<m_ColCount;j++)if(Russia[i][j]==1){Dc.SelectObject(fangkuai);pDC->BitBlt(j*30,i*30,30,30,&Dc,0,0,SRCCOPY);}//预先图形方块for(int n=0;n<4;n++)for(int m=0;m<4;m++)if(Will[n][m]==1){Dc.SelectObject(fangkuai);pDC->BitBlt(365+m*30,240+n*30,30,30,&Dc,0,0,SRCCOPY);}}信息函数:其中还涉及另外一个函数DrawScore(pDC),它是画分数、速度、难度(本程序省略)的。
由于它的代码不是太少,另外用了一个函数,这样有利于理解。
void CRussia::DrawScore(CDC*pDC){int nOldDC=pDC->SaveDC();//设置字体CFont font;if(0==font.CreatePointFont(300,"Comic Sans MS")){AfxMessageBox("Can't Create Font");}pDC->SelectObject(&font);//设置字体颜色及其背景颜色CString str;pDC->SetTextColor(RGB(39,244,10));pDC->SetBkColor(RGB(255,255,0));//输出数字str.Format("%d",m_Level);if(m_Level>=0)pDC->TextOut(440,120,str);str.Format("%d",m_Speed);if(m_Speed>=0)pDC->TextOut(440,64,str);str.Format("%d",m_Score);if(m_Score>=0)pDC->TextOut(440,2,str);pDC->RestoreDC(nOldDC);}至此,可以看的都画完了。
程序一般都是会先处理图形界面,因为这样在编核心内容时能够让人有一个检查的机会。
菜单开始函数:现在,游戏总该开始了吧。
添加菜单开始函数:ID_MENU_START其函数如下:void CMy4_1View::OnMenuStart(){// TODO: Add your command handler code herestart=true;russia.Start();SetTimer(1,50*(11-russia.m_Speed ),NULL);}先把start赋值为true,再调用russia.Start()函数,让它对俄罗斯方块游戏的相应变量赋值,为了使游戏能够调整速度,设置一个可变的计数器。
那么,russia.Start()函数做了什么呢?开始函数:void CRussia::Start(){end=false;//运行结束标志m_Score=0; //初始分数m_Speed=0; //初始速度m_Level=1; //初始难度m_RowCount=18; //行数m_ColCount=12; //列数Count=7; //方块种类//清空背景数组for(int i=0;i<m_RowCount;i++)for(int j=0;j<m_ColCount;j++){Russia[i][j]=0;}//清空方块数组Now[ ][ ] Will[ ][ ]for(i=0;i<4;i++)for(int j=0;j<4;j++){Now[i][j]=0;Will[i][j]=0;}//先画Will[][]DrawWill();//再画Now[][]&Will[][]DrawWill();}预备方块:DrawWill()的作用是,把预备方块给当前方块,再生成一个预备方块。
由于开始时预备方块自己都没有,它根本就不能拿一个方块给当前数组,它只能自己生成一个,这也是什么连续调用两次的原因。
void CRussia::DrawWill(){int i,j;int k=4,l=4;//把将要出现的方块给当前数组,并把将要出现数组赋值为零for(i=0;i<4;i++)for(j=0;j<4;j++){Now[i][j]=Will[i][j];Will[i][j]=0;}//初始化随即数种子//其中是什么意思?不知道的话,不如按一下F1。