俄罗斯方块课程设计报告
俄罗斯方块课课程设计

俄罗斯方块课课程设计一、教学目标本课程旨在让学生了解和掌握俄罗斯方块的基本知识和技巧,通过实践操作,培养学生的逻辑思维能力和反应能力。
知识目标包括了解俄罗斯方块的起源、规则和发展历程,掌握基本的操作技巧。
技能目标包括能够熟练操作俄罗斯方块,实现各种高级技巧,如连消、旋转等。
情感态度价值观目标包括培养学生团队合作精神,鼓励他们在面对挑战时保持积极的态度。
二、教学内容教学内容主要包括俄罗斯方块的基本知识、操作技巧和策略。
首先,介绍俄罗斯方块的起源和发展历程,让学生了解这一经典游戏的历史。
然后,教授基本的操作技巧,如上下移动、旋转等,并通过实践练习,让学生熟练掌握。
接下来,引导学生学习高级技巧,如连消、组合等,并探讨如何在游戏中运用这些技巧。
最后,通过分析不同水平的俄罗斯方块游戏,让学生了解游戏难度和策略的选择。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法。
首先,讲授法,由教师讲解俄罗斯方块的基本知识和技巧。
其次,讨论法,学生分组讨论游戏策略和技巧,促进团队合作和思维碰撞。
再次,案例分析法,分析不同水平的俄罗斯方块游戏,让学生了解游戏难度和策略的选择。
最后,实验法,学生通过实践操作,掌握操作技巧和策略。
四、教学资源为了支持教学内容和教学方法的实施,我们将选择和准备适当的教学资源。
教材方面,将使用《俄罗斯方块教程》作为主教材,辅助以相关参考书籍。
多媒体资料方面,将收集俄罗斯方块的历史资料、游戏视频等,以丰富学生的学习体验。
实验设备方面,将准备电脑或游戏机等设备,让学生能够进行实践操作。
五、教学评估本课程的评估方式将包括平时表现、作业和考试三个部分,以全面客观地评价学生的学习成果。
平时表现将根据学生在课堂上的参与度、合作表现和操作技巧进行评估。
作业部分将布置相关的练习题和游戏设计任务,要求学生在规定时间内完成,以此检验他们的理解和应用能力。
考试部分将包括客观题和主观题,以测试学生对俄罗斯方块知识的掌握和操作技巧的熟练程度。
c俄罗斯方块课程设计

c 俄罗斯方块课程设计一、课程目标知识目标:1. 学生能理解俄罗斯方块游戏的规则与基本操作方法。
2. 学生能掌握俄罗斯方块中各种图形的特点及其旋转方式。
3. 学生了解俄罗斯方块游戏中的数学原理,如对称性、组合与分解。
技能目标:1. 学生能运用所学的操作方法,熟练玩转俄罗斯方块游戏。
2. 学生通过实践,培养观察力、反应能力和空间想象力。
3. 学生学会运用策略,提高解决问题的能力。
情感态度价值观目标:1. 学生通过游戏,培养积极向上的学习态度,体验学习与娱乐的结合。
2. 学生在团队协作中,学会相互鼓励、支持,培养团队精神。
3. 学生通过俄罗斯方块游戏,认识到生活中处处有数学,提高对数学学科的兴趣。
本课程针对小学四年级学生,结合学科特点,设计具有趣味性和挑战性的教学活动。
课程以游戏为载体,激发学生的学习兴趣,同时注重培养学生的观察力、反应能力和空间想象力。
通过本课程的学习,使学生达到以上所述的具体学习成果,为后续的教学设计和评估提供明确的方向。
二、教学内容1. 俄罗斯方块游戏规则与操作方法- 游戏界面认识- 方块种类及其特点- 方块旋转与移动操作2. 俄罗斯方块中的数学原理- 对称性:引导学生观察方块对称特点,理解轴对称与中心对称- 组合与分解:方块拼接与拆分,培养学生的空间想象力3. 游戏策略与技巧- 游戏进行中的观察与思考- 不同形状方块的最优摆放策略- 提高得分与消除层的方法4. 团队协作与竞技- 分组进行游戏竞技,培养学生团队协作精神- 交流游戏心得,分享成功经验教学内容安排和进度:第一课时:介绍俄罗斯方块游戏规则与操作方法,让学生亲自体验游戏,熟悉游戏界面和基本操作。
第二课时:学习俄罗斯方块中的数学原理,通过观察与实际操作,让学生理解对称性、组合与分解等概念。
第三课时:教授游戏策略与技巧,提高学生在游戏中的应对能力。
第四课时:进行团队协作与竞技,培养学生的团队精神和竞技心态。
教学内容与课本关联性:本课程内容以数学教材中关于几何图形的知识为基础,结合俄罗斯方块游戏,让学生在实际操作中巩固和应用所学知识。
C课程设计报告(俄罗斯方块)

