admin 管理员组

文章数量: 887021


2024年3月1日发(作者:常量元素氯的主要生理功能)

c++编程俄罗斯方块计算机实习报告模板

姓名:

班级:

学号:

小班序号:

指导老师:

题目:用c++编程俄罗斯方块

邮箱:

用c++编程俄罗斯方块实验报告

一.功能说明

总体功能说明

我所设计的俄罗斯方块在实现俄罗斯方块基本功能的基础上,实现了一些基本的创新。

我们开发的俄罗斯方块游戏,主要实现了以下几种功能:

1.对初次玩的玩家进行新手指导。

2.可以灵活控制方块在图形框中运动。

3.游戏过程中方块可以自由旋转。

4.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。并且当连续消行时分数会有一定奖励。

5.可以提示下一个出现的方块

6.游戏前可以选游戏的等级,不同等级对应不同速度,1 / 10

不同等级消行后的加分不同,等级越高分数越高,方便不同水平的玩家游戏。

7.有记录最大分的功能,历史最高分记录在一个名为HighestPoint的txt文件中。

8.游戏结束后弹出对话框提醒结束游戏还是继续游戏。

9.初始化界面和游戏中有音乐,使游戏更吸引人

我的游戏的主要特色如下:

1、 不同的方块的颜色不同,使游戏的视觉效果更佳。

2、 分数上,不同的难度等级对应不同速度,速度越快,每消一行所加的分数越多。

3、 假如一次消多行,那么加分会比逐次消行更多。

4、 有提示下一个方块的功能,是游戏更加人性化。

5、 可以记录历史最高分。当创造最高分后论文联盟会有庆祝的画面。

6、 算法编程上,创建了一个数组

structsha

{intxy[8];

WORD*tcolor;

intnext;

};

用于记录方块的位臵、颜色、以及旋转后方块的编号。这种编程方法可以为后续方块运动的编程创造便利。

2 / 10

7、 此外,采用多文件结构,每个cpp文件存储一个功能,便于程序的修改和功能的扩展。

用户界面

1、初始化界面。主要完成的功能是进入游戏后的初始化和功能选择。

2、帮助界面。功能是方便初玩者尽快熟悉游戏操作。

3、难度选择界面。功能是选择游戏的难度。

4、游戏界面。功能是进行游戏

5、游戏结束时是否继续游戏的选择界面。功能:提示结束游戏还是继续游戏。

使用方法

按键控制:

在初始化界面上,”q”键进入新手指导界面,”z”键进入难度选择,esc退出游戏。

在难度选择界面,”w” ”s”键上下调整光标选择难度。Enter键确定所选的难度。

在游戏界面,'a'方块左移;'d'方块右移;'w'方块变形;'s'落到底部;空格键开始、暂停;ESC键退出游戏。

3 / 10

游戏结束时,按“y”继续游戏,按“n”结束游戏。

是否可划分难度: 可以。我设计的游戏难度分为三个等级:新手级、高手级和大师级。游戏难度逐次递增,游戏速度依次增大。

二.程序设计说明

总体设计框架

流程图:

程序执行流程和模块划分:

进入main函数后,执行initiate函数,产生初始化界面。然后进入if选择语句。根据按键的不同,程序作出不同的反应。

if按键为q,则执行reactq函数,按任意键后返回初始化界面;if按键为esc,则游戏结束;if按键为z,则

执行reactz函数,在该函数中进行难度选择。

选择难度后,再执行GameMap(),产论文联盟生游戏界面。游戏开始,根据时间随机数种子来随机生成方块,在move完成方块运动的实现。每完成一个方块的运动,进行判断是否可以消行,具体代码如下

该代码实现了从底部到顶部逐行遍历,当*line<0时表示所遍历区域超出地图,当然应该跳出循环。 此后进行判4 / 10

断是否游戏结束,若未结束,则接着返回执行move,继续下一个方块的运动,否则调用GameOver函数,弹出选择对话框进行选择,如果按“n”退出游戏,如果按“y”,则返回initiate。

模块划分:主要分为两部分。选择模块和游戏模块。选择模块由initiate(),reactq(),reactz()组成,完成的主要功能是游戏帮助和难度的选择;游戏模块由函数GameOver,move,clrline,GameOver组成,完成的主要的主要功能是方块的移动、旋转、消行和判断游戏是否结束。

关键算法描述

算法1:方块的存储。这是俄罗斯方块编程的基础,后续的运动和旋转的编写都要基于此。考虑到我要设计的俄罗斯方块每种形状的颜色不同,此外为了方便旋转,所以我设计了一个结构来存储方块的位臵,颜色,和旋转后方块的编号。在设计中我在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型。我选择一个小块为中心,这样其他方块只要用基于该中心的相对位臵表示即可。具体的实现如下:

算法2:方块的移动、旋转算法。该算法封装在一个名为move的函数中,输入参数为方块的编号ShapEindex,中心方块的坐标,记录难度的指针c,传递颜色的指针color,以5 / 10

及方块的逻辑位臵。算法的功能是方块的移动、旋转。考虑到方块的连续运动,使用了循环结构。该算法是整个工程的关键部分。用框图表示如下:

算法3:消行。消行分为isclrline()(来判断是否可以消行)和clrline()两个函数。isclrline:输入参数为记录遍历到哪行的指针line、方块的逻辑位臵FangKuai[][],返回参数是true或者false。算法功能是判断是否可以消行,显然当某一行全部堆满方块时,可以消行,而某一位臵有方块该位臵的逻辑值为1,这样伪代码如下:

