第12章 综合项目—俄罗斯方块_ 教学PPT_190904ppt课件.pptx

上传人:春哥&#****71; 文档编号:16977439 上传时间:2022-05-20 格式:PPTX 页数:82 大小:5.41MB
返回 下载 相关 举报
第12章 综合项目—俄罗斯方块_ 教学PPT_190904ppt课件.pptx_第1页
第1页 / 共82页
第12章 综合项目—俄罗斯方块_ 教学PPT_190904ppt课件.pptx_第2页
第2页 / 共82页
点击查看更多>>
资源描述

《第12章 综合项目—俄罗斯方块_ 教学PPT_190904ppt课件.pptx》由会员分享,可在线阅读,更多相关《第12章 综合项目—俄罗斯方块_ 教学PPT_190904ppt课件.pptx(82页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第12章 综合项目俄罗斯方块_ 教学PPT_190904 第第12章章 综合项目综合项目俄罗斯方块俄罗斯方块 项目分析 项目实现 程序调试 项目心得 12.1.1 项目需求分析俄罗斯方块是一款经典的游戏,在游戏过程中可通过不同的方向键控制俄罗斯方块使其变形、移动、加速下落等。当不同形状的俄罗斯方块堆满一行就将该行消除,获得分数。如果俄罗斯方块垂直堆满游戏屏幕,则游戏结束。 12.1.1 项目需求分析本教材在实现俄罗斯方块时,需要实现以下需求:(1)游戏开始时,显示上次游戏得分,在此基础上按任意键开始游戏。(2)在玩游戏时,俄罗斯方块有7种基础形状,如下图。 12.1.1 项目需求分析(3)在玩

2、游戏时,使用左右方向键控制俄罗斯方块的移动,使用下方向键加速俄罗斯方块下落,使用上方向键控制俄罗斯方块旋转,使用空格键控制游戏暂停与继续,使用【Esc】键退出游戏。(4)绘制游戏场景,玩游戏时,俄罗斯方块显示在右侧,左侧显示游戏说明,游戏说明包括俄罗斯方块预览、按键说明、游戏得分等 12.1.1 项目需求分析 12.1.1 项目需求分析(4)玩游戏时,俄罗斯方块堆满一行就消除该行,消除一行可得100分。(5)游戏过程中,如果俄罗斯方块垂直堆满屏幕,则结束本次游戏,并根据用户输入(y或n)决定是否重新开始游戏。(6)游戏结束时,将游戏得分存储到文件中,以供实时查询。 12.1.1 项目需求分析

3、12.1.1 项目需求分析本项目可划分为4个功能模块:窗口构建模块、俄罗斯方块生成模块、游戏规则制定模块、分数保存查看模块。 12.1.1 项目需求分析 12.1.1 项目需求分析1、窗口构建模块在窗口构建模块中,调用Windows API中定义的结构体和函数构建坐标体系,在坐标体系中移动光标、隐藏光标。同时,在坐标系中绘制游戏场景,设置游戏边界,划分游戏区域与游戏说明区域。 12.1.1 项目需求分析2、俄罗斯方块生成模块俄罗斯方块生成模块主要功能包括在指定的位置输出方块或空格、构画俄罗斯方块7种形状及21种旋转状态,随机生成俄罗斯方块。 12.1.1 项目需求分析3、游戏规则制定模块游戏规

4、则制定模块定义了程序需要的宏、变量与数据类型。同时,该模块还制定了游戏规则,在俄罗斯方块下落过程中进行碰撞检测,如果俄罗斯方块堆满一行就消行积分。如果俄罗斯方块堆积到顶部就结束本次游戏,根据用户输入(y或n)决定是否重新开始游戏。同时,在游戏执行过程中,程序可接受键盘输入,通过判断输入的按键执行不同的操作,如左移、右移、游戏暂停等。 12.1.1 项目需求分析4、分数保存查看模块分数保存查看模块功能主要是将游戏得分保存到外部文件中,以供实时查询。 12.1.2 项目设计数据设计项目设计 12.1.2 项目设计(1)窗口构建模块窗口构建模块主要是调用Windows API构建坐标体系,实现光标的

5、移动与隐藏,并且在坐标体系中搭建游戏场景。在坐标系中划分游戏场景,需要定义两个宏标识坐标系的水平方向游戏范围与垂直方向游戏范围。#define COORD_X 30/定义水平方向的游戏范围#define COORD_Y 29/定义垂直方向的游戏范围 12.1.2 项目设计(2)俄罗斯方块生成模块一个俄罗斯方块由4个小方块组成,这四个小方块用一个44矩阵(二维数组)存储。俄罗斯方块的基础形状有7种,可以使用一个大小为7的一维数组存储这个7个基础俄罗斯方块,即一维数组中每个元素是一个二维数组。但是,每个俄罗斯方块有3个旋转方向,即有3个变形状态,一维数组无法满足其旋转要求,因此可以使用一个74的二

6、维数组存储俄罗斯方块。 12.1.2 项目设计74矩阵,存储7种开头的俄罗斯方块及其旋转状态。 12.1.2 项目设计typedef struct Tetris/定义struct Tetris结构体类型int diamonds44;/diamonds二维数组,4*4矩阵TETRIS;TETRIS tetris74;/74结构体二维数组 12.1.2 项目设计定义一个二维数组blockages,该数组要足够大,覆盖整个游戏区域。根据坐标,将空格、墙壁、小方块存储到blockages二维数组中。用于计算俄罗斯方块是否堆满一行,并根据blockages数组元素状态,完成旋转、碰撞检测等。int bl

7、ockagesCOORD_YCOORD_X + 10; 12.1.2 项目设计 12.1.2 项目设计由于blockages二维数组存储了空格、小方块、墙壁,因此需要定义空格、小方块、墙壁的宏定义。#define WALL 2/墙壁#define BLOCK 1/小方块#define BLANK 0/空格 12.1.2 项目设计(3)游戏规则制定模块游戏规则制定模块主要制定游戏规则,如开始游戏、碰撞检测、消行积分、结束游戏等。游戏过程中需要通过各种按键完成游戏状态的切换,因此需要定义宏表示按键。#define SPACE 32 /空格键#define UP 72 /上方向键#define LE

8、FT 75 /左方向键#define RIGHT 77 /右方向键#define DOWN 80 /下方向键#define ESC 27 /退出键 12.1.2 项目设计除此之外,游戏规则制定模块还需要定义一些变量,如分数、随机数等,该模块定义的变量如下所示:int score = 0;/游戏分数int ranNum = 0;/随机数int pause = 0;/pause变量控制游戏状态,0为执行游戏,1为暂停游戏 12.1.2 项目设计(4)分数保存查看模块分数保存查看模块只是在游戏结束时将分数保存到外部文件中,当下次执行程序时,程序会读取文件显示上次游戏得分。该模块需要引用游戏模块中定义

9、的score变量,使用extern关键字引入该变量即可。 12.1.2 项目设计(1)窗口构建模块窗口构建模块需要实现的功能是在构建的坐标系中移动光标、隐藏光标,并且绘制游戏场景。该模块需要实现的功能函数如下表。函数声明功能描述void movePos(int x, int y);移动光标,并隐藏光标void drawScene();绘制游戏场景 12.1.2 项目设计(2)俄罗斯方块生成模块俄罗斯方块生成模块主要是在指定位置输出小方块或空格,随机生成俄罗斯方块,该模块要实现的功能函数如下表。函数声明功能描述void generateTetris();生成俄罗斯方块void printBloc

10、k(int base, int roCon, int x, int y);输出小方块void printBlank(int base, int roCon, int x, int y);输出空格 12.1.2 项目设计(3)游戏规则制定模块游戏规则制定模块完成游戏规则的制定,包括开始游戏方式、碰撞检测规则、消行积分规则、退出游戏方式等。该模块要实现的功能函数如下表。函数声明功能描述void startGame();开始游戏bool collision(int n, int rotate, int x, int y);碰撞检测int eliminate();消行积分void gameOver()

11、;结束游戏 12.1.2 项目设计(4)分数保存查看模块分数保存查看模块要实现的功能为保存游戏得分到外部文件,供下次游戏开始时查询使用。该模块要实现的功能函数如下表。函数声明功能描述void lastScore();读取文件,显示上一次游戏得分void saveInfo();将游戏得分保存到外部文件 12.2.1 窗口构建模块的实现窗口构建模块主要是通过Windows API中定义的控制台坐标系建立游戏窗口,获取移动坐标点的值并隐藏控制台中的光标。该模块主要实现两个函数:movePos()函数和drawScene()函数。 12.2.1 窗口构建模块的实现(1)movePos()函数moveP

12、os()函数的作用是将光标移动到指定坐标处,并隐藏光标。(2)drawScene()函数drawScene()函数的功能是绘制游戏场景 12.2.2 俄罗斯方块生成模块的实现俄罗斯方块生成模块主要是在指定的位置输出方块或空格、构画俄罗斯方块7种形状及21种旋转状态,随机生成俄罗斯方块。该模块主要实现三个函数:generateTetris()函数、printBlank()和printBlock()函数。 12.2.2 俄罗斯方块生成模块的实现generateTetris():随机生成俄罗斯方块。构画俄罗斯方块的7个基础形状及21个变形状态。printfBlank():功能是在指定位置输出空格。p

13、rintfBlock():功能是在指定位置输出小方块。 12.2.3 游戏规则制定模块的实现游戏规则制定模块主要是制定游戏规则,如碰撞检测、消行积分、俄罗斯方块的移动、游戏暂停继续等。该模块需要实现4个函数:startGame()函数、collision()函数、eliminate()函数和eliminate()函数。 12.2.3 游戏规则制定模块的实现startGame():用于启动游戏。collision():功能是完成碰撞检测。该函数通过for循环嵌套遍历tetrisnrotate.diamonds数组,如果该数组tetrisnrotate.diamondsij位置存储了小方块,并且b

14、lockagesx+iy+j位置存储了墙壁或小方块,则表示俄罗斯方块与其他物体(墙壁或小方块)发生了碰撞,返回1;如果for循环嵌套结束,函数调用还未返回,表示没有碰撞,返回0。 12.2.3 游戏规则制定模块的实现eliminate():用于消行积分,该函数主要是将blockages二维数组的每行元素值相加,判断其结果是否达到19(左右两边墙壁水平坐标差值),以此确定该行是否是完整一行小方块,如果是完整一行小方块,则消除该行,得分100。gameOver():功能是结束本次游戏。 12.2.4 分数保存查看模块的实现分数保存查看模块的功能主要是将游戏得分保存到外部文件,当游戏开始时,会读取文

15、件显示上次游戏得分。该模块需要实现两个函数:lastScore()函数和recordScore ()函数。 12.2.5 main()函数实现前面已经完成了俄罗斯方块项目中所有功能模块的编写,但是功能模块是无法独立运行的,需要一个程序去将这些功能模块按照项目的逻辑思路整合起来,这样才能完成一个完整的项目。此时就需要创建一个main.c文件来整合这些代码,main.c文件中包含main()函数,是程序的入口。main()函数 12.3 效果显示1、场景1:显示上次游戏得分程序开始运行时,首先会进入场景1:显示上次游戏得分与开始游戏提示信息。 12.3 效果显示2、场景2:游戏场景当用户在图12-

16、7所示的场景1中单击【Enter】键时,进入场景2,游戏开始。游戏开始时,左侧是游戏说明,右侧是俄罗斯方块移动范围,随机生成的俄罗斯方块在(0,19)坐标处,得分初始为0。 12.3 效果显示3、游戏进行界面游戏进行过程中,用户可以通过左右方向键控制俄罗斯方块向左、向右移动,通过下方向键加快俄罗斯方块速度,通过上方向键使俄罗斯方块旋转,通过空格键使游戏暂停/继续。当俄罗斯方块堆满一行则消行积分,游戏得分会实时显示在窗口中。 12.3 效果显示4、游戏失败俄罗斯方块没有完成消行积分,堆积到顶部时,游戏失败,进入场景3:提示用户输入n/N或y/Y,退出游戏或继续游戏。 12.3 效果显示游戏失败,

17、界面会稍微停留之后就会进入场景3:提示用户输入y/n。 12.3 效果显示4、退出游戏在游戏结束界面,如果用户输入n或N,则游戏退出。 12.3 效果显示另一种游戏退出方式为用户按下【ESC】键,按下【ESC】键,游戏退出。 12.4 程序调试在程序开发过程中难免会出现各种各样的错误。为了快速发现和解决程序中的这些错误,可以使用Visual Studio2019自带的调试功能,通过程序调试快速定位错误。 12.4.1 设置断点1、单击鼠标右键在程序中,将鼠标放置在要插入断点的行,单击鼠标右键【断点】【插入断点】。 12.4.1 设置断点在上图中,单击插入断点选项后,选中的代码行左边会有一个彩色

18、的圆点。 12.4.1 设置断点调试完毕要删除断点也是非常简单的,将鼠标放置在断点代码行,单击鼠标右键【删除断点】。 12.4.1 设置断点2、单击鼠标左键除了上述方式,读者还可以在代码左边的灰色区域单击鼠标左键插入断点,断点插入成功后左侧会也有彩色圆点出现。同样,删除断点时,只需再次左键单击代码左侧已插入的彩色圆点,便可删除断点。相比于上一种断点插入方式,这种方式更简单便捷。 12.4.2 单步调试当程序出现Bug时,为了找出错误的原因,通常会采用一步一步跟踪程序执行流程的方式,这种调试方式称为单步调试。单步调试分为逐语句(快捷键【F11】)和逐过程(快捷键【F10】),逐语句调试会进入方法

19、内部调试,单步执行方法体的每条语句,逐过程调试不会进入方法体内部,而是把方法当作一步来执行。 1、逐语句调试设置断点之后,单击工具栏中的运行按钮 ,程序运行之后,遇到断点就会停止执行。12.4.2 单步调试 调试启动后,当遇到断点时,程序会停止执行,等待用户进行操作。程序开始调试时,Visual Studio2019工具栏按钮会发生变化12.4.2 单步调试 继续执行:该按钮可以跳过调试语句,继续执行程序。 停止调试:该按钮用于停止调试程序,快捷键Shift+F5。 重新启动:该按钮用于重新启动程序调试,快捷键Ctrl+Shift+F5。 显示下一条语句:该按钮用于显示下一条执行的语句,快捷键

20、Alt+数字键*。 逐语句:该按钮可以让程序按照逐语句进行调试,快捷键F11。 逐过程:该按钮可以让程序按照逐过程进行调试,快捷键F10。 跳出:该按钮用于跳出正在执行的程序,快捷键Shift+F11。12.4.2 单步调试 如果在调试时想逐语句调试,则按快捷键【F11】或单击工具栏中的逐语句调试按钮,程序会进入drawSecen()函数内部一条一条执行语句。12.4.2 单步调试 在上图中继续按快捷键【F11】或单击工具栏中的逐语句调试按钮,程序就会逐条语句往下执行,当执行完drawSecen()函数就会接着进入generateTetris()函数执行。12.4.2 单步调试 2、逐过程调试

21、逐过程调试在每次调试时执行一个函数,当调试开始时,按快捷键【F10】或单击工具栏中的逐过程调试按钮,可以一次执行一个函数。连续按快捷键【F10】或单击工具栏中的逐过程调试按钮,程序会逐个函数的往下执行,直到程序执行完毕。12.4.2 单步调试 调试程序一般是为了查找错误,当查找完错误之后就会结束调试,并不会全程调试。如果查找完错误之前,想要结束调试,可单击工具栏中的运行按钮继续往下执行程序,也可以单击工具栏中的停止调试按钮结束程序执行。12.4.2 单步调试 1、鼠标悬停法Visual Studio2019可以通过鼠标悬停的方式查看变量的值,即鼠标指向变量,变量就会显示出其值。例如,在main

22、.c文件中的startGame()函数处设置断点,执行程序,程序遇到断点暂停执行,按【F11】逐语句调试程序,程序进入startGame()函数逐步执行。12.4.3 观察变量 12.4.3 观察变量 12.4.3 观察变量程序还未执行第14行代码:int n = 0,此时,变量n的值为一个未知的垃圾数据,可通过鼠标悬停的方式进行查看,将鼠标悬停在变量n上面,Visual Studio2019会显示出n的值。 12.4.3 观察变量继续逐语句往下执行,当执行过第14行代码时,n的值就会变成0。 12.4.3 观察变量2、使用局部变量窗口查看变量的值除了鼠标悬停之外,还可以通过Visual St

23、udio2019下面的局部变量窗口查看变量的值,在菜单栏中选择【调试】【窗口】【局部变量】打开局部变量窗口查看变量的值,在该窗口中可以看到当前运行代码之前所有变量的名称、当前值和类型。 12.4.3 观察变量 12.4.3 观察变量3、使用快速监视窗口查看变量的值程序调试过程中,在代码区单击鼠标右键选择【快速监视】,弹出快速监视窗口,在该窗口的表达式文本框中输入要监视的变量,单击【重新计算】按钮,就可以查看变量的名称、值与数据类型。 12.4.3 观察变量 12.4.3 观察变量4、使用即时窗口查看变量的值在代码调试的过程中,在菜单栏选择【调试】【窗口】【即时】打开即时窗口,在即时窗口中直接输

24、入程序中的变量名,按回车即可查看变量的值,也可以在变量名前加上“&”(取地址符),查看变量的地址。 12.4.3 观察变量 12.4.4 项目调试在俄罗斯方块游戏中,在场景1(显示游戏上次得分,开始游戏界面)中按【Enter】键开始游戏,但在游戏中发现,该界面除了接受【Enter】键开始游戏之外,还接受其他任何按键。 12.4.4 项目调试界面由main.c文件的第1013行代码实现。表明第1013行代码对场景1界面实现有误或后续代码对场景1的处理不够严谨,需要对第1013行代码及其后续代码进行调试。 12.4.4 项目调试在main.c文件中第10行代码设置断点。 12.4.4 项目调试设置

25、断点之后开始调试,通过逐语句调试跟踪每一步操作。当程序运行至第14行代码时,发现程序调用getchar()函数对键盘输入进行处理,getchar()可以接受任意字符输入,当按下【Enter】键时,系统会把输入内容刷新到标准输出,表示输入结束,程序会继续后面的代码,开始游戏。因此,在此处调用getchar()函数处理场景1的按键输入不合理。 12.4.4 项目调试经过上面的调试和分析,已确定了程序中的bug所在,在修改时,可以调用_getch()函数处理场景1的键盘输入。_getch()函数接受键盘输入,但它会立即读取键盘的输入,不以【Enter】键作为结束标志,并且读取的字符不会显示在控制台。

26、需要注意的是,将getchar()函数修改为_getch()函数之后,可以按任意键开始游戏。 12.5 项目心得1、项目整体规划每一个项目,在实现之前都要进行分析设计,项目整体要实现哪些功能。将这些功能划分成不同的模块,如果模块较大还可以在内部划分成更小的功能模块。这样逐个实现每个模块,条理清晰。在实现各个模块后,需要将模块整合,使各个功能协调有序的进行。在进行模块划分和模块整合时,可以使用流程图表示模块之间的联系与运行流程。 12.5 项目心得2、坐标问题俄罗斯方块是在一个界定的窗口内进行,俄罗斯方块的出现的位置、俄罗斯方块的移动、各种提示信息的位置都是由坐标标识其位置,坐标计算由Windo

27、ws API窗口坐标函数实现。在计算坐标时要注意,在本项目中,坐标体系的原点为左上角,水平向右为y,垂直向下为x。 12.5 项目心得3、俄罗斯方块存储、移动与旋转俄罗斯方块项目中,每个俄罗斯方块由四个小方块组成,在设计项目时,小方块设计一个44矩阵存储,俄罗斯方块设计一个74矩阵存储,每一行存储一个俄罗斯方块,每一行中的4列存储该俄罗斯方块的4个变形。这相当于一个二维数组中的每个元素又是一个二维数组,即存储俄罗斯方块的tetris数组实际上是一个四维数组,读者在学习时要结合图示理解。 12.5 项目心得项目在设计时,定义了blockages二维数组,该二维数组覆盖了俄罗斯方块的游戏场景,俄罗

28、斯方块的移动可以对应到该数组中的行列,通过blockages数组元素值的改变标识俄罗斯方块的移动。读者要结合图示与代码仔细理解其中的转变过程。 12.5 项目心得俄罗斯方块在游戏中可以旋转,每个俄罗斯方块都有4个旋转方向,因此tetris数组的列索引为4。俄罗斯方块的旋转次数也标识着tetris数组的列索引取值,但是每个俄罗斯方块可以重复旋转多次,如果旋转次数超过4,超出tetris列索引取值,就会造成程序错误,因此旋转次数rotate取值时要通过(rotate+1)%4实现。 12.5 项目心得4、清屏俄罗斯方块是一个多场景游戏,每一次场景切换需要把上一个场景的内容清空,这就要涉及清屏,如果

29、不清屏,会造成多个场景的内容叠加。清屏可使用system(cls)语句实现,本项目就在多处使用该语句,场景切换处理的很好。 12.5 项目心得5、代码复用代码复用一直是软件设计追求的目标,本项目在实现时也想尽量做到这点,因此将每一个功能封装成一个函数,在main()函数中只调用相应函数就启动了游戏。此外,有些函数还可以重复调用,例如movePos()函数,在移动光标时多处调用该函数。 12.6 本章小结本章综合运用前面所讲的知识,设计了一个综合项目俄罗斯方块,使大家了解如何开发一个多模块多文件的C程序。在开发这个程序时,首先将一个项目拆分成若干个小的模块,然后分别设计每个模块,将每个模块的声明和定义分开,放置在头文件和源文件中,最后在一个main()函数的源文件中将它们的头文件包含进来,并利用main()函数将所有的模块联系起来。通过这个项目的学习,读者会对C程序开发流程有个整体的认识,这对实际工作中是大有裨益的。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