C语言课程设计报告 俄罗斯方块改进版_第1页
C语言课程设计报告 俄罗斯方块改进版_第2页
C语言课程设计报告 俄罗斯方块改进版_第3页
C语言课程设计报告 俄罗斯方块改进版_第4页
C语言课程设计报告 俄罗斯方块改进版_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计设计题目 俄罗斯方块俄罗斯方块改进学生姓名学号专业班级指导教师2016年4月20日目录1. 课程设计目的12. 功能分析13. 程序设计实现过程23.1 程序总体设计结构23.2 界面设计43.3 重要数据的数据结构设计53.4 函数设计74. 运行效果125. 源代码详解136. 参考文献27俄罗斯方块改进1. 课程设计问题据百度百科,俄罗斯方块(Tetris)是一款由俄罗斯人阿列克谢帕基特诺夫于1984年6月发明的休闲游戏。游戏的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。要求支持键盘操作和7种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,消去一行所得到的分数越高,为玩家提供了不同的选择。2. 功能分析俄罗斯方块游戏需要解决的问题包括:按任意键开始游戏,随机产生方块并自动下移用Esc键退出游戏。 用键变换方块用键和 键左右移动方块用键使方块加速下移用空格键使方块暂停能正确判断满行并消行、计分、定级别设定游戏方块为不同形状重点: *游戏面包的数据结构:二维数组 *7种形状方块的数据结构:结构体保存每种形状方块的坐标3. 程序设计实现过程3.1 程序总体设计结构首先初始化进入图形模式,进入欢迎界面,玩家按任意进入主菜单界面,按键进入游戏界面,键然后设置新的时钟中断。开始游戏后,进入该程序最核心的部分处理和实现进行过程中的各种事件和函数。在处理中判断游戏是否结束,如果没有结束,则重新开始游戏,否则结束游戏。详解如下:(1)游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。(2)游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。 俄罗斯方块游戏 初始化图形模式 (欢迎界面) 进入菜单选项游戏帮助游戏排名退出游戏游戏说明开始新游戏 开始游戏否游戏结束退出功能速度分数更新功能游戏显示更新功能游戏方块预览功能游戏方块控制功能游戏结束是恢复原有的时钟中断 关闭图形模式返回菜单 游戏执行主流程图(3)游戏显示更新功能。在判断键值时,有左移VK_LEFT、右移VK_RIGHT、下移VK_DOWN、变形旋转VK_UP、退出VK_ESC键值的判断。当游戏方块左右移动、下落、旋转时,要清除先前的游戏方块,用新坐标重绘游戏方块。当消除满行时,要重绘游戏底板的当前状态。(4)游戏速度分数更新功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。比如,消除一行加10分。当游戏分数达到一定数量之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。(5)游戏帮助功能。玩家进入游戏后,将有对本游戏如何操作的友情提示。主函数:void main() InitializeGraph(); SetTimer(newtimer); /*设置新的时钟中断*/ while(1) StartGame(); ProcessInGame(); if(GameOver() break; bOver = FALSE; KillTimer(); closegraph();3.2 界面设计 分为左右两个部分: *左边为游戏面板 *右边有三部分:下一个形状提示框、速度框和计分框3.3 重要数据的数据结构设计1)定义方块形状:定义如下的结构体来表示每一个形状:struct block int arrXY8; int nColor; int nNext; /*保存某一形状信息的结构体*/ Struct SHAPE shapesMAX_BOX= 口 口口口 口口 口 口 口 口 口口口 口口 口 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, 0xe2, 0x0, MAGENTA, 4, 口 口口 口口 口 口口 0x8c, 0x40, YELLOW, 9, 0x6c, 0x0, YELLOW, 8, 口 口口 口口 口口 口 0x4c, 0x80, BROWN, 11, 0xc6, 0x0, BROWN, 10, 口 口 口 口口口 口口 口口口 口口 口 口 口 0x4e, 0x0, WHITE, 13, 0x8c, 0x80, WHITE, 14, 0xe4, 0x0, WHITE, 15, 0x4c, 0x40, WHITE, 12, 口 口 口 口口口口 口 0x88, 0x88, RED, 17, 0xf0, 0x0, RED, 16, 口口 口口 0xcc, 0x0, 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)玩家进行游戏时,需要对游戏界面进行初始化工作。此代码被main()函数调用。主要进行的工作如下: 循环调用line()函数绘制当前游戏板。 调用nScore()函数显示初始的成绩,初始成绩为0。 调用npeed()函数显示初始的速度(等级),初始速度1。 * * 注:x,y为左上角坐标 * * m,n对应于Vertical_boxs,Horizontal_boxs * * 分别表示纵横方向上方块的个数(以方块为单位) * BOARD_LEFT_X ,BOARD_LEFT_Y *3.4 函数设计 1、本程序有主函数和个函数组成:本程序总共由24个函数组成。 2、函数相互作用关系见下图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 *x, int *y)HandleRight(int,int *x, int *y)HandleLeft(int ,int *x, int *y)游戏介绍help ()初始化模式进 入欢迎界 win()主菜单 menu()InitializeGameboard()初始化图形模式InitializeGraph()设置新的时钟中断SetTimer(* (void)(*IntProc) (void)Interrupt() 否 是开始游戏StartGame () 恢复原来的时钟中断 KillTimer()关闭图形模型 返回到主菜单 menu()处理在游戏中的各种事件ProcessInGame() 退出程序游戏是否结束GameOver()四、 函数运用函数原型函数功能函数处理描述void interrupt newtimer(void)新的时钟中断处理函数调用(*oldtimer)()函数语句柄,计时器自动加1 void SetTimer(void interrupt(*IntProc)(void)指向原来时钟中断处理过程入口的中断处理函数(句柄)void KillTimer()恢复原有的时钟中断处理过程调用setvect()恢复原有的时钟中断处理过程void InitializeGraph()初始化图形模式1、调用initgraph()切换到图形模式2、初始化若发生错误,则返回错误密码void InitializeGameboard()初始化游戏面板以及下一形状提示框、计分框和难度框1、调用bar()rectangle()等库函数绘图函数绘制游戏界面2、调用outtextxy()函数显示文字void DrawSquare(int x, int y)在坐标(x,y)处画方块调用库函数bar()绘制方块void DrawBlock(int BlockIndex, 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)按下右方向键时的处理函数调用IsConflic()函数判断形状是否可以右移,void HandleUp(int *BlockIndex,int *x, int *y)按下上方向键(旋转键)时的处理函数调用IsConflic()函数判断形状是否可以旋转,int 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行连续的上面被填满的行返回消去的行数int IsGameOver()判断游戏是否结束游戏结束返回1,否则返回0int GameOver()在界面上输出游戏结束的信息,并根据用户按键选择决定是否退出游戏退出游戏返回1,否则返回0void StartGame()游戏开始时调用的函数1、绘制界面需要调用函数InitializeGameboard()2、接下来初始化游戏面板的各个方块和一些全局变量的初值。void ProcessInGame()核心函数,主要用于处理在游戏中的各种事件(如按下各种按键)调用HandleUpO、HandleDown()、HandleLeft()、HandleRight()等事件处理函数Void main()主流程函数主函数入口,整个游戏的主控部分4. 运行效果 5. 源代码详解#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; /temp,temp1,temp2用于记住和转换方块变量的值int a8080=0; /标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案int b4; /标记4个口方块:1表示有方块,0表示无方块char shape104=,; int ss=0;/声明俄罗斯方块的结构体struct Tetris int x; /中心方块的x轴坐标 int y; /中心方块的y轴坐标 int flag; /标记方块类型的序号 int next; /下一个俄罗斯方块类型的序号 int speed; /俄罗斯方块移动的速度 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_tetris(HANDLE hOut,struct Tetris *);/判断是否能移动,返回值为1,能移动,否则,不动int if_moveable(struct Tetris *);/判断是否满行,并删除满行的俄罗斯方块void del_full(HANDLE hOut,struct Tetris *);/开始游戏void start_game();void main() int t; for ( t=0; t10; t+) printf(%s,shapet); printf(n0 1 2 3 4 5 6 7 8 9n); printf(请输入形状编号); scanf(%d,&ss); /制作游戏窗口 make_frame(); /开始游戏 start_game();/*光标移到指定位置*/void gotoxy(HANDLE hOut, int x, int y) COORD pos; pos.X = x; /横坐标 pos.Y = y; /纵坐标 SetConsoleCursorPosition(hOut, pos);/*制作游戏窗口*/void make_frame() HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); /定义显示器句柄变量 gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); /打印游戏名称 printf(俄罗斯方块); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7); /打印选择菜单 printf(*下一个方块:); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13); printf(*); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+17); printf(键:变体); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19); printf(空格:暂停游戏); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15); printf(Esc :退出游戏); gotoxy(hOut,FrameX,FrameY); /打印框角并记住该处已有图案 printf(); gotoxy(hOut,FrameX+2*Frame_width-2,FrameY); printf(); gotoxy(hOut,FrameX,FrameY+Frame_height); printf(); gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height); printf(); aFrameXFrameY+Frame_height=2; aFrameX+2*Frame_width-2FrameY+Frame_height=2; for(i=2;i2*Frame_width-2;i+=2) gotoxy(hOut,FrameX+i,FrameY); printf(); /打印上横框 for(i=2;i2*Frame_width-2;i+=2) gotoxy(hOut,FrameX+i,FrameY+Frame_height); printf(); /打印下横框 aFrameX+iFrameY+Frame_height=2; /记住下横框有图案 for(i=1;iFrame_height;i+) gotoxy(hOut,FrameX,FrameY+i); printf(); /打印左竖框 aFrameXFrameY+i=2; /记住左竖框有图案 for(i=1;ixtetris-y=b0; /中心方块位置的图形状态:1-有,0-无 switch(tetris-flag) /共6大类,19种类型 case 1: /田字方块 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=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; atetris-x-2tetris-y=b2; atetris-x+2tetris-y=b3; break; case 7: /T字顺时针转270度方块 atetris-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-xtetris-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; break; case 13: /7字顺时针转90度方块 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字方块 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; case 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; else if( /当为田字方块且除中心方块位置外,其他口字方块位置上无图案时,返回值为1,即可移动 ( tetris-flag=1 & ( atetris-xtetris-y-1=0 & atetris-x+2tetris-y-1=0 & atetris-x+2tetris-y=0 ) ) | /或为直线方块且除中心方块位置外,其他口字方块位置上无图案时,返回值为1,即可移动 ( tetris-flag=2 & ( atetris-x-2tetris-y=0 & atetris-x+2tetris-y=0 & atetris-x+4tetris-y=0 ) ) | ( tetris-flag=3 & ( atetris-xtetris-y-1=0 & atetris-xtetris-y-2=0 & atetris-xtetris-y+1=0 ) ) | ( tetris-flag=4 & ( atetris-x-2tetris-y=0 & atetris-x+2tetris-y=0 & atetris-xtetris-y+1=0 ) ) | ( tetris-flag=5 & ( atetris-xtetris-y-1=0 & atetris-xtetris-y+1=0 & atetris-x-2tetris-y=0 ) ) | ( tetris-flag=6 & ( atetris-xtetris-y-1=0 & atetris-x-2tetris-y=0 & atetris-x+2tetris-y=0 ) ) | ( tetris-flag=7 & ( atetris-xtetris-y-1=0 & atetris-xtetris-y+1=0 & atetris-x+2tetris-y=0 ) ) | ( tetris-flag=8 & ( atetris-xtetris-y+1=0 & atetris-x-2tetris-y=0 & atetris-x+2tetris-y+1=0 ) ) | ( tetris-flag=9 & ( atetris-xtetris-y-1=0 & atetris-x-2tetris-y=0 & atetris-x-2tetris-y+1=0 ) ) | ( tetris-flag=10 & ( atetris-xtetris-y-1=0 & atetris-x-2tetris-y-1=0 & atetris-x+2tetris-y=0 ) ) | ( tetris-flag=11 & ( atetris-xtetris-y+1=0 & atetris-x+2tetris-y-1=0 & atetris-x+2tetris-y=0 ) ) | ( tetris-flag=12 & ( atetris-xtetris-y-1=0 & atetris-xtetris-y+1=0 & atetris-x-2tetris-y-1=0 ) ) | ( tetris-flag=13 & ( atetris-x-2tetris-y=0 & atetris-x-2tetris-y+1=0 & atetris-x+2tetris-y=0 ) ) | ( tetris-flag=14 & ( atetris-xtetris-y-1=0 & atetris-xtetris-y+1=0 & atetris-x+2tetris-y+1=0 ) ) | ( tetris-flag=15 & ( atetris-x-2tetris-y=0 & atetris-x+2tetris-y-1=0 & atetris-x+2tetris-y=0 ) ) | ( tetris-flag=16 & ( atetris-xtetris-y+1=0 & atetris-xtetris-y-1=0 & atetris-x+2tetris-y-1=0 ) ) | ( tetris-flag=17 & ( atetris-x-2tetris-y=0 & atetris-x-2tetris-y-1=0 & atetris-x+2tetris-y=0 ) ) | ( tetris-flag=18 & ( atetris-xtetris-y-1=0 & atetris-xtetris-y+1=0 & atetris-x-2tetris-y+1=0 ) ) | ( tetris-flag=19 & ( atetris-x-2tetris-y=0 & atetris-x+2tetris-y+1=0 & atetris-x+2tetris-y=0 ) ) ) return 1; return 0;/*随机产生俄罗斯方块类型的序号*/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=tetris-y-2;jy+1;j+) if( aij=1 & jFrameY ) gotoxy(hOut,i,j); 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,tetr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论