C课程设计报告设计人:*** ***日期:2011-11-12指导教师:**设计题目:俄罗斯方块游戏目录目录 (1)一、设计任务 (3)二、设计目的 (3)三、功能描述 (4)1、游戏方块预览功能 (4)2、游戏方块控制功能 (4)3、游戏显示更新功能 (4)4、游戏速度分数更新功能 (5)5、游戏帮助功能 (5)四、总体设计 (5)1、功能模块设计 (6)(1)游戏执行主流程 (6)(2)游戏方块预览 (6)(3)游戏方块控制 (6)(4)游戏显示更新 (8)(5)游戏速度分数更新 (8)(6)游戏帮助 (8)2、数据结构设计: (9)(1)游戏底板BOARD结构体 (9)(2)游戏方块SHAPE结构体, (9)(3)SHAPE结构数组 (9)3、函数功能描述 (12)(1)newtimer() (12)(2)SetTimer() (12)(3)KillTimer() (12)(4)initialize() (12)(5)DelFullRow() (12)(6)setFullRow() (12)(7)MkNextBox() (12)(8)EraseBox() (13)(9)show_box() (13)(10)MoveAble() (13)(11)主函数main() (13)五、程序实现 (13)1、源代码分析 (13)(1)程序预处理 (13)(2)主函数 (17)(3)初始化界面 (21)(4)时钟中断处理 (23)(5)成绩、速度及帮助的显示 (24)(6)满行处理 (26)(7)游戏方块的显示和清除 (29)(8)游戏方块操作判断处理 (34)2、运行结果及界面介绍 (39)(1)游戏初始状态 (39)(2)游戏进行状态 (39)八、设计心得 (40)九、小组合作分工情况 (41)十、附录 (42)1、程序完整源代码 (42)2、截图 (57)一、设计任务1. 随机产生经典俄罗斯方块图形2. 设置难度级别,不同级别速度不同3. 方向键实现下落图形的左移、右移、加速下落、变形等基本操作4. 正确判断游戏结束5. 对游戏成绩进行记分二、设计目的本程序旨在训练学生的基本编程能力和游戏开发的技巧,熟悉C语言图形模式下的编程。
俄罗斯方块C语言程序设计报告

