收藏 分享(赏)

C语言课程设计报告 俄罗斯方块改进版.doc

上传人:精品资料 文档编号:8322609 上传时间:2019-06-20 格式:DOC 页数:30 大小:313.56KB
下载 相关 举报
C语言课程设计报告 俄罗斯方块改进版.doc_第1页
第1页 / 共30页
C语言课程设计报告 俄罗斯方块改进版.doc_第2页
第2页 / 共30页
C语言课程设计报告 俄罗斯方块改进版.doc_第3页
第3页 / 共30页
C语言课程设计报告 俄罗斯方块改进版.doc_第4页
第4页 / 共30页
C语言课程设计报告 俄罗斯方块改进版.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、俄罗斯方块- 古有禹制作课程设计俄 罗 斯 方 块 改 进2016 年 4 月 20 日设计题目 俄罗斯方块学号专业班级学生姓名指导教师俄罗斯方块改进-古有禹制作1目录1. 课程设计目的 .12. 功能分析 .13. 程序设计实现过程 .23.1 程序总体设计结构 .23.2 界面设计 .43.3 重要数据的数据结构设计 .53.4 函数设计 .74. 运行效果 .125. 源代码详解 .136. 参考文献 .27俄罗斯方块改进-古有禹制作1俄罗斯方块改进1. 课程设计问题据百度百科,俄罗斯方块(Tetris)是一款由俄罗斯人 阿列克谢帕基特诺夫于 1984 年 6 月发明的休闲游戏。游戏的基

2、本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。要求支持键盘操作和 7 种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,消去一行所得到的分数越高,为玩家提供了不同的选择。2. 功能分析俄罗斯方块游戏需要解决的问题包括:按任意键开始游戏,随机产生方块并自动下移用 Esc 键退出游戏。 用 键变换方块用 键和 键左右移动方块用 键使方块加速下移用空格键使方块暂停能正确判断满行并消行、计分、定级别设定游戏方块为不同形状重点:*游戏面包的数据结构:二

3、维数组*7 种形状方块的数据结构:结构体保存每种形状方块的坐标俄罗斯方块改进-古有禹制作23. 程序设计实现过程3.1 程序总体设计结构首先初始化进入图形模式,进入欢迎界面,玩家按任意进入主菜单界面,按键进入游戏界面,键然后设置新的时钟中断。开始游戏后,进入该程序最核心的部分处理和实现进行过程中的各种事件和函数。在处理中判断游戏是否结束,如果没有结束,则重新开始游戏,否则结束游戏。详解如下:(1)游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在 19 种不同的游戏方块,所以在游戏方

4、块预览区域中需要显示随机生成的游戏方块。(2)游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。俄罗斯方块游戏初始化图形模式 (欢迎界面) 进入菜单选项开始新游戏游戏帮助游戏说明退出游戏游戏排名俄罗斯方块改进-古有禹制作3否是游戏执行主流程图(3)游戏显示更新功能。在判断键值时,有左移 VK_LEFT、右移VK_RIGHT、下移 VK_DOWN、变形旋转 VK_UP、退出 VK_ESC 键值的判断。当游戏方块左右移动、下落、旋转时,要清除先前的游戏方块,用新坐标重绘游戏方块。当消除满行时,要重绘游戏底板的当前状态。(4)游戏速

5、度分数更新功能。在游戏玩家进行游戏过程中,需要按照一定的游开始游戏游戏方块控制功能游戏方块预览功能游戏显示更新功能速度分数更新功能游戏结束退出功能游戏结束恢复原有的时钟中断关闭图形模式返回菜单俄罗斯方块改进-古有禹制作4戏规则给玩家计算游戏分数。比如,消除一行加 10 分。当游戏分数达到一定数量之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。(5)游戏帮助功能。玩家进入游戏后,将有对本游戏如何操作的友情提示。主函数:void main()InitializeGraph();SetTimer(newtimer); /*设置新的时钟中断*/while(

6、1)StartGame();ProcessInGame();if(GameOver()break;bOver = FALSE;KillTimer();closegraph();3.2 界面设计分为左右两个部分:*左边为游戏面板*右边有三部分:下一个形状提示框、速度框和计分框俄罗斯方块改进-古有禹制作53.3 重要数据的数据结构设计1)定义方块形状:定义如下的结构体来表示每一个形状:struct blockint arrXY8;int nColor;int nNext; /*保存某一形状信息的结构体*/Struct SHAPE shapesMAX_BOX=口 口口口 口口 口口 口 口 口口口口

