小游戏c课程设计-自己做的作业.doc

上传人:恋****泡 文档编号:790181 上传时间:2019-07-12 格式:DOC 页数:21 大小:152.90KB
返回 下载 相关 举报
小游戏c课程设计-自己做的作业.doc_第1页
第1页 / 共21页
小游戏c课程设计-自己做的作业.doc_第2页
第2页 / 共21页
点击查看更多>>
资源描述

《小游戏c课程设计-自己做的作业.doc》由会员分享,可在线阅读,更多相关《小游戏c课程设计-自己做的作业.doc(21页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、 课程设计报告课程设计报告课程名称: 计算机技术基础 系 部: 电气工程系 专业班级: 通信 09103 班 学生姓名: 指导教师: 完成时间: 报告成绩: 评阅意见:评阅教师: 评阅时间:C 语言课程设计报告- 1 -目目 录录1.设计目的22.设计要求23.题目分析与设计24.总体设计35.流程图96.源程序清单107.调试过程、运行结果198.总结209.参考文献20- 2 -俄罗斯方块从语言课程设计一.设计的作用、目的设计的作用、目的加深对 C 语言课程所学知识的理解,进一步巩固 C 语言算法规则.学会编制结构清晰.风 格良好.数据结构适当的 C 程序,从而具备解决综合性问题的能力。复

2、习、巩固 C 语言的基础知识,进一步加深对 C 语言的理解和掌握; 课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际 有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的 能力;培养学生在项目开发中团队合作精神、创新意识及能力。通过程序设计,提高编程兴趣与编程水平.2、设计要求设计要求C 语言课程设计报告- 3 -1、 屏幕中央有一个矩形“容器” ,选择“开始”菜单或“开始”工具按钮后,俄罗斯方块 的部件随机产生并在容器中自由下落。 2、 游戏过程中,当在矩形“容器”中,出现一个游戏方块时,必须在游戏方块的预览区 域中出现下一方块,这样利

3、于游戏玩家控制游戏的策略。 3、 有七种标准俄罗斯方块部件,通过各种判断,实现游戏方块并随着键盘上的上键顺时 针旋转 90 度,随着下键加速下落,随着左、右各键分别左、右移动。 4、 当部件下落达“容器”底部或已停止的部件时,停止下落;当同一行部件完整拼接上 时,该行消失,其他行向下移动,在适当位置显示当前累计分数。 5、 当部件总行数超过矩形容器的高度或没有足够的空间产生新的部件时,提示“游戏结 束”信息并停止游戏运行。 6、 游戏计分原则:一次消去一行加 10 分,同时消去 2 行、3 行、4 行分别加 30 分、50 分、70 分。该游戏设置有 3 个级别,分别为 1简单、2普通、3较难

4、,难度越 大,方块下落的速度越快。 7、 游戏帮助功能:玩家进入游戏,可以通过菜单中的“帮助”菜单或工具栏上的“?”工 具按钮,获得游戏如何操作的友情提示。三三、题目分析与设计题目分析与设计 1.1.定义基本的定义基本的 7 7 种方块种方块( (含四种状态含四种状态) )二维数组变量二维数组变量. . Terial74. 用数组下标索引方块的种类和状态. 定义方块运行的区域(二维数组变量) 如(高 23,宽 10) 用它存储方块下落后的状态. 左移和右移判断是方块是否左右溢出、是否会叠在运行区的格子上。 同样改变状态(变形)也得判断是否会出现左右溢出、是否会叠在运行区格子上。 (1)由于 c

5、 的随机性函数不好,所以每次游戏开始根据 bios 时间设置种子。 (2)得分越高,方块下降速度越快(每 200 分为单位) 。 (3)每下落一个方块加 1 分,每消除一行加 10 分,两行加 30 分,三行加 70 分,四 行加 150 分。初试分数为 100 分。游戏控制:up-旋转;空格-下落到底; 左右下方向键-控制方向。P-开始或暂停游 戏。 ESC-退出。 (设计说明:设计该游戏,实现方块预览、方块控制、显示更新、游戏记分、游 戏等级、游戏帮助等功能。方块控制,直接由玩家通过键盘控制,游戏区域的方块 部件根据玩家具体键盘的操作左右移动、旋转、加速下落。游戏地图即矩形“容器” ,根据

6、具体数据,直接通过画笔画刷绘制。)2.2.主要的设计难点:主要的设计难点: 如何用内部数据结构表示当前部件的状态; 如何旋转方块、判断部件放置位置及使满行消失; 如何实现方快的预览功能;3.3.设计难点的解决方案:设计难点的解决方案:1、 所有的部件及已停止的部件均用小方格来表示。整个游戏区域对应一个二维数 组,数组元素为 0 时,表示空白;为 1 时,表示已有方格。该数组存储所有已 经不能移动的部件。部件采用一维数组表示,这些一维数组实际表是一个 nn 的矩阵。如表示一个方块使用一个 22 的矩阵,实际存储1,1,1,1;如 表示一个长条使用一个 44 的矩阵,实际存储0,1,0,0,0,1

7、,0,0,0 ,1,0,0,0,1,0,0。- 4 -2、 实际显示的时候,先画出已停止的方块,然后计算出正在下落的部件的正确坐 标位置并其将画出,同时在固定位置画出预览方块。 3、 旋转部件时,只需变换存储部件的矩阵即矩阵的转置,使其对应为转换后的形 态,并将其显示出即可。 4、 判断部件是否可以下落、旋转、左移、右移时,将表示部件的数组对应到游戏 区域的二维数组中,再判断是否允许操作。当部件无法再操作时,将部件数组 中对应填入游戏区域中对应的二维数组。5.使一层消失可以通过判断游戏区域中的二维数组是否某一行全为 1;如果该数组 的第一行全为 1 或已没有足够的空白使新的部件可以加入到游戏区

8、域中,则游戏结 束。4.4.总体设计总体设计(一)(一)数据结构设计数据结构设计游戏方块 Componet 结构体typedef struct tagComponetint intComID; /部件的 ID 号int ntDimension; /存储该部件所需的数组维数int* pintArray; /指向存储该部件的数组 Componet;Componet 结构体表示某个游戏方块具体的属性,每个游戏方块对应有一个编号,且有对应 存储该部件的数组,用指针指向该数组,并设定存储该部件所需数组(nn)的维数。Componet 结构体数组初始化游戏方块,即定义 MAXCOM 个 Componet

9、类型的结构体,并初始化(MAXCOM 为 7) 。例 如/6m_Componets6.intComID=6;m_Componets6.intDimension=4;m_Componets6.pintArray=new int16;C 语言课程设计报告- 5 -m_Componets6.pintArray0=0;m_Componets6.pintArray1=1;m_Componets6.pintArray2=0;m_Componets6.pintArray3=0; /0 1 0 0m_Componets6.pintArray4=0; /0 1 0 0m_Componets6.pintArray

10、5=1; /0 1 0 0m_Componets6.pintArray6=0; /0 1 0 0m_Componets6.pintArray7=0;m_Componets6.pintArray8=0;m_Componets6.pintArray9=1;m_Componets6.pintArray10=0;m_Componets6.pintArray11=0;m_Componets6.pintArray12=0; m_Componets6.pintArray13=1; m_Componets6.pintArray14=0; m_Componets6.pintArray15=0;以上代码是对长条这

11、个方块的定义和初始化。其余形状的 6 种方块的定义见附录 2 的程序 清单 CELSblockView:CELSblockView()该析构函数中。(二)(二)功能模块设计功能模块设计游戏方块预览新游戏方块将在如图 4 所示的右边 44 的正方形小方块中预览。使用随机函数 rand( )来 产生 06 之间的游戏方块编号,其中的正方形小方块的大小为 SIZESIZE。SIZE 为设定的 方块像素大小。游戏方块控制1、 左移的实现过程:- 6 -(1) 判断在矩形“容器”中能否左移。这一判断必须满足如下两个条件:游戏方块整体左移一位 后,游戏方块不能超越“矩形”容器的左边线,否则越界;并且在游戏

12、方块有值(值为 1)的位置, “矩形”容器必须是没有被占用的(占用时,值为 1) 。若满足这两个条件,则 执行左移动作,否则不执行左移动作. (2) 清除左移前的游戏方块。 (3) 在左移一位的位置,重新显示此游戏方块。 (具体如何清除和显示方块的函数将在功能函数 设计中阐述)2、 右移的实现过程:(1) 判断在矩形“容器”中能否右移。这一判断必须满足如下两个条件:游戏方块整体右 移一位后,游戏方块不能超越“矩形”容器的右边线,否则越界;并且在游戏方块有值 (值为 1)的位置, “矩形”容器必须是没有被占用的(占用时,值为 1) 。若满足这两个条 件,则执行右移动作,否则不执行右移动作。 (2

13、) 清除右移前的游戏方块。 (3) 在右移一位的位置,重新显示此游戏方块。3、 向下加速下落(下移)的实现过程:(1) 判断在当前的“矩形”容器中,能否下移。这一判断必须满足以下两个条件:游戏方块 整体下移一位后,游戏方块不能超过“矩形”容器的底边线,否则越界;并且在游戏方块 有值(值为 1)的位置, “矩形”容器必须是没有被占用的(占用时,值为 1) 。若满足这两 个条件,则执行下移动作,否则不执行下移动作。 (2) 清除下移前的游戏方块。 (3) 在下移一位的位置,重新显示此游戏方块。4、 旋转的实现过程:(1) 判断在当前的“矩形”容器中,能否旋转。这一判断必须满足以下两个条件:游戏方块

14、 整体旋转后,游戏方块不能超过“矩形”容器的左边线、 、右边线、底边线,否则越界;并 且在游戏方块有值(值为 1)的位置, “矩形”容器必须是没有被占用的(占用时,值为 1) 。 若满足这两个条件,则执行旋转动作,否则不执行旋转动作。 (2) 清除旋转前的游戏方块。 (3) 在“矩形”容器中显示区域不变的位置,显示旋转后的游戏方块。游戏显示更新当游戏方块左右移动、下落、旋转时,要先清除先前的游戏方块,重新绘制游戏方块。 当消除满行时,不能移动的方块下移后,进行重新绘制。 清除游戏方块的过程为:用刷新函数刷新相应的游戏区域,清除先前显示的方块,执 行相应的操作后,再次调用刷新函数刷新此区域,显示

15、将要显示的游戏方块。 游戏帮助功能 在帮助对话框中,直接添加静态文本即可。(三)(三)功能函数设计功能函数设计在 MFC 视图类中添加功能构造函数,主要的功能函数设计如下: CELSblockView():C 语言课程设计报告- 7 -函数原型:CELSblockView:CELSblockView()CELSblockView()初始化游戏的各项数据, “矩形”容器(游戏地图) 、游戏级别、当前部件 的 ID、游戏分数、随机函数。定义并初始化 MAXCOM 个方块部件信息(MAXCOM 为 7) ,且在 对应的析构函数中释放回收内存。 OnDraw():函数原型:void CELSblock

16、View:OnDraw(CDC* pDC)OnDraw()导入背景图片,画游戏区域、不能移动的方块、下落的部件,显示得分、级别、 下一个方块。 OnKeyDown():函数原型:void CELSblockView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)OnKeyDown()对键盘信息处理,读取键盘操作值,对当前部件,调用 CanLeft()、 CanRight()、CanRotate()、CanDown(),并实现左移、右移、旋转、加速下落。 OnTimer():函数原型:void CELSblockView:OnTimer(UINT

17、 nIDEvent)OnTimer()是定时器消息处理函数,显示预览部件,调用 CanDown()判断能否下移,实现方 块自由下落,调用 Disappear()消去满行,调用 CheckFail()判断游戏是否结束,调用 NewComponet()产生新部件。 NewComponet():函数原型:void CELSblockView:NewComponet(void)NewComponet()产生新部件的函数,并将新部件的信息拷贝到当前部件的结构体 m_CurrentCom 中。 CanDown():函数原型:bool CELSblockView:CanDown(void)或 false。