C语言课程设计报告I、俄罗斯方块游戏需要解决的问题包括:⑴、随机产生方块并自动下移⑵、用Esc键退出游戏⑶、用键变体⑷、用键和键左右移动方块⑸、用空格键使游戏暂停⑹、能正确判断满行并消行、计分、定级别⑺、设定游戏为不同级别,级别越高难度越大II、俄罗斯方块游戏需要设计的功能函数包括:⑴、声明俄罗斯方块的结构体⑵、函数原型声明⑶、制作游戏窗口2、游戏方块控制功能;通过各种条件的判断,实现对游戏方块的左移、右移、自由下落、旋转功能,以及行满消除行的功能;3、游戏数据显示功能;在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数;例如,消除一行加100分,游戏分数达到一定数量之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加;以上游戏数据均会在游戏界面右侧显示以提示玩家;4、游戏信息提示功能;玩家进入游戏后,将有对本游戏如何操作的友情提示;5、游戏结束退出功能;判断游戏结束条件,通过Esc键进行退出;是关闭游戏界面返回程序游戏执行主流程图2、界面设计分为左右两个部分:左边为游戏面板右边有三部分:游戏数据提示框、下一个方块提示框和功能提示框3、重要功能函数设计1、声明俄罗斯方块的结构体struct Tetris{int x; //中心方块的x轴坐标int y; //中心方块的y轴坐标int flag; //标记方块类型的序号int next; //下一个俄罗斯方块类型的序号int speed; //俄罗斯方块移动的速度//开始游戏void start_game;3、制作游戏窗口void make_frame{HANDLE hOut = GetStdHandleSTD_OUTPUT_HANDLE; //定义显示器句柄变量gotoxyhOut,FrameX+Frame_width-5,FrameY-2; //打印游戏名称printf"俄罗斯方块";gotoxyhOut,FrameX+2Frame_width+3,FrameY+7; //打印选择菜单printf"下一个方块:";gotoxyhOut,FrameX+2Frame_width+3,FrameY+13;printf"";gotoxyhOut,FrameX+2Frame_width+3,FrameY+17;printf"↑键:变体";gotoxyhOut,FrameX+2Frame_width+3,FrameY+19;printf"空格:暂停游戏";gotoxyhOut,FrameX+2Frame_width+3,FrameY+15;printf"Esc :退出游戏";gotoxyhOut,FrameX,FrameY; //打印框角并记住该处已有图案printf"║"; //打印左竖框aFrameXFrameY+i=2; //记住左竖框有图案}fori=1;i<Frame_height;i++{gotoxyhOut,FrameX+2Frame_width-2,FrameY+i;printf"║"; //打印右竖框aFrameX+2Frame_width-2FrameY+i=2; //记住右竖框有图案}}4、制作俄罗斯方块void make_tetrisstruct Tetris tetris{atetris->xtetris->y=b0; //中心方块位置的图形状态:1-有,0-无switchtetris->flag //共6大类,19种类型{case 1: //田字方块{atetris->xtetris->y-1=b1;}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->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;{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;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->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;}}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 &&tetris->flag = rand%19+1; //记住第一个方块的序号}tetris->next = rand%19+1; //记住下一个方块的序号}7、打印俄罗斯方块void print_tetrisHANDLE hOut,struct Tetris tetris{fori=0;i<4;i++bi=1; //数组b4的每个元素的值都为1 }make_tetristetris; //制作俄罗斯方块for i=tetris->x-2; i<=tetris->x+4; i+=2{forj=tetris->y-2;j<=tetris->y+1;j++{if aij==1 && j>FrameY{gotoxyhOut,i,j;{forj=tetris->y-2;j<=tetris->y+1;j++{if aij==0 && j>FrameY{gotoxyhOut,i,j;printf" "; //清除方块}}}9、判断是否满行并删除满行的俄罗斯方块void del_fullHANDLE hOut,struct Tetris tetris{ //当某行有Frame_width-2个方块时,则满行int k,del_count=0; //分别用于记录某行方块的个数和删除方块的行数的变量forj=FrameY+Frame_height-1;j>=FrameY+1;j--{k=0;printf"□";}}}j++; //方块下移后,重新判断删除行是否满行del_count++; //记录删除方块的行数}}}}tetris->score+=100del_count; //每删除一行,得100分if del_count>0 && tetris->score%1000==0 || tetris->score/1000>tetris->level-1 { //如果得1000分即累计删除10行,速度加快20ms并升一级tetris->speed-=20;tetris->level++;}}10、开始游戏Sleeptetris->speed; //延缓时间clear_tetrishOut,tetris; //清除痕迹temp1=tetris->x; //记住中心方块横坐标的值temp2=tetris->flag; //记住当前俄罗斯方块序号ifkbhit{ //判断是否有键盘输入,有则用ch↓接收ch=getch;ifch==75 //按←键则向左动,中心横坐标减2{tetris->x-=2;ifch==77 //按→键则向右动,中心横坐标加2{tetris->x+=2;}ifch==72 //按↑键则变体即当前方块顺时针转90度{if tetris->flag>=2 && tetris->flag<=3{tetris->flag++;tetris->flag%=2;tetris->flag%=4;tetris->flag+=16;}}ifch==32 //按空格键,暂停{print_tetrishOut,tetris;while1{ifkbhit //再按空格键,继续游戏ch=getch;ifch==32{goto label;}}}}ifif_moveabletetris==0 //如果不可动,上面操作无效{ifj==0{system"cls";getch;break;}//清除下一个俄罗斯方块的图形右边窗口tetris->flag = tetris->next;tetris->x=FrameX+2Frame_width+6;tetris->y=FrameY+10;clear_tetrishOut,tetris; } }4、函数设计流程 、进入俄罗斯方块程序定义全局变量 定义主函数 void main 声明俄罗斯方块的结构体 struct Tetris 函数原型声明 //制作游戏窗口make_frame; //开始游戏start_game; 制作俄罗斯方块判断是否可动。
c俄罗斯方块课程设计

c 俄罗斯方块课程设计一、教学目标本课程旨在通过学习俄罗斯方块的基本原理和编程技巧,使学生掌握以下知识目标:1.了解俄罗斯方块游戏的规则和基本操作;2.学习使用C语言进行简单的游戏编程;3.掌握函数的定义和调用,以及循环、条件语句等基本语法。
在技能目标方面,学生将能够:1.独立编写简单的俄罗斯方块游戏程序;2.运用所学的编程技巧解决实际问题;3.培养逻辑思维能力和创新意识。
情感态度价值观目标包括:1.培养学生对计算机编程的兴趣和热情;2.培养学生团队协作和相互帮助的精神;3.培养学生面对挑战、克服困难的信心和决心。
二、教学内容本课程的教学内容主要包括以下几个部分:1.俄罗斯方块游戏的基本规则和操作;2.C语言编程基础,包括变量、数据类型、运算符等;3.函数的定义和调用,循环、条件语句等基本语法;4.俄罗斯方块游戏的编程实践。
教学大纲安排如下:第1-2课时:俄罗斯方块游戏的基本规则和操作;第3-4课时:C语言编程基础;第5-6课时:函数的定义和调用,循环、条件语句等基本语法;第7-8课时:俄罗斯方块游戏的编程实践。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用以下教学方法:1.讲授法:讲解俄罗斯方块游戏的基本规则、C语言编程基础和函数调用等知识点;2.案例分析法:通过分析典型的俄罗斯方块游戏程序,使学生更好地理解编程原理;3.实验法:让学生亲自动手编写俄罗斯方块游戏程序,巩固所学知识。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:《C语言程序设计》;2.参考书:《C语言编程实例教程》;3.多媒体资料:俄罗斯方块游戏视频教程;4.实验设备:计算机、编程软件。
五、教学评估本课程的评估方式包括以下几个方面:1.平时表现:通过课堂参与、提问、讨论等方式评估学生的学习态度和积极性;2.作业:布置相关的编程练习,评估学生的编程能力和掌握程度;3.考试:期末进行一次考试,评估学生对课程知识的整体掌握情况。
软件工程课程设计报告俄罗斯方块

《软件工程》课程设计报告课题:俄罗斯块学院:计算机与信息学院专业:软件工程姓名(学号):晋烨(2011112360)指导教师:昭一、任务分析俄罗斯块是个老少皆宜的小游戏,它实现由四块正形的色块组成,计算机随机产生不同七种类型的块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个向键控制翻转、向左、向右和向下操作,然后程序根据这七种块堆叠成各种不同的模型。
二、可行性研究报告1、设计背景俄罗斯块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。
俄罗斯块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。
随着计算机的发展而发展,俄罗斯块不断推出新,深爱广大玩家喜爱。
这个游戏有的简单,有的复杂,但其根本原理是一样的都是对运动的块进行组合,来训练玩家的反应能力。
因此开发此游戏软件可满足人们的一些娱乐的需求。
此俄罗斯块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯块游戏。
2、设计目的通过本游戏的设计,综合自己在校期间所学的理论知识,设计开发俄罗斯广场游戏,使自己熟应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,进一步巩固和加强自身对J2SE基础知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。
3、设计要求本游戏开发的总体任务是实现游戏的可操作性,以及界面的美观性。
整个开发过程遵循软件工程规,采用JAVA GUI编程实现界面以及事件的控制。
用户根据键盘的四个向键控制翻转、向左、向右、和向下操作,通过菜单栏中的相应菜单选项实现游戏的开始、结束、变换向、积分以及等级的功能。
4、设计目标通过本游戏的开发,主要实现游戏的可操作性及美观性,同时使自己对JAVA语言的了解更进一层,为将来的实际工作打下坚实的基础。
三、需求分析游戏需求28种状态的块随机产生,自由下落,落下时可由玩家用上、下、左、右控制键控制翻转和移动,以便玩家所需要的形态和位置落下。
课程设计报告-俄罗斯方块

课程设计报告题目俄罗斯方块专业计算机学院(嵌入式方向)班级1姓名学号同组人指导老师史毓达计算机学院2016.6.15目录摘要 (1)关键字 (1)1功能说明 (1)2开发环境 (1)2.1 Qt简介 (1)2.2 Qt安装 (1)2.3 Qt开发基础 (2)2.3.1 Qt 对象与对象树 (2)2.3.2信号与槽 (2)2.3.3事件 (5)3系统设计 (5)3.1需求分析 (5)3.2框架设计 (6)3.2.1俄罗斯方块基本规则 (6)3.2.2系统模块 (7)3.3系统实现 (7)4系统测试 (9)5课程设计总结 (10)6附录 (10)6.1参考资料 ...................................错误!未定义书签。
6.2程序源码 (10)摘要Qt 是一个跨平台的C++图形用户界面应用程序框架。
本程序利用Qt 提供的相关类,实现了俄罗斯方块的基本功能。
关键字QT、嵌入式、软件开发1功能说明支持俄罗斯方块游戏的基本功能支持虚拟按键2开发环境操作系统: ubuntu 10.04 LTS开发工具: gnu 编译工具链 (gcc 等) 、Qt Creator 、Qt 4.6.22.1Qt 简介Qt 是跨平台的应用程序和UI 框架。
它包括跨平台类库、集成开发工具和跨平台IDE 。
使用Qt,只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。
2.2Qt 安装1.Qt 官网( )上有完整的SDK下载,下载开发平台的 SDK,下载完成后点击即可安装2.如果是使用 Linux 系统,也可能通过命令行进行安装,以 ubuntu 10.04 LTS 为例:sudo apt-get install qt4-dev-tools qtcreator qt4-doc qt4-qtconfig qt-demos3.如果希望构建嵌入式 Qt 开发平台,则需要参考相关开发板的说明,一般是先制作交叉编译工具链、再交叉编译一个用于目标板的 Qt 库,这里不再详述2.3 Qt 开发基础2.3.1Qt 对象与对象树QObject 是所有 Qt 类的基类。
俄罗斯方块游戏课程设计报告

计算机工程学院课程设计说明书课程名称:______________________________________ 设计项目:______________________________________ 学生姓名:______________________________________ 学号:______________________________________ 专业:______________________________________ 班级:______________________________________ 指导教师:____________________________________________年______月一、任务与具体要求二、设计说明书包括的内容三、应完成的图纸四、评语及成绩指导教师(签字)_____________________年____月____日目录1.系统概述 (2)2.原有程序概况 (3)3.现在系统操作界面 (5)4.现在程序详细设计 (7)5.用户手册 (14)6.测试计划 (15)7.课程设计心得体会 (16)8.参考书籍及资料 (17)系统概述1.1现状分析在个人电脑日益普及的今天,一些有趣的桌面游戏已经成为人们在使用计算机进行工作学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一,它以其趣味性强,易上手等诸多特点得到了大众认可,因此开发此游戏软件可满足人们的一些娱乐需求.此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。
1。
2项目要求俄罗斯方块是一款适合大众的游戏软件,它适合不同年龄的人玩.本软件实现的基本功能如下:●游戏区:玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况和下一个将要出现方块的提示。
●游戏控制:玩家可以通过游戏控制功能来控制游戏开始,暂停,结束游戏,游戏难度的设置以及音效控制.●玩家游戏信息存储及删除:玩家的得分在前五名时,将会记录在排行榜上,同时可为玩家清空排行榜。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录1. 系统概述 12. 设计说明书 43. 系统操作界面 64. 源程序编码75.测试计划6.改进意见36 397.课程设计心得体会40 8. 参考书籍、资料40系统概述1.1 现状分析在个人电脑日益普及的今天,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一,它以其趣味性强,易上手等诸多特点得到了大众的认可,因此开发此游戏软件可满足人们的一些娱乐的需求。
此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。
1.2 项目要求俄罗斯方块游戏是一款适合大众的游戏软件,它适合不同年龄的人玩。
本软件要实现的功能如下:(1)游戏区:玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况。
(2)游戏控制:玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏。
(3)级别设置:玩家可以根据自己的需要自行设定游戏的开始级别,级别越高,游戏的速度越快,难度越大。
(4)1.3 系统功能模块示意图显示玩家操作游戏区显示操作结果开始俄罗斯方块游戏暂停 /继续提高等级游戏控制降低等级退出项目开发计划书项目开发计划书名称时间工作内容下达设计任务1 天(集中)说明如何着手设计的方法和设计任务的解释说明。
收集、分析资料及项目组在项目经理的组织下选题、分析,2 天识别实体,完成《项目开发计划书》及小文档组人员分工。
各项目组完成系统层次图、用户界面设计、设计 2 天数据库表设计、报表设计,完成《设计说明书》程序编写和测试7 天根据方案进行现场编程、调试。
编写设计文档 2 天完成软件测试以及《用户操作手册》的编写。
各小组提交文档,教师根据情况选择是否文档提交、答辩 1 天答辩及答辩方式(抽样答辩或全员答辩)。
设计说明1.1 游戏区模块创建游戏区游戏区模块处理玩家游戏操作显示游戏结果1.2 控制区模块开始游戏暂停游戏游戏控制模块初始级别设置退出游戏1.3 系统流程图开始设置初始级别随机选择方块类型创建游戏区是否到顶部游戏开局是方块下落一行游戏结束否处理玩家操作1.4 模块简介是否到顶部1.功能模块(1)游戏区模块(创建游戏区,处理玩家操作,显示操作结果)(2)游戏控制模块(开始,暂停继续,提高等级,降低等级,停止,新游戏,帮助)系统操作界面游戏打开界面游戏进行中界面源代码编码#include <stdio.h>#include <bios.h>#include <dos.h>#include <graphics.h>#include <string.h>#include <stdlib.h>#define true 1#define false 0#define BoardWidth 12#define BoardHeight 23#define _INNER_HELPER/*inner helper method *//*Scan Codes Define*/enum KEYCODES{K_ESC =0x011b,K_UP =0x4800, /* upward arrow */ K_LEFT =0x4b00,K_DOWN =0x5000,K_RIGHT =0x4d00,K_SPACE =0x3920,K_P =0x1970};/* the data structure of the block */typedef struct tagBlock{char c[4][4]; /* 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; /* block color */char size; /* block max size in width or height */char name; /* block name (the block's shape) */} Block;/* game's global info */int FrameTime= 1300;int CellSize= 18;int BoardLeft= 30;int BoardTop= 30;/* next block grid */int NBBoardLeft= 300;int NBBoardTop= 30;int NBCellSize= 10;/* 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;int TopLine=BoardHeight-1; /* top empty line */int TotalScore=100;char info_score[20];char info_help[255];char info_common[255];/* our board, Board[x][y][0]-isFilled, Board[x][y][1]-fillColor */unsigned char Board[BoardWidth][BoardHeight][2];char BufferCells[4][4]; /* used to judge if can rotate block */ Block curBlock; /* current moving block */Block nextBlock; /* next Block to appear *//* function list */int GetKeyCode();int CanMove(int dx,int dy);int CanRotate();int RotateBlock(Block *block);int MoveBlock(Block *block,int dx,int dy);void DrawBlock(Block *block,int,int,int);void EraseBlock(Block *block,int,int,int);void DisplayScore();void DisplayInfo(char* text);void GenerateBlock(Block *block);void NextBlock();void InitGame();int PauseGame();void QuitGame();/*Get Key Code */int _INNER_HELPERGetKeyCode(){int key=0;if(bioskey(1)){key=bioskey(0);}return key;}/* display text!*/void _INNER_HELPERDisplayInfo(char*text){setcolor(BkGndColor);outtextxy(InfoLeft,InfoTop,info_common);strcpy(info_common,text);setcolor(InfoColor);outtextxy(InfoLeft,InfoTop,info_common);}/* create a new block by key number,* the block anchor to the top-left corner of 4*4 cells*/void _INNER_HELPERGenerateBlock(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;block->c[1][0]=1;block->c[1][1]=1,block->c[2][1]=1;block->c[1][2]=1;break;case 1:block->name='L';block->color=YELLOW;block->c[1][0]=1;block->c[1][1]=1;block->c[1][2]=1,block->c[2][2]=1;break;case 2:block->name='J';block->color=LIGHTGRAY;block->c[1][0]=1;block->c[1][1]=1;block->c[1][2]=1,block->c[0][2]=1;break;case 3:block->name='z';block->color=CYAN;block->c[0][0]=1,block->c[1][0]=1;block->c[1][1]=1,block->c[2][1]=1;break;case 4:block->name='5';block->color=LIGHTBLUE;block->c[1][0]=1,block->c[2][0]=1;block->c[0][1]=1,block->c[1][1]=1;break;case 5:block->name='o';block->color=BLUE;block->size=2;block->c[0][0]=1,block->c[1][0]=1;block->c[0][1]=1,block->c[1][1]=1;break;case 6:block->name='I';block->color=GREEN;block->size=4;block->c[1][0]=1;block->c[1][1]=1;block->c[1][2]=1;block->c[1][3]=1;break;}}/* get next block!*/void NextBlock(){/* copy the nextBlock to curBlock*/curBlock.size=nextBlock.size;curBlock.color=nextBlock.color;curBlock.x=(BoardWidth-4)/2;curBlock.y=-curBlock.size;memcpy(curBlock.c,nextBlock.c,16);/* generate nextBlock and show it*/EraseBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);GenerateBlock(&nextBlock);nextBlock.x=1,nextBlock.y=0;DrawBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);}/* rotate the block, update the block struct data */int _INNER_HELPERotateCells(char c[4][4],char blockSize){char temp,i,j;switch(blockSize){case 3:temp=c[0][0];c[0][0]=c[2][0], c[2][0]=c[2][2], c[2][2]=c[0][2], c[0][2]=temp;temp=c[0][1];c[0][1]=c[1][0], c[1][0]=c[2][1], c[2][1]=c[1][2],c[1][2]=temp;break;case 4: /* only 'I' block arived here! */c[1][0]=1-c[1][0], c[1][2]=1-c[1][2], c[1][3]=1-c[1][3];c[0][1]=1-c[0][1], c[2][1]=1-c[2][1], c[3][1]=1- c[3][1];break;}}/* judge if the block can move toward the direction */int CanMove(int dx,int dy){int i,j,tempX,tempY;for(i=0;i<curBlock.size;i++){for(j=0;j<curBlock.size;j++){if(curBlock.c[i][j]){/* cannot move leftward or rightward */tempX = curBlock.x + i + dx;if(tempX<0 || tempX>(BoardWidth-1)) return false; /* make sure x is valid! *//* cannot move downward */tempY = curBlock.y + j + dy;if(tempY>(BoardHeight-1)) return false; /* y is only checked lower bound, maybe negative!!!! *//* the cell already filled, we must check Y's upper bound before check cell ! */if(tempY>=0 && Board[tempX][tempY][0]) return false;}}}return true;}/* judge if the block can rotate */int CanRotate(){int i,j,tempX,tempY;/* update buffer */memcpy(BufferCells, curBlock.c, 16);RotateCells(BufferCells,curBlock.size);for(i=0;i<curBlock.size;i++){for(j=0;j<curBlock.size;j++){if(BufferCells[i][j]){tempX=curBlock.x+i;tempY=curBlock.y+j;if(tempX<0 || tempX>(BoardWidth-1))return false;if(tempY>(BoardHeight-1))return false;if(tempY>=0&& Board[tempX][tempY][0])return false;}}}return true;}/* draw the block*/void _INNER_HELPERDrawBlock(Block *block,int bdLeft,int bdTop,int cellSize){int i,j;setfillstyle(SOLID_FILL,block->color);for(i=0;i<block->size;i++){for(j=0;j<block->size;j++){if(block->c[i][j]&& (block->y+j)>=0){floodfill(bdLeft+cellSize*(i+block->x)+cellSize/2,bdTop+cellSize*(j+block->y)+cellSize/2,BorderColor);}}}}/* Rotate the block, if success, return true*/int RotateBlock(Block*block){char temp,i,j; int b_success; if(block->size==2)return true;b_success=CanRotate()))EraseBlock(block,BoardLeft,BoardTop,CellSize); memcpy(curBlock.c,BufferCells,16);DrawBlock(block,BoardLeft,BoardTop,CellSize); }return b_success; }/* erase a block, only fill the filled cell with background color */void _INNER_HELPEREraseBlock(Block *block,int bdLeft,int bdTop,intcellSize) {int i,j;setfillstyle(SOLID_FILL,BkGndColor); for(i=0;i<block->size;i++) {for(j=0;j<block->size;j++) {if(block->c[i][j] && (block->y+j>=0)) {floodfill(bdLeft+cellSize*(i+block->x)+cellSize/2, bdTop+cellSize*(j+block->y)+cellSize/2, BorderColor);} } } }/* move by the direction if can, donothing if cannot* return value: true - success, false - cannot move toward this direction */int MoveBlock(Block *block,int dx,int dy) {int b_canmove=CanMove(dx,dy); if(b_canmove) {if(( {EraseBlock(block,BoardLeft,BoardTop,CellSize);curBlock.x+=dx;curBlock.y+=dy;DrawBlock(block,BoardLeft,BoardTop,CellSize);}return b_canmove;}/* drop the block to the bottom!*/int DropBlock(Block*block){EraseBlock(block,BoardLeft,BoardTop,CellSize);while(CanMove(0,1)){curBlock.y++;}DrawBlock(block,BoardLeft,BoardTop,CellSize);return 0;/* return value is assign to the block's alive*/}/* init the graphics mode, draw the board grid */void InitGame(){int i,j,gdriver=DETECT,gmode;struct time sysTime;/* draw board cells */memset(Board,0,BoardWidth*BoardHeight*2);memset(nextBlock.c,0,16);strcpy(info_help,"P: Pause Game. --by hoodlum1980");initgraph(&gdriver,&gmode,"");setcolor(BorderColor);for(i=0;i<=BoardWidth;i++){line(BoardLeft+i*CellSize, BoardTop, BoardLeft+i*CellSize, BoardTop+ BoardHeight*CellSize);}for(i=0;i<=BoardHeight;i++){line(BoardLeft, BoardTop+i*CellSize, BoardLeft+BoardWidth*CellSize, BoardTop+ i*CellSize);}/* draw board outer border rect */rectangle(BoardLeft-CellSize/4, BoardTop-CellSize/4,BoardLeft+BoardWidth*CellSize+CellSize/4,BoardTop+BoardHeight*CellSize+CellSize/4);/* draw next block grids*/for(i=0;i<=4;i++){line(NBBoardLeft+i*NBCellSize, NBBoardTop, NBBoardLeft+i*NBCellSize, NBBoardTop+4*NBCellSize);line(NBBoardLeft, NBBoardTop+i*NBCellSize,NBBoardLeft+4*NBCellSize, NBBoardTop+i*NBCellSize);}/* draw score rect*/rectangle(ScoreBoardLeft,ScoreBoardTop,ScoreBoardLeft+ScoreBoardWidth,S coreBoardTop+ScoreBoardHeight);DisplayScore();/* set new seed! */gettime(&sysTime);srand(sysTime.ti_hour*3600+sysTime.ti_min*60+sysTime.ti_sec);GenerateBlock(&nextBlock);NextBlock();/* create first block*/setcolor(DARKGRAY);outtextxy(InfoLeft,InfoTop+20,"Up-rotate Space-drop");outtextxy(InfoLeft,InfoTop+35,"Left-left Right-right");outtextxy(InfoLeft,InfoTop+50,"Esc-exit");DisplayInfo(info_help);}/* set the isFilled and fillcolor data to the board */void_INNER_HELPERFillBoardData(){int i,j;for(i=0;i<curBlock.size;i++){for(j=0;j<curBlock.size;j++){if(curBlock.c[i][j]&& (curBlock.y+j)>=0){Board[curBlock.x+i][curBlock.y+j][0]=1;Board[curBlock.x+i][curBlock.y+j][1]=curBlock.color;}}}}/* draw one line of the board */void_INNER_HELPERPaintBoard(){int i,j,fillcolor;for(j=max((TopLine-4),0);j<BoardHeight;j++){for(i=0;i<BoardWidth;i++){fillcolor=Board[i][j][0]? Board[i][j][1]:BkGndColor;setfillstyle(SOLID_FILL,fillcolor);floodfill(BoardLeft+i*CellSize+CellSize/2,BoardTop+j*CellSize+CellSize/2,BorderColor);}}}/* check if one line if filled full and increase the totalScore! */ void_INNER_HELPERCheckBoard(){int i,j,k,score=10,sum=0,topy,lines=0;/* we find the top empty line!*/j=topy=BoardHeight-1;do{sum=0;for(i=0;i<BoardWidth;i++){sum+=Board[i][topy][0];}topy--;} while(sum>0&& topy>0);/* remove the full filled line (max remove lines count = 4) */ do{sum=0;for(i=0;i<BoardWidth;i++)sum+=Board[i][j][0];if(sum==BoardWidth)/*we find this line is full filled, remove it!*/{/* move the cells data down one line*/for(k=j;k > topy;k--){for(i=0;i<BoardWidth;i++){Board[i][k][0]=Board[i][k-1][0];Board[i][k][1]=Board[i][k-1][1];}}/*make the top line empty!*/for(i=0;i<BoardWidth;i++){Board[i][topy][0]=0;Board[i][topy][1]=0;}topy++;/* move the topline downward one line!*/lines++;/* lines <=4 */TotalScore+=score;score*=2;/* adding: 10, 30, 70, 150 */}elsej--;} while(sum>0 && j>topy&& lines<4);/* speed up the game when score is high, minimum is 400 */FrameTime=max(1200-100*(TotalScore/200),400);TopLine=topy;/* update the top line*//* if no lines remove, only add 1: */if(lines==0)TotalScore++;}/* display the score */void_INNER_HELPERDisplayScore(){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 when a block is inactive. */ voidUpdateBoard(){FillBoardData();CheckBoard();PaintBoard();DisplayScore();}/* pause the game, and timer handler stop move down the block!*/ int PauseGame(){int key=0;DisplayInfo("Press P to Start or Resume!");while(key!=K_P && key!=K_ESC){while(!(key=GetKeyCode())){}}DisplayInfo(info_help);return key;}/* quit the gameand do cleaning work.*/void QuitGame(){closegraph();}/* the entry point function. */void main(){int i,flag=1,j,key=0,tick=0;InitGame();if(PauseGame()==K_ESC)goto GameOver;/* wait until a key pressed */while(key!=K_ESC){/* wait until a key pressed */while(!(key=GetKeyCode())){tick++;if(tick>=FrameTime){/* our block has dead! (can't move down), we get next block*/if(!MoveBlock(&curBlock,0,1)){UpdateBoard();NextBlock();if(!CanMove(0,1))goto GameOver;}tick=0;}delay(100);}switch(key){case K_LEFT:MoveBlock(&curBlock,-1,0);break;case K_RIGHT:MoveBlock(&curBlock,1,0);break;case K_DOWN:MoveBlock(&curBlock,0,1);break;case K_UP:RotateBlock(&curBlock);break;case K_SPACE:DropBlock(&curBlock);break;case K_P:PauseGame();break;}}GameOver:DisplayInfo("GAME OVER! Press any key to exit!");getch(); /* wait the user Press any key.*/QuitGame();}测试计划1.1 测试方案本游戏的测试方法采用检查各个功能能否实现的方法1.2 测试项目及功能控制区开始:实现游戏的开始暂停:实现游戏暂停继续:实现游戏继续提高级数 : 提高级数增加游戏的难度降低级数:降低级数减小游戏的难度菜单区新游戏:游戏结束从新开始新一轮的游戏提高级数:提高游戏难度降低级数:减小游戏难度退出:退出游戏开始:开始游戏暂停:暂停正在进行的游戏从新开始:重新开始游戏停止:停止正在进行的游戏帮助信息:游戏控制键显示区:显示俄罗斯方块提前显示窗口:显示下一个方块的样式测试进度:本游戏在我和同组李帅同学的辛苦努力下用了半天的时间完成了1.3 测试准备编写相应的驱动模块,并精心设计测试用例1.4 测试机构测试人员 :王新勃职责:找出程序中的错误,实现游戏的功能1.5 测试项目说明测试 1:名称:控制区功能测试目的:测试控制区各个功能的按钮。