7、口 口 0x88, 0xc0, CYAN, 1,0xe8, 0x0, CYAN, 2,0xc4, 0x40, CYAN, 3,0x2e, 0x0, CYAN, 0,口 口口 口口口口 口 口 口口口 口口口 口 0x44, 0xc0, MAGENTA, 5,0x8e, 0x0, MAGENTA, 6,0xc8, 0x80, MAGENTA, 7,俄罗斯方块改进-古有禹制作60xe2, 0x0, MAGENTA, 4,口口口 口口口 口口0x8c, 0x40, YELLOW, 9,0x6c, 0x0, YELLOW, 8,口 口口口口 口口口0x4c, 0x80, BROWN, 11,0xc6,

8、 0x0, BROWN, 10,口 口 口口口口 口口 口口口 口口口 口 口0x4e, 0x0, WHITE, 13,0x8c, 0x80, WHITE, 14,0xe4, 0x0, WHITE, 15,0x4c, 0x40, WHITE, 12,口口口 口口口口口俄罗斯方块改进-古有禹制作70x88, 0x88, RED, 17,0xf0, 0x0, RED, 16,口口口口0xcc, 0x0, BLUE, 18) ,2)定义游戏的主界面:宽 10、高 20 的游戏板(1) 数据结构:全局数组 Gameboard1222,1 表示已有的方块,0 表示这个位置空着。在 10*20 基础上各自

9、加 2 行、2 列为了便于判断形状在移动时是否到边、到底。整个屏幕的坐标系原先为 640*480。在此游戏中,将 16 个像素定义为一个方格的边长,所以坐标系转变成为了 40*30(640/16=40,480/10=30) 。(2)玩家进行游戏时,需要对游戏界面进行初始化工作。此代码被 main()函数调用。主要进行的工作如下: 循环调用 line()函数绘制当前游戏板。 调用 nScore()函数显示初始的成绩,初始成绩为 0。 调用 npeed()函数显示初始的速度 (等级) ,初始速度 1。* 注:x,y 为左上角坐标* * m,n 对应于 Vertical_boxs,Horizonta