18、CanLeft() :函数原型:bool CELSblockView:CanLeft(void)CanLeft()判断游戏方块是否可以左移,并返回值 true 或 false。 CanRight():- 8 -函数原型:bool CELSblockView:CanRight(void)CanRight()判断游戏方块是否可以右移,并返回值 true 或 false。 CanRotate():函数原型:bool CELSblockView:CanRotate(void)CanRotate()判断游戏方块是否可以旋转,并返回值 true 或 false。 CanNew():函数原型:bool CE

19、LSblockView:CanNew(void)CanNew()判断是否可以在“矩形”容器中产生新的游戏方块,并返回值 true 或 false。 CheckFail():函数原型:bool CELSblockView:CheckFail(void)CheckFail()判断游戏是否结束,并返回值 true 或 false。 Disappear():函数原型:CELSblockView:Disappear(void)Disappear()判断是否有满行,且消去满行,记录消去行数,并按规则增加和显示游戏分 数。 MyInvalidateRect():函数原型:Void CELSblockView

20、:MyInvalidateRect(POINT ptStart,int intDimension)MyInvalidateRect()刷新了一个以 ptStart 为坐上角,长度为 intDimension 且不超出游 戏区域的正方形区域。 OnGameStart():函数原型:void CELSblockView:OnGameStart()OnGameStart()游戏开始的菜单和工具栏消息函数。 OnGameEnd( ):C 语言课程设计报告- 9 -函数原型:void CELSblockView:OnGameEnd()OnGameEnd( )游戏结束的菜单和工具栏消息函数。其他相关的功能