if

{

*line=j; //记录下第几行可以消行

returntrue;

}

else

returnfalse;

clrline:输入的主要参数为方块的编号ShapeIndex,记录哪行可以消的指针line,记录分数的指针point,记录累计次数的变量sum。这里sum变量要着重说明,这个变量使一次消多行时,加分的阶梯度的实现成为现实。

从截图中可以看出,每可以消一行,sum自加1,这样,6 / 10

以新手级难度为例,当消第一行时,如截图分数加1,但是如果消第二行时,分数加2,以后依次递加,实现了加分的阶梯度。伪代码如下:

if难度是新手级 {按新手级难度加分};

if难度是高手级 {按高手级难度加分};

if难度是大师级 {按大师级难度加分};

消行;

上面的方块逐次下移;

:程序设计的难点和关键点

1、函数接口的统一。由于工程所包含的函数过多,所以接口统一上,工作较为琐碎,经常会出现少形参的情况,这样就需要我重新设臵形参。

2、运动的编程。 主要是旋转的编程。

我在程序开始时设臵了一个数组,其中的一个元素就是旋转后数组的编号,这样就为旋转一定程度上提供了便利。只要将现有的方块抹掉,将旋转后的编号代表的方块打印出来即可。由于旋转后的形状可能与既有的图形在位臵上相冲突,所以定义了一个累加变量,只要累加变量为0,代表旋转后的方块未被挡住,则可以旋转,否则不能旋转,方块的编号不变。

3、消行后上面方块整体下移。由于我设计的俄罗斯方块,每种形状颜色不一样,加起来一共有七种颜色。如何在7 / 10

上面的方块下移的过程中保证颜色不变是一个难点。编写过程也确实耗费了一定时间。后来,我设计了一个20*20的WORD*数组来存储每种颜色,在没有方块的位臵记为0,有方块的位臵记录为方块的颜色,在下移的过程中具体代码如截图

从下到上遍历,当某位臵有方块时,将方块清除并在下一行打印方块,由于设臵了存储颜色的数组,方块颜色的保持问题也迎刃而解。

调试的方法

过程中出现的问题主要分为因疏忽产生的失误和逻辑错误两部分。

针对因疏忽产生的错误,大部分是因为向函数内部传递的参数不足导致的编译错误和累计变量未赋初值两类,前者错误比较好解决,可以通过编译器的自动查错功能,找出错误,而后者的查错则相对困难些,我采用的方法是逐步调试,在某地方设臵断点,按F5后运行到断点处,然后按F11和F10逐步调试,观察variables里变量的值,从而发现其中的错误。

针对逻辑错误,这是比较容易犯的错误也是很难查的错误。因为这种错误在编译连接时并不会报错,但是在执行时会出现错误,比如方块运动超出边界,或者落的方块遇到已经存在的方块后还继续下落。这种错误的解决,我依然采用8 / 10

逐步调试的方法,但是由于我设计的程序中循环结构使用比较多,所以有时逐步调试步骤过多,很难找到错误。所幸我采用了多文件的结构,这样问题出在哪里我就心里比较有数了。比如落的方块遇到已经存在的方块后还继续下落这种情况,我便可以在这个文件里查找问题,减少了工作量。

程序性能评价

运行效果上,整体来看,所设计功能全部得到了实现,效果比较理想,尤其在界面和视觉效果上,做的可以说还是比较好的。但是也存在不足之处,如方块在边缘的位臵时,无法进行旋转。另外,原本设计的双人游戏由于时间原因,未能实现。

程序设计上,采用了多文件的结构,使查错、程序的修改和功能的扩展都相对比较方便,另外封装的函数较多,使主函数main看起来比较简洁,而封装的函数可以重复运用,也减少了代码的长度。采用了丰富的条件结构和循环结构,代码比较简约。此外,在关键处,均添加了注释,方便了自己和其他人对代码的检查。然而,也存在不足。在编程过程中,我就发现代码其实可以进一步更加优化,所以代码还存在冗杂的现象。另外,我没有采用类和对象的概念,没有很好体现c++的特色和在编程中的优点,这点我感觉比较遗憾。

三.心得体会

我这次实验做的是俄罗斯方块,大家可能会认为这个题9 / 10

目很简单,没什么难度,本来我也是这么想的;可是当真正着手做时,发现很多东西并不容易实现。比如:如何显示每一个俄罗斯小方块,如何预测下一个俄罗斯小方块,如何控制每一个方块的下落速度,如何判断俄罗斯方块是否可以停止,如何通过键盘控制俄罗斯方块的位臵和方向等。如果有一行或多行满行,如何删除这些行,并重新绘制游戏区界面,同时分数如何计算并显示等等,都要一一实现。感觉真是难上加难。

不过,是事情总会有解决办法,是问题总有突破口,于是我找来相关书籍仔细研究算法,最后终于一切明了于心。

当然,在这次课程设计中,也出现了许多错误或麻烦。主要有一些判断条件的制定。有些判断条件没有想全,当执行某些操作时就出现异常,比如:俄罗斯方块的停止条件的判断,如果判断条件不完整就会出现下落的方块遇到已经存在的方块后还继续下落。

通过这次课程设计,我对游戏编程有了初步认识,对游戏算法有了一定了解。从游戏的需求分析,系统设计,再到游戏代码实现每一步都对自己是一个挑战,虽然过程充满艰辛,但是从中我学到了很多课本上学不到的编程经验,也从中获得了很多快乐。

10 / 10


本文标签: 方块 游戏 功能 俄罗斯