10、l_boxs* * 分别表示纵横方向上方块的个数(以方块为单位)* BOARD_LEFT_X ,BOARD_LEFT_Y *3.4 函数设计1、本程序有主函数和个函数组成:本程序总共由 24 个函数组成。俄罗斯方块改进-古有禹制作82、函数相互作用关系见下图否是KillLine(int)IsLineFull(int)DrawSquare(int,int)IsConflict(int,int,int)DrawBlock(int,int,int,int)KillLine(int)IsGameOver()HandleDown(int,int*x, int *y)HandleUp(int *,int

11、*x, int *y)HandleRight(int,int *x, int *y)HandleLeft(int ,int *x, int *y)游戏介绍 help ()初始化模式进 入欢迎界 win()主菜单 menu()InitializeGameboard()开始游 戏StartGame () 处理在游戏中的各种事件ProcessInGame() 初始化图形模式InitializeGraph()设置新的时钟中断SetTimer(* (void) (*IntProc) (void)游戏是否结束GameOver()Interrupt() 恢复原来的时钟中断KillTimer()关闭图形模型返

12、回到主菜单menu()退出程序俄罗斯方块改进-古有禹制作9四、 函数运用函数原型 函数功能 函数处理描述void interrupt newtimer(void)新的时钟中断处理函数调用(*oldtimer)()函数语句柄,计时器自动加 1 void SetTimer(void interrupt(*IntProc)(void)指向原来时钟中断处理过程入口的中断处理函数(句柄)void KillTimer() 恢复原有的时钟中断处理过程调用 setvect()恢复原有的时钟中断处理过程void InitializeGraph() 初始化图形模式1、调用 initgraph()切换到图形模式 2

13、、初始化若发生错误,则返回错误密码void InitializeGameboard()初始化游戏面板以及下一形状提示框、计分框1、调用 bar()rectangle()等库函数绘图函数绘制游戏界面 2、调用俄罗斯方块改进-古有禹制作10和难度框 outtextxy()函数显示文字void DrawSquare(int x, int y)在坐标(x,y)处画方块调用库函数 bar()绘制方块void DrawBlock(int BlockIndex, int sx, int sy,int color)在坐标(sx,sy)处绘制颜色为color 的形状调用 DrawSqueare()函数绘制形状i

14、nt 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)按下右方向键时的处理函数调用 IsConflic()函数判断形状是否可以右移,void HandleUp(int *BlockIndex,int *x, int *y)按下上方向键(旋转

15、键)时的处理函数调用 IsConflic()函数判断形状是否可以旋转,俄罗斯方块改进-古有禹制作11int HandleDown(int BlockIndex,int *x, int *y)按下向下方向键或者自由下落时的处理函数形状在自由下落返回 0,无法下落了返回 1,并做相应处理int IsLineFull(int y) 判断 y 行是否已被填满填满返回 1,否则返回 0void KillLine(int y) 消去第 y 行 函数用于处理删除一满行的情况。Y指明具体哪一行为满行,并将消去的行置为背景色int KillLines(int y) 消去第 y 行以及与第 y行连续的上面被填满的

16、行返回消去的行数int IsGameOver() 判断游戏是否结束游戏结束返回 1,否则返回 0int GameOver() 在界面上输出游戏结束的信息,并根据用户按退出游戏返回 1,否则返回 0俄罗斯方块改进-古有禹制作12键选择决定是否退出游戏void StartGame() 游戏开始时调用的函数1、绘制界面需要调用函数InitializeGameboard()2、接下来初始化游戏面板的各个方块和一些全局变量的初值。void ProcessInGame() 核心函数,主要用于处理在游戏中的各种事件(如按下各种按键)调用HandleUpO、HandleDown()、HandleLeft()、

17、HandleRight()等事件处理函数Void main() 主流程函数 主函数入口,整个游戏的主控部分俄罗斯方块改进-古有禹制作134. 运行效果俄罗斯方块改进-古有禹制作145. 源代码详解#include #include #include #include /游戏窗口#define FrameX 4 /游戏窗口左上角的 X 轴坐标#define FrameY 4 /游戏窗口左上角的 Y 轴坐标#define Frame_height 20 /游戏窗口的高度#define Frame_width 18 /游戏窗口的宽度/定义全局变量int i,j,temp,temp1,temp2; /

18、temp,temp1,temp2 用于记住和转换方块变量的值int a8080=0; /标记游戏屏幕的图案:2,1,0 分别表示该位置为游戏边框、方块、无图案;初始化为无图案int b4; /标记 4 个“ 口“方块:1 表示有方块,0 表示无方块char shape104=“,“,“,“ “,“,“ “,“,“,“,“; int ss=0;/声明俄罗斯方块的结构体struct Tetrisint x; /中心方块的 x 轴坐标int y; /中心方块的 y 轴坐标int flag; /标记方块类型的序号int next; /下一个俄罗斯方块类型的序号int speed; /俄罗斯方块移动的速

19、度int count; /产生俄罗斯方块的个数int score; /游戏的分数int level; /游戏的等级;/函数原型声明/光标移到指定位置void gotoxy(HANDLE hOut, int x, int y);/制作游戏窗口void make_frame();/随机产生方块类型的序号void get_flag(struct Tetris *);/制作俄罗斯方块void make_tetris(struct Tetris *);/打印俄罗斯方块void print_tetris(HANDLE hOut,struct Tetris *);/清除俄罗斯方块的痕迹void clear_

20、tetris(HANDLE hOut,struct Tetris *);俄罗斯方块改进-古有禹制作15/判断是否能移动,返回值为 1,能移动,否则,不动int if_moveable(struct Tetris *);/判断是否满行,并删除满行的俄罗斯方块void del_full(HANDLE hOut,struct Tetris *);/开始游戏void start_game();void main()int t;for ( t=0; txtetris-y=b0; /中心方块位置的图形状态:1-有,0- 无switch(tetris-flag) /共 6 大类,19 种类型case 1:

21、/田字方块 atetris-xtetris-y-1=b1;atetris-x+2tetris-y-1=b2;atetris-x+2tetris-y=b3;break;case 2: /直线方块:- atetris-x-2tetris-y=b1;atetris-x+2tetris-y=b2;atetris-x+4tetris-y=b3;break;case 3: /直线方块: | atetris-xtetris-y-1=b1;atetris-xtetris-y-2=b2;atetris-xtetris-y+1=b3;break;case 4: /T 字方块 atetris-x-2tetris-y

22、=b1;atetris-x+2tetris-y=b2;atetris-xtetris-y+1=b3;break;case 5: /T 字顺时针转 90 度方块 atetris-xtetris-y-1=b1;atetris-xtetris-y+1=b2;atetris-x-2tetris-y=b3;break;case 6: /T 字顺时针转 180 度方块 atetris-xtetris-y-1=b1;俄罗斯方块改进-古有禹制作18atetris-x-2tetris-y=b2;atetris-x+2tetris-y=b3;break;case 7: /T 字顺时针转 270 度方块 atetr

23、is-xtetris-y-1=b1;atetris-xtetris-y+1=b2;atetris-x+2tetris-y=b3;break;case 8: /Z 字方块 atetris-xtetris-y+1=b1;atetris-x-2tetris-y=b2;atetris-x+2tetris-y+1=b3;break;case 9: /Z 字顺时针转 90 度方块 atetris-xtetris-y-1=b1;atetris-x-2tetris-y=b2;atetris-x-2tetris-y+1=b3;break;case 10: /Z 字顺时针转 180 度方块 atetris-xte

24、tris-y-1=b1;atetris-x-2tetris-y-1=b2;atetris-x+2tetris-y=b3;break;case 11: /Z 字顺时针转 270 度方块 atetris-xtetris-y+1=b1;atetris-x+2tetris-y-1=b2;atetris-x+2tetris-y=b3;break;case 12: /7 字方块 atetris-xtetris-y-1=b1;atetris-xtetris-y+1=b2;atetris-x-2tetris-y-1=b3;俄罗斯方块改进-古有禹制作19break;case 13: /7 字顺时针转 90 度方

25、块 atetris-x-2tetris-y=b1;atetris-x-2tetris-y+1=b2;atetris-x+2tetris-y=b3;break;case 14: /7 字顺时针转 180 度方块 atetris-xtetris-y-1=b1;atetris-xtetris-y+1=b2;atetris-x+2tetris-y+1=b3;break;case 15: /7 字顺时针转 270 度方块atetris-x-2tetris-y=b1;atetris-x+2tetris-y-1=b2;atetris-x+2tetris-y=b3;break;case 16: /倒 7 字方

26、块 atetris-xtetris-y+1=b1;atetris-xtetris-y-1=b2;atetris-x+2tetris-y-1=b3;break;case 17: /倒 7 字顺指针转 90 度方块 atetris-x-2tetris-y=b1;atetris-x-2tetris-y-1=b2;atetris-x+2tetris-y=b3;break;case 18: /倒 7 字顺时针转 180 度方块 atetris-xtetris-y-1=b1;atetris-xtetris-y+1=b2;atetris-x-2tetris-y+1=b3;break;俄罗斯方块改进-古有禹制

27、作20case 19: /倒 7 字顺时针转 270 度方块 atetris-x-2tetris-y=b1;atetris-x+2tetris-y+1=b2;atetris-x+2tetris-y=b3;break; /*判断是否可动*/int if_moveable(struct Tetris *tetris)if(atetris-xtetris-y!=0)/当中心方块位置上有图案时,返回值为 0,即不可移动return 0;elseif( /当为田字方块且除中心方块位置外,其他“ 口“字方块位置上无图案时,返回值为 1,即可移动( tetris-flag=1 return 0;/*随机产生

28、俄罗斯方块类型的序号*/void get_flag(struct Tetris *tetris)tetris-count+; /记住产生方块的个数srand(unsigned)time(NULL); /初始化随机数if(tetris-count=1)tetris-flag = rand()%19+1; /记住第一个方块的序号tetris-next = rand()%19+1; /记住下一个方块的序号/*打印俄罗斯方块*/void print_tetris(HANDLE hOut,struct Tetris *tetris)for(i=0;ix-2; ix+4; i+=2 )for(j=tetr

29、is-y-2;jy+1;j+)if( aij=1 printf(“%s“,shapess); /打印边框内的方块/打印菜单信息gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);printf(“level : %d“,tetris-level);gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);printf(“score : %d“,tetris-score);gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);printf(“speed : %dms“,tetris-speed

30、);/*清除俄罗斯方块的痕迹*/void clear_tetris(HANDLE hOut,struct Tetris *tetris)for(i=0;ix-2; ix+4; i+=2 )for(j=tetris-y-2;jy+1;j+)if( aij=0 printf(“ “); /清除方块/*判断是否满行并删除满行的俄罗斯方块*/void del_full(HANDLE hOut,struct Tetris *tetris) /当某行有 Frame_width-2 个方块时,则满行俄罗斯方块改进-古有禹制作23int k,del_count=0; /分别用于记录某行方块的个数和删除方块的行

31、数的变量for(j=FrameY+Frame_height-1;j=FrameY+1;j-)k=0;for(i=FrameX+2;iFrameY;k-) /如果删除行以上的位置有方块,则先清除,再将方块下移一个位置for(i=FrameX+2;iscore+=100*del_count; /每删除一行,得 100 分if( del_count0 tetris-level+;俄罗斯方块改进-古有禹制作24/*开始游戏*/void start_game()HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); /定义显示器句柄变量struct Tetris t

32、,*tetris= /定义结构体的指针并指向结构体变量unsigned char ch; /定义接收键盘输入的变量tetris-count=0; /初始化俄罗斯方块数为 0 个tetris-speed=300; /初始移动速度为 300mstetris-score=0; /初始游戏的分数为 0 分tetris-level=1; /初始游戏为第 1 关while(1)/循环产生方块,直至游戏结束get_flag(tetris); /得到产生俄罗斯方块类型的序号temp=tetris-flag; /记住当前俄罗斯方块序号/打印下一个俄罗斯方块的图形(右边窗口)tetris-x=FrameX+2*F

33、rame_width+6;tetris-y=FrameY+10;tetris-flag = tetris-next;print_tetris(hOut,tetris);tetris-x=FrameX+Frame_width; /初始中心方块 x 坐标tetris-y=FrameY-1; /初始中心方块 y 坐标tetris-flag=temp; /取出当前的俄罗斯方块序号while(1)/控制方块方向,直至方块不再下移label:print_tetris(hOut,tetris);/打印俄罗斯方块Sleep(tetris-speed); /延缓时间clear_tetris(hOut,tetri

34、s); /清除痕迹temp1=tetris-x; /记住中心方块横坐标的值temp2=tetris-flag; /记住当前俄罗斯方块序号if(kbhit() /判断是否有键盘输入,有则用 ch接收ch=getch(); if(ch=75) /按键则向左动,中心横坐标减 2 tetris-x-=2;if(ch=77) /按键则向右动,中心横坐标加 2 tetris-x+=2; if(ch=72) /按键则变体即当前方块顺时针转 90 度俄罗斯方块改进-古有禹制作25 if( tetris-flag=2 tetris-flag%=2;tetris-flag+=2;if( tetris-flag=4

35、 tetris-flag%=4;tetris-flag+=4; if( tetris-flag=8 tetris-flag%=4;tetris-flag+=8; if( tetris-flag=12 tetris-flag%=4;tetris-flag+=12; if( tetris-flag=16 tetris-flag%=4;tetris-flag+=16;if(ch=32) /按空格键,暂停print_tetris(hOut,tetris);while(1)if(kbhit() /再按空格键,继续游戏ch=getch();if(ch=32)goto label;俄罗斯方块改进-古有禹制作

36、26if(if_moveable(tetris)=0) /如果不可动,上面操作无效tetris-x=temp1;tetris-flag=temp2;else /如果可动,执行操作goto label;tetris-y+; /如果没有操作指令,方块向下移动if(if_moveable(tetris)=0) /如果向下移动且不可动,方块放在此处 tetris-y-;print_tetris(hOut,tetris);del_full(hOut,tetris);break;for(i=tetris-y-2;iy+2;i+)/游戏结束条件:方块触到框顶位置if(i=FrameY)j=0; /如果游戏结

37、束,j=0if(j=0) system(“cls“);getch();break;/清除下一个俄罗斯方块的图形(右边窗口)tetris-flag = tetris-next;tetris-x=FrameX+2*Frame_width+6;tetris-y=FrameY+10;clear_tetris(hOut,tetris); 俄罗斯方块改进-古有禹制作276. 参考文献C 程序设计第四版 谭浩强著 清华大学出版社出版C 语言程序设计 刘国成 科学出版社 从问题到程序 裘宗燕 北京大学出版社 计算机二级教程 刘瑞挺 南开大学出版社 C 语言程序设计基础教程 陈朔鹰,兵器工业出版社 5 C 语言

38、程序设计 姜仲秋 南京大学出版社俄罗斯方块改进-古有禹制作28设计题目 俄罗斯方块的改进 成绩课程设计主要内容设计首先对游戏 UI 进行的草图的绘制,设计出游戏 UI 的大小和方位。通过合理的设置游戏 UI 界面,会给游戏体验着带来更加愉悦的游戏体验,并留下深刻的印象。UI 初步绘制完成之后就是结构化程序比较重要的一步了,那就是算法的合理选择,一个程序的好坏不能单单对其 UI 的评价,而是算法是否合理,程序资源调配时否达到最优化的程度等。本程序采用数组与 UI 界面相结合的方法进行游戏规则判断。由于采用 TC 编译平台。不能提供丰富的预定义函数。所以所有函数除部分头文件均由后期编写。这样一来相比使用方便的 VC+编译平台,更具有实际操作能力。更具有意义。但同时要牺牲开发效率。UI 后期游戏中的绘制是根据数组中值的不断变化而绘制。UI 和算法均设计完毕后。便进入了最后的调试阶段。在调试阶段,通过对程序的调试,发现了很多严重的问题,经过不计其数的修改,最后程序还是比较接近预期设计效果。由于设计能力有限 部分游戏功能没有得以体现这是设计者表示比较遗憾的。在以后的学习中会不断完善,谢谢。指导老师评语签名: 20 年 月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报