21、实现函数:PreCreateWindow( )函数原型:BOOL CMainFrame:PreCreateWindow(CREATESTRUCT typedef struct tagBlock * the data structure of the block */ char c44; /* cell fill info array, 0-empty, 1-filled */int x; /* block position cx 0,BoardWidht -1 */int y; /* block position cy -4,BoardHeight-1 */char color; /* blo

22、ck color */char size; /* block max size in width or height */char name; /* block name (the blocks shape) */ Block; int FrameTime= 1300; /* games global info */ int CellSize= 18; int BoardLeft= 30; int BoardTop= 30; /* next block grid */ int NBBoardLeft= 300; int NBBoardTop= 30; int NBCellSize= 10; /

23、* score board position */ int ScoreBoardLeft= 300; int ScoreBoardTop=100; int ScoreBoardWidth=200; int ScoreBoardHeight=35; int ScoreColor=LIGHTCYAN; /* infor text postion */ int InfoLeft=300; int InfoTop=200; int InfoColor=YELLOW; int BorderColor=DARKGRAY; int BkGndColor=BLACK; int GameRunning=true

24、; int TopLine=BoardHeight-1; /* top empty line */ int TotalScore=100; char info_score20; char info_help255; char info_common255; /* our board, Boardxy0-isFilled, Boardxy1-fillColor */ unsigned char BoardBoardWidthBoardHeight2; char BufferCells44; /* used to judge if can rotate block */ Block curBloc

25、k; /* current moving block */- 12 -Block nextBlock; /* next Block to appear */ int GetKeyCode(); int CanMove(int dx,int dy); int CanRotate(); int RotateBlock(Block *block); int PauseGame(); void QuitGame(); /*Get Key Code */ int _INNER_HELPER GetKeyCode() int key=0;if(bioskey(1)key=bioskey(0); retur

26、n key; /* create a new block by key number,void _INNER_HELPER DisplayScore() setcolor(BkGndColor);outtextxy(ScoreBoardLeft+5,ScoreBoardTop+5,info_score);setcolor(ScoreColor);sprintf(info_score,“Score: %d“,TotalScore);outtextxy(ScoreBoardLeft+5,ScoreBoardTop+5,info_score); /* we call this function wh

27、en a block is inactive. */* display text! */ void _INNER_HELPER DisplayInfo(char *text) setcolor(BkGndColor);outtextxy(InfoLeft,InfoTop,info_common);strcpy(info_common,text);setcolor(InfoColor);outtextxy(InfoLeft,InfoTop,info_common); * the block anchor to the top-left corner of 4*4 cells*/ void _IN

28、NER_HELPER GenerateBlock(Block *block) int key=(random(13)*random(17)+random(1000)+random(3000)%7;block-size=3;/* because most blocks size=3 */memset(block-c,0,16);switch(key)case 0:block-name=T;block-color=RED;C 语言课程设计报告- 13 -block-c10=1;block-c11=1, block-c21=1;block-c12=1;break;case 1:block-name=

29、L;block-color=YELLOW;block-c10=1;block-c11=1;block-c12=1, block-c22=1;break;case 2:block-name=J;block-color=LIGHTGRAY;block-c10=1;block-c11=1;block-c12=1, block-c02=1;break;case 3:block-name=z;block-color=CYAN;block-c00=1, block-c10=1;block-c11=1, block-c21=1;break;case 4:block-name=5;block-color=LI

30、GHTBLUE;block-c10=1, block-c20=1;block-c01=1, block-c11=1;break;case 5:block-name=o;block-color=BLUE;block-size=2;block-c00=1, block-c10=1;block-c01=1, block-c11=1;break;case 6:block-name=I;block-color=GREEN;block-size=4;block-c10=1;block-c11=1;block-c12=1;- 14 -block-c13=1;break; /* get next block!

31、 */ void NextBlock() /* copy the nextBlock to curBlock */curBlock.size=nextBlock.size;curBlock.color=nextBlock.color;curBlock.x=(BoardWidth-4)/2;EraseBlock(GenerateBlock(nextBlock.x=1,nextBlock.y=0;DrawBlock( /* rotate the block, update the block struct data */ int _INNER_HELPER RotateCells(char c44

32、,char blockSize) char temp,i,j;switch(blockSize)case 3:temp=c00;c00=c20, c20=c22, c22=c02, c02=temp;temp=c01;c01=c10, c10=c21, c21=c12, c12=temp;break;case 4: /* only I block arived here! */c10=1-c10, c12=1-c12, c13=1-c13;c01=1-c01, c21=1-c21, c31=1-c31;break; /* judge if the block can move toward t

33、he direction */ int CanMove(int dx,int dy) int i,j,tempX,tempY;for(i=0;i(BoardWidth-1) return false; /* make sure x is valid! */return true; /* judge if the block can rotate */void _INNER_HELPER DrawBlock(Block *block,int bdLeft,int bdTop,int cellSize) int i,j;setfillstyle(SOLID_FILL,block-color);fo

34、r(i=0;isize;i+)for(j=0;jsize;j+)if(block-cij int RotateBlock(Block *block) char temp,i,j;int b_success;if(block-size=2)return true;if( b_success=CanRotate()EraseBlock(block,BoardLeft,BoardTop,CellSize);memcpy(curBlock.c,BufferCells,16);DrawBlock(block,BoardLeft,BoardTop,CellSize);return b_success; i

35、nt DropBlock(Block *block) EraseBlock(block,BoardLeft,BoardTop,CellSize);while(CanMove(0,1)- 16 -curBlock.y+;DrawBlock(block,BoardLeft,BoardTop,CellSize);return 0; /* return value is assign to the blocks alive */ void _INNER_HELPER FillBoardData() int i,j;for(i=0;i=0)BoardcurBlock.x+icurBlock.y+j0=1

36、;BoardcurBlock.x+icurBlock.y+j1=curBlock.color; void _INNER_HELPER PaintBoard() int i,j,fillcolor;for(j=max(TopLine-4),0);j0 dosum=0;for(i=0;i topy;k-)for(i=0;i0 NextBlock();if(!CanMove(0,1)goto GameOver;tick=0;delay(100);switch(key)C 语言课程设计报告- 19 -case K_LEFT:MoveBlock(break;case K_RIGHT:MoveBlock(

37、break;case K_DOWN:MoveBlock(break;case K_UP:RotateBlock(break;case K_SPACE:DropBlock(break;case K_P:PauseGame();break; GameOver:DisplayInfo(“GAME OVER! Press any key to exit!“);getch(); /* wait the user Press any key. */QuitGame(); 六、六、调试过程调试过程、运行结果、运行结果 0123456789123鲜绿4粉红5蓝色- 20 - press P to start

38、oresumeUp rotade space dropLeft-lefe right-rightEsc-exit七、七、程序有待改进的地方程序有待改进的地方程序中的代码没有声音,可以在过关的时候播放音乐,在程序的界面也不是很好看,可以设计一些下拉菜单,程序在运行的时候,不可以暂停,在程序设计中也可以加一些声音,设计过关的时候,可以播放音乐,也可以设计一些小动画,这样可以增加游戏的吸引力!八、八、本次课程设计的收获和建议本次课程设计的收获和建议通过此次设计我认为我的基础只是不太好,平时要多加巩固。经过这次 课程设计,我对 C 语言有了更深一步的认识,有了更彻底的了解,也学习到了 很多东西,以前许多不明白的东西现在都可以应用自如了。我不仅在这次学习 过程中增长了知识,还培养了自己的自学能力,这样的自学让我受益匪浅。9、参考文献参考文献经典游戏程序设计-人民邮电出版社c 语言程序设计案例精编-中国水利水电出版社TURBO C 实用大全-机械工业出版社6红色7天蓝8金色9101112131415

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

当前位置:首页 > 研究报告 > 医学相关

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com