2022年c语言俄罗斯方块游戏程序设计报告 .pdf
《2022年c语言俄罗斯方块游戏程序设计报告 .pdf》由会员分享,可在线阅读,更多相关《2022年c语言俄罗斯方块游戏程序设计报告 .pdf(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊C语言课程设计报告主标题:C 语言课程设计副标题:俄罗斯方块游戏 -界面设计姓名:卢文俊指导教师:刘慧院系:信息工程学院专业:计算机科学与技术班级:11 计本(二)班小组成员:卢文俊,齐伟,陈龙提交日期:2012-6-7 名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊俄罗斯方块程序设计报告一、问题描述:要求支持键盘操作和7 种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难
2、度越大,即方块的下落速度越快,相应的等级,等级越高,消去一行所得到的分数越高,为玩家提供了不同的选择。二、功能分析:俄罗斯方块游戏需要解决的问题包括:按任意键开始游戏,随机产生方块并自动下移用 Esc键退出游戏。用键变换方块用键和键左右移动方块用键使方块加速下移用空格键使方块直接下移能正确判断满行并消行、计分、定级别能正确计时设定游戏为不同级别,级别越高难度越大重点:*游戏面包的数据结构:二维数组*7 种形状方块的数据结构:结构体保存每种形状方块的坐标、颜色三、程序设计:1、程序总体设计结构:首先初始化进入图形模式,进入欢迎界面,玩家按名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,
3、共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊任意进入主菜单界面,按键进入游戏界面,键然后设置新的时钟中断。开始游戏后,进入该程序最核心的部分处理和实现进行过程中的各种事件和函数。在处理中判断游戏是否结束,如果没有结束,则重新开始游戏,否则结束游戏。详解如下:(1)、游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在19 种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。(2)、游戏方块控制功能。通过各种条件的判断,实现对游戏
4、方块的左移、右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。俄罗斯方块游戏初始化图形模式(欢迎界面)进入菜单选项开始新游戏游戏帮助游戏说明退出游戏游戏排名名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊否是游戏执行主流程图(3)、游戏显示更新功能。在判断键值时,有左移VK_LEFT、右移VK_RIGHT、下移 VK_DOWN、变形旋转 VK_UP、退出 VK_ESC 键值的判断。当游戏方块左右移动、下落、旋转时,要清除先前的游戏方块,用新坐标重绘游戏是否结束恢复原有的时钟中断关闭图形模式返回
5、菜单开始游戏游戏方块控制功能游戏方块预览功能游戏显示更新功能游戏速度分数更新功能游戏结束退出功能名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊游戏方块。当消除满行时,要重绘游戏底板的当前状态。(4)、游戏速度分数更新功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。比如,消除一行加10 分。当游戏分数达到一定数量之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。(5)、游戏帮助功能。玩家进入游戏后,将有对本游戏如何操作的友情提示。主
6、函数:void main()InitializeGraph();SetTimer(newtimer);/*设置新的时钟中断*/while(1)StartGame();ProcessInGame();if(GameOver()break;bOver=FALSE;KillTimer();closegraph();2、界面设计分为左右两个部分:*左边为游戏面板名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊*右边有三部分:下一个形状提示框、速度框和计分框3、重要数据的数据结构设计1)定义方块形状:定义如下的
7、结构体来表示每一个形状:struct blockint arrXY8;int nColor;int nNext;/*保存某一形状信息的结构体*/Struct SHAPE shapesMAX_BOX=口口口口口口口口口口口口口口口口0 x88,0 xc0,CYAN,1,0 xe8,0 x0,CYAN,2,0 xc4,0 x40,CYAN,3,0 x2e,0 x0,CYAN,0,口口口口口口口口口口口口口口口口0 x44,0 xc0,MAGENTA,5,名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊0
8、x8e,0 x0,MAGENTA,6,0 xc8,0 x80,MAGENTA,7,0 xe2,0 x0,MAGENTA,4,口口口口口口口口0 x8c,0 x40,YELLOW,9,0 x6c,0 x0,YELLOW,8,口口口口口口口口0 x4c,0 x80,BROWN,11,0 xc6,0 x0,BROWN,10,口口口口口口口口口口口口口口口口0 x4e,0 x0,WHITE,13,0 x8c,0 x80,WHITE,14,0 xe4,0 x0,WHITE,15,0 x4c,0 x40,WHITE,12,口口名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 33 页 -俄罗斯
9、方块程序设计报告2019-12-1511 计本(2)班 卢文俊口口口口口口0 x88,0 x88,RED,17,0 xf0,0 x0,RED,16,口口口口0 xcc,0 x0,BLUE,18),2)、定义游戏的主界面:宽10、高 20的游戏板1、数据结构:全局数组Gameboard1222,1 表示已有的方块,0 表示这个位置空着。在 10*20 基础上各自加 2 行、2 列为了便于判断形状在移动时是否到边、到底。整个屏幕的坐标系原先为640*480。在此游戏中,将16个像素定义为一个方格的边长,所以坐标系转变成为了40*30(640/16=40,480/10=30)。2、玩家进行游戏时,需
10、要对游戏界面进行初始化工作。此代码被main()函数调用。主要进行的工作如下:(1)循环调用 line()函数绘制当前游戏板。(2)调用 nScore()函数显示初始的成绩,初始成绩为0。(3)调用 npeed()函数显示初始的速度(等级),初始速度 1。*注:x,y 为左上角坐标*m,n 对应于 Vertical_boxs,Horizontal_boxs*分别表示纵横方向上方块的个数(以方块为单位)*BOARD_LEFT_X,BOARD_LEFT_Y*名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊
11、4、函数设计1、本程序有主函数和个函数组成:本程序总共由24个函数组成。2、函数相互作用关系见下图、初始化模式进入欢迎界win()主菜单menu()初始化图形模式InitializeGraph()游戏介绍 help()设置新的时钟中断SetTimer(*(void)Interrupt()(*IntProc)(void)处理在游戏中的各种事件ProcessInGame()开始游戏StartGame()InitializeGameboard()HandleLeft(int,int*x,int*y)HandleRight(int,int*x,int*y)HandleUp(int*,int*x,int
12、*y)HandleDown(int,int*x,int*y)IsConflict(int,int,int)DrawBlock(int,int,int,int)KillLine(int)IsGameOver()DrawSquare(int,int)IsLineFull(int)KillLine(int)名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊否是游戏是否结束GameOver()恢复原来的时钟中断KillTimer()返回到主菜单menu()退出程序关闭图形模型名师资料总结-精品资料欢迎下载-名师
13、精心整理-第 10 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊4、函数功能的描述:5、函数原型函数功能函数处理描述void interrupt newtimer(void)新的时钟中断处理函数调用(*oldtimer)()函数语句柄,计时器自动加 1 void SetTimer(void interrupt(*IntProc)(void)指向原来时钟中断处理过程入口的中断处理函数(句柄)void KillTimer()恢复原有的时钟中断处理过程调用 setvect()恢复原有的时钟中断处理过程void InitializeGraph()初始化图形模
14、式1、调用 initgraph()切换到图形模式 2、初始化若发生错误,则返回错误密码void InitializeGameboard()初始化游戏面板以及下一形状提示框、计分框1、调用 bar()rectangle()等库函数绘图函数绘制游戏界面 2、调用名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊和难度框outtextxy()函数显示文字void DrawSquare(int x,int y)在坐标(x,y)处画方块调用库函数 bar()绘制方块void DrawBlock(int Bloc
15、kIndex,int sx,int sy,int color)在坐标(sx,sy)处绘制颜色为color 的形状调用 DrawSqueare()函数绘制形状int IsConflict(int BlockIndex,int x,int y)判断形状是否存在于坐标(x,y)处无冲突返回 0,有冲突返回 1void HandleLeft(int BlockIndex,int*x,int*y)按下左方向键时的处理函数调用 IsConflic()函数判断形状是否可以左移,void HandleRight(int BlockIndex,int*x,int*y)按下右方向键时的处理函数调用 IsConfl
16、ic()函数判断形状是否可以右移,void HandleUp(int*BlockIndex,int*x,int*y)按下上方向键(旋转键)时的处理函数调用 IsConflic()函数判断形状是否可以旋转,名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊int HandleDown(int BlockIndex,int*x,int*y)按下向下方向键或者自由下落时的处理函数形状在自由下落返回 0,无法下落了返回 1,并做相应处理int IsLineFull(int y)判断 y 行是否已被填满填满返回
17、 1,否则返回 0void KillLine(int y)消去第 y 行函数用于处理删除一满行的情况。Y指明具体哪一行为满行,并将消去的行置为背景色int KillLines(int y)消去第 y 行以及与第 y行连续的上面被填满的行返回消去的行数int IsGameOver()判断游戏是否结束游戏结束返回 1,否则返回 0int GameOver()在界面上输出游戏结束的信息,并根据用户按退出游戏返回 1,否则返回 0名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊键选择决定是否退出游戏void
18、 StartGame()游戏开始时调用的函数1、绘制界面需要调用函数InitializeGameboard()2、接下来初始化游戏面板的各个方块和一些全局变量的初值。void ProcessInGame()核心函数,主要用于处理在游戏中的各种事件(如按下各种按键)调用HandleUpO、HandleDown()、HandleLeft()、HandleRight()等事件处理函数Void main()主流程函数主函数入口,整个游戏的主控部分五、运行效果名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊六
19、、源代码详解名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊#include#include#include#include/*系统提供的头文件*/#define TIMER 0 x1c/*定义时钟中断的中断号*/#define VK_LEFT 0 x4b00/*左移键*/#define VK_RIGHT 0 x4d00/*右移键*/#define VK_DOWN 0 x5000/*加速键*/#define VK_UP 0 x4800/*变形键*/#define VK_SPACE 0 x3920/*
20、变形键*/#define VK_END 0 x4f00/*暂停键*/#define VK_ESC 0 x011b#define VK_ENTER 0 x1c0d#define BSIZE 16/*方块的边长是 16 个象素*/#define MAX_SHAPE 19/*总共有 19 种各形态的方块*/#define BOARD_WIDTH 10/*游戏面板的宽度,以方块的宽度为单位*/#define BOARD_HEIGHT 20/*游戏面板的高度,以方块的宽度为单位*/#define BGCOLOR BLACK/*背景色*/#define FORECOLOR WHITE/*前景色*/#def
21、ine FALSE 0#define TRUE 1#define EMPTY 0#define FILLED 1#define BOARD_LEFT_X 10/*游戏面板左上角的横坐标*/#define BOARD_LEFT_Y 5/*游戏面板左上角的纵坐标*/*定义全局变量*/extern int GameboardBOARD_WIDTH+2BOARD_HEIGHT+2;extern int nCurrent_block_index ;/*当前下落的方块的索引号*/extern int nNext_block_index;/*下一个方块的索引号*/extern int nSpeed,nSco
22、re;/*速度和得分*/extern int nSpeedUpScore;/*第一次要加速需达到的分数*/extern int bAccel,bOver;extern int nOriginX,nOriginY;/*某一形状的原点的绝对坐标*/extern unsigned int TimerCounter;/*计时变量,每秒钟增加18*/名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2)班 卢文俊struct blockint arrXY8;int nColor;int nNext;/*保存某一形状信息的结构
23、体*/typedef struct block BLOCK;extern BLOCK arrayBlock19;void interrupt newtimer(void);/*新的时钟中断处理函数*/void SetTimer(void interrupt(*IntProc)(void);/*设置新的时钟中断处理过程*/void KillTimer();/*恢复原有的时钟中断处理过程*/void InitializeGraph();/*初始化图形模式*/void InitializeGameboard();/*初始化游戏面板*/void DrawSquare(int x,int y);/*在坐
24、标(x,y)处画方块*/void DrawBlock(int BlockIndex,int sx,int sy,int color);/*在(sx,sy)处绘制颜色为color 的形状*/int IsConflict(int BlockIndex,int x,int y);/*判断形状能否存在于坐标(x,y)处*/void HandleLeft(int BlockIndex,int*x,int*y);/*左键处理函数*/void HandleRight(int BlockIndex,int*x,int*y);/*右键处理函数*/void HandleUp(int*BlockIndex,int*
25、x,int*y);/*上键处理函数*/int HandleDown(int BlockIndex,int*x,int*y);/*下键处理函数*/int IsLineFull(int y);/*判断 y 行是否填满*/void KillLine(int y);/*消去 y 行*/int KillLines(int y);/*消去 y 行及上面被填满的行*/int IsGameOver();/*结束游戏*/int GameOver();/*用户自己决定是否结束游戏*/名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 33 页 -俄罗斯方块程序设计报告2019-12-1511 计本(2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年c语言俄罗斯方块游戏程序设计报告 2022 语言 俄罗斯方块 游戏 程序设计 报告
限制150内