C语言编写俄罗斯方块实验报告
c++俄罗斯方块程序实习报告
![c++俄罗斯方块程序实习报告](https://img.taocdn.com/s3/m/79087acf3c1ec5da50e2709e.png)
程序实习报告学号:姓名:专业:班级:指导教师:通信与电子工程学院2013年7月5日实习报告一窗口程序基本练习一.实习时间:6月25日地点:207机房二.实习过程:1.了解Windows窗口程序的基本情况。
我们这里的Windows窗口的建立需要在VC++的环境里实现,因此就需要Visual C++ Windows程序的两种方式去得到我们需要的新建的windows窗口。
:2. 窗口程序运行的过程如下:得到应用程序的句柄→注册窗口类(RegisterClassEx)→建立窗口(CreateWindowEx)→显示窗口(ShowWindows)→刷新窗口客户区(UpdateWindow)→进入无限的消息获取和处理的循环(GetMessage DispatchMessage)。
3调试运行。
调试的结果是出现一个windows的窗口。
三.实习结果:通过学习老师给的这个程序代码,知道了在建立一个窗口的时候所必需的一些程序代码。
刚开始的时候得到的运行结果是一个和其他同学一样的窗口,在分析了这些代码的意义之后,经过自己的改编,可以得到一个自己需要的长度高度的窗口。
这为接下来的实验打下了基础。
实习报告二消息驱动程序练习一.实习时间:6月26日。
地点:207机房。
二.实习过程:1.在实习一的基础上,学习绘制一些简单的图形。
2.调试老师给的程序代码,并学习代码。
在了解的基础上,改变所给的方块的大小形状颜色位置等。
3.因为最终的任务是编写俄罗斯方块的程序,因此就在老师所给的这些方块的基础上经过自己的研究,绘制了俄罗斯方块游戏中的七种不同的形状。
将以下的程序进行改编void Rect(COLORREF crColor){int i,j;for(i=0;i<20;i++)for(j=0;j<20;j++)SetPixel(hdc, X*20+j,Y*20+ i, crColor);改编的程序如下void Rect(COLORREF crColor){int i,j;for(i=0;i<20;i++)for(j=0;j<20;j++)SetPixel(hdc, X*20+j,Y*20+ i, crColor);for(i=21;i<41;i++)for(j=0;j<20;j++)SetPixel(hdc, X*20+j,Y*20+ i, crColor);for(i=42;i<62;i++)for(j=0;j<20;j++)SetPixel(hdc, X*20+j,Y*20+ i, crColor);for(i=63;i<83;i++)for(j=0;j<20;j++)SetPixel(hdc, X*20+j,Y*20+ i, crColor);}得到的是俄罗斯方块中的四个一排的图形。
C语言编写俄罗斯方块实验报告
![C语言编写俄罗斯方块实验报告](https://img.taocdn.com/s3/m/91e1d64317fc700abb68a98271fe910ef02dae4c.png)
C语言编写俄罗斯方块实验报告实验报告一、实验目的实践C语言的基本语法和操作,测试自己对C语言的熟练程度,实现俄罗斯方块游戏的基本功能。
二、实验步骤1.定义游戏界面:使用二维数组定义游戏界面,用字符来表示方块的状态(空白、正在下落的方块、已经固定的方块)。
2.实现方块的生成和选择:定义方块的类型,通过随机数生成下一个方块,用一个变量来保存下一个方块的类型,并在游戏界面上进行展示。
3.实现方块的下落和移动:方块可以通过用户的操作左右移动和旋转,同时也会自动下落,每当方块到达底部或者碰到已经固定的方块时,就会停止下落。
4.实现方块的旋转:将方块表示为二维数组,通过改变数组元素的位置实现方块的旋转。
5.实现方块的消除:当一行方块被填满时,该行会消除,并且上面的方块会下落填充空缺。
三、实验结果成功实现了俄罗斯方块的基本功能,可以进行游戏的开始、暂停、重新开始、结束等操作。
在游戏过程中,方块可以通过键盘的方向键左右移动,通过按下空格键进行快速下落,通过旋转方向键进行方块的旋转。
当方块都不能下落时,游戏结束,会提示游戏结束的信息,并显示最终得分。
四、实验总结通过本次实验,我进一步了解了C语言的基本语法和操作,也体验到了编程的乐趣。
通过这个实验,我对C语言有了更深入的理解,在实现俄罗斯方块的过程中锻炼了自己的逻辑思维能力和编程能力。
同时,我也学会了如何进行代码的调试和优化,使得程序的运行更加流畅和高效。
在后续的学习中,我将更加深入地学习C语言的高级特性,不断提升自己的编程水平。
通过不断的实践和练习,我相信我可以在C语言编程方面取得更进一步的进展,完成更加复杂和有挑战性的任务。
总体而言,本次实验收获颇多,不仅提高了我的编程能力,也为我的学习之路打下了良好的基础。
我相信在今后的学习和工作中,这些经验将会成为我不断进步的动力和宝贵的财富。
俄罗斯方块C语言程序设计报告
![俄罗斯方块C语言程序设计报告](https://img.taocdn.com/s3/m/2768d07edcccda38376baf1ffc4ffe473368fd3b.png)
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 程序设计实训报告_俄罗斯方块(1)
![C 程序设计实训报告_俄罗斯方块(1)](https://img.taocdn.com/s3/m/11719929aeaad1f347933f6f.png)
C#程序设计实训报告题目:俄罗斯方块专业____计算机科学与技术 _年级班别___ 计算机09-2班__学号学生姓名_____ _______指导教师_成绩2012 年 1 月目录一系统设计要求 (3)1.1 课题分析........................................................................ 错误!未定义书签。
1.2 设计环境 (3)1.3 设计思路 (3)二课题总体框架设计 (3)2.1程序流程图 (4)2.2类的结构图 (5)三课题实现 (6)3.1程序主界面 (6)3.2 开始游戏界面 (6)3.3 游戏结束界面 (7)3.4 暂停游戏界面 (7)3.5使用说明界面 (8)3.6 关键程序代码 (8)四总结 (21)4.1设计总结 (21)4.2 设计体会 (22)一、系统设计要求1.1课题分析本游戏系统是利用C#实现的,是制作为我们所熟悉的非常简单的俄罗斯方块游戏,该系统能实现的具体功能如下:1).能简便的开始游戏,游戏中的方块的功能与日常我们所熟悉的游戏的功能一致,各种块的设置也一致,包括方块的旋转,加速下降,左右移动,满行消去,满行消去自动加分,以及到顶游戏结束等功能;2).能够通过对话框窗体说明各个功能的使用说明,以及一些其他功能。
3).界面简洁美观,简单易用。
跟其他一般的游戏相差不大。
1.2设计环境本程序选择Visual Studio 2010作为实验环境。
1.3 设计思路用面向对象的方法分析系统对于俄罗斯方块的程序制作,我们可以定义一个或者几个类,专门来描述俄罗斯方块,在这个类中,包含与之相关的方法、属性和字段,通过封装,实现其业务逻辑。
其中,每一个俄罗斯方块都有相同的特征,由4个小正方形构成,有旋转,左右移动,下落的动作,整行被填满除去并计算分数而构成行的小正方体块。
基中块的形状类型有7种:田、一、L、倒L、Z、倒Z、上。
C#俄罗斯方块实验报告
![C#俄罗斯方块实验报告](https://img.taocdn.com/s3/m/31aec106a76e58fafab0036b.png)
4.游戏逻辑架构
俄4.罗
游戏逻辑架构
斯方块游戏
开
设
查
始
置
看
模
模
得
块
块
分
开
暂
退
始
停
出
速
背
度
景
5. 主要功能模块
开始游戏:
点击后游戏开始执行;
退出游戏:
点击后退出游戏;
暂停游戏:
点击后游戏暂停在即时状态;
加快速度、减慢速度: 落速度的快慢;
用于控制方块下
游戏成绩: 游戏速度:
显示当前游戏成绩; 显示当前方块下落速度;
俄罗斯方块实验报
一、 实验课题概述 1. 实验课题描述 俄罗斯方块是一个经典的小游戏,简单而有趣,但俄罗斯方块的设计 工作复杂且富有挑战性,它包含的内容多,涉及的知识广泛,与图形 界面联系较大,包括界面的显示与更新、数据收集等,在设计的过程 中,必将运用到各方面的知识,这对于 C#语言设计者而言,是个很 好的锻炼机. 2. 课题主要任务 设计者首先要对游戏窗口进行合理规划和设计,尽量做到美观实用 (颜色搭配以及各个模块的位置),其次,也是最重要的,就是设计 者对整个程序代码的编辑,以实现游戏应有的功能。 3. 课题基本要求 不仅要求设计出的游戏能实现功能而且要使游戏的操作方便界面赏 心悦目。 4. 自己主要任务 设计者的主要任务就是完成对游戏窗口的设计和程序代码的编辑。 二、 实验课题设计 1. 课题需求分析 首先,设计者必须对俄罗斯方块有一定的了解,熟悉游戏的内容;再 者,设计者必须熟练掌握 C#语言并且熟悉 Visual Studio 2008(2010 也 可以)的开发环境,能够处理好各个类之间的集成关系和继承机制,
C语言课程设计(俄罗斯方块)
![C语言课程设计(俄罗斯方块)](https://img.taocdn.com/s3/m/25c6c2bf0029bd64783e2c34.png)
实训报告实训名称:C语言课程设计(俄罗斯方块)院系:计算机科学与工程学院专业:物联网工程班级:152学号:092615219姓名:姚锋指导教师:靳颜清开课时间:2015 至2016 学年短学期一、需求分析1.1 需求概述1.11市场需求:俄罗斯方块游戏是一个经典的小游戏,由于它操作简单,上到老人、下到小孩都可以玩,曾广受人们欢迎。
现在游戏之风盛行,一款款画面精美、音乐动听的大型游戏就在我们身边,但需要投入大量的人力、物力去开发,还需要发大量的精力去玩,而且特别容易上瘾。
现在的人,也许大都不屑于玩俄罗斯方块这种“弱智”的游戏,但仔细观察,我们身边还是有人玩这个的。
俄罗斯方块也确实是一个很不错的休闲游戏。
1.12 对功能需求:功能界面:游戏开始,音乐响起,让人感觉到是一种享受,这时,由计算机随机产生所定义的图形,记录所产生的图形的形状的数目,无操作时,方块竖直缓慢下落,图形在接触障碍物之前,可以由键盘控制向左右下移动,向下加速或翻转,可以进行暂停,当某一行被下落的方块填满后消除并计分。
1.2 功能简介1.21.随机产生俄罗斯方块图形1.22.方向键和wasdrz实现下落方块的左移、右移、加速下落、变形、交换等基本操作1.23.正确判断游戏结束1.24.对游戏成绩进行记分注:运行环境 windows 7 控制台(80 * 43);二、总体设计2.1 开发环境与工具开发环境:CodeBlocks工具:prosesson2.2 游戏总模块流程图(见图2.2)图2.2 游戏总模块流程图三、详细设计3.1 模块介绍(创建,预览下一个方块和删除方块模块)3.11 开始动画和文字显示(见图3.11)图 3.11 开始动画在本模板下,首先在界面底部会同时出现两个简单的小人迎面相遇,接着,过程中会等待按键触发,等待过程中Tetris字样会进行颜色变化,实现闪动效果,按任意键即可开始游戏。
3.12 随机创建方块的代码函数名: int creat_block()函数描述:制作方块函数函数功能:实现俄罗斯方块制作方块的功能输入: NULL输出: NULL备注:实现方块的制作在本模块下,我们要完成当前方块的创建和下一个方块的提前创建与预览。
C++俄罗斯方块实验报告(附实验体会)
![C++俄罗斯方块实验报告(附实验体会)](https://img.taocdn.com/s3/m/77495e3df111f18583d05aff.png)
程序设计综合实验设计文档惠州学院HUIZHOUUNIVERSITY课程名称:程序设计综合实验姓名:实验名称:俄罗斯方块学号:任课教师:专业:计算机科学与技术班级:计算机科学与技术1班实验时间:第一周至第十二周实验成绩:批阅教师签字:综合实验项目:俄罗斯方块游戏1、问题需求(1)游戏等级:游戏分为1-10十个等级,等级越高,方块下落速度越快;(2)由方向键控制游戏:上键控制方块变形、下键控制方块下移并判断是否有消行、左键控制方块左移、右键控制方块右移;(3)游戏积分:一次性消的行数越多加的分数越多,当消行每超过30行自动提高一个游戏等级。
2、总体设计:(1)用数组存放方块(2)输出地图(3)在地图里面输出方块(4)开始游戏(5)方块的旋转(6)方块是否能下落(7)判断方块是否能下落(8)提示下一个即将下落的方块(9)控制方块的下落速度(10)分成10等级,等级越高方块下落得更快(11)消行处理(12)游戏结束3、详细设计设计说明:本程序运行代码如下:#include <conio.h>#include <stdlib.h>#include <windows.h>#include "colorConsole.h"#define SQUARE_COLOR FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY //方块的颜色#define up 72#define down 80#define left 75#define right 77#define esc 27#define MAPW 12 //地图的宽度#define MAPH 20 //地图的高度BOOL isavailable(int a[],int x,int y,int w,int h); //判定是否能放下void turn(int a[][4],int w,int h,int *x,int y); //转动int * create(); //创建方块void init(); //初始化工作void drawblocks(int a[],int w,int h,int x,int y,WORD wColors[],int nColors); void clearcache(); //清除键盘缓冲区void end();void clearsquare(int *a,int w,int h,int x,int y);void gameover();void deletemap(int m[][MAPW],int row,int w,int h); //消除一行int dx=30,dy=5; //屏幕上的偏移量int score=0,level=0;int map[MAPH][MAPW];int a1[4][4]={{1},{1,1,1}};int a2[4][4]={{0,1},{1,1,1}};int a3[4][4]={{1,1},{0,1,1}};int a4[4][4]={{0,0,1},{1,1,1}};int a5[4][4]={{0,1,1},{1,1}};int a6[4][4]={{1,1,1,1}};int a7[4][4]={{1,1},{1,1}};int a[4][4];int main(){init();int *b=NULL;b=create(); //预创建方块int q=0;int sign,blank,x,y;while(1){for(int i=0;i<4;i++) //复制方块for(int j=0;j<4;j++)if(a[i][j]=*(b+i*4+j)) blank=i;y=1-blank;x=4;clearsquare(&a[0][0],4,4,13,13);b=create();HANDLE handle;handle=initiate();WORD wColors[1]={FOREGROUND_RED| FOREGROUND_GREEN|FOREGROUND_INTENSITY };drawblocks(b,4,4,13,13,wColors,1);wColors[0]=SQUARE_COLOR;drawblocks(&a[0][0],4,4,x,y,wColors,1);clearcache();char string[5];wColors[0]=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY;textout(handle,26+dx,5+dy,wColors,1,itoa(score,string,10));textout(handle,26+dx,9+dy,wColors,1,itoa(level,string,10));sign=1;while(sign){int delay=0,max_delay=100-10*level; //延迟量while(delay<max_delay){if(_kbhit()) //用if避免按住键使方块卡住{int draw=0;int key=_getch();switch (key){case up:clearsquare(&a[0][0],4,4,x,y);turn(a,4,4,&x,y);draw=1;break;case down:delay=max_delay;break;case left:if(isavailable(&a[0][0],x-1,y,4,4)){clearsquare(&a[0][0],4,4,x,y);x--;draw=1;}break;case right:if(isavailable(&a[0][0],x+1,y,4,4)){clearsquare(&a[0][0],4,4,x,y);x++;draw=1;}break;case esc:end();break;}if(draw){HANDLE handle;handle=initiate();WORD wColors[1]={SQUARE_COLOR};drawblocks(&a[0][0],4,4,x,y,wColors,1);draw=0;}}_sleep(8);delay++;}if(isavailable(&a[0][0],x,y+1,4,4)) //判断是否能下移{clearsquare(&a[0][0],4,4,x,y);y++;HANDLE handle;handle=initiate();WORD wColors[1]={SQUARE_COLOR};drawblocks(&a[0][0],4,4,x,y,wColors,1);}else{sign=0; //标记,使跳出while(sign) 循环,产生新方块if(y<=1) gameover(); //是否结束for(int i=0;i<4;i++) //放下方块for(int j=0;j<4;j++)if(a[i][j]&&((i+y)<MAPH-1)&&((j+x)<MAPW-1))map[i+y][j+x]=a[i][j];int full,k=0;for(i=y;i<min(y+4,MAPH-1);i++){full=1;for(int j=1;j<11;j++)if(!map[i][j]) full=0;if(full) //消掉一行{deletemap(map,i,MAPW,MAPH);k++;q++;score=score+k;level=min(q/30,9);}}}}}return EXIT_SUCCESS;}BOOL isavailable(int a[],int x,int y,int w,int h){for(int i=max(y,1);i<y+h;i++)for(int j=x;j<x+w;j++)if(map[i][j]&&a[w*(i-y)+j-x])return 0;return 1;}int * create(){int * a=NULL;int c=rand()%7;switch(c){case 0:a=&a1[0][0];break;case 1:a=&a2[0][0];break;case 2:a=&a3[0][0];break;case 3:a=&a4[0][0];break;case 4:a=&a5[0][0];break;case 5:a=&a6[0][0];break;case 6:a=&a7[0][0];break;}return a;}void init() //初始化工作{for(int i=0;i<20;i++){map[i][0]=-2;map[i][11]=-2;}for(i=0;i<12;i++){map[0][i]=-1;map[19][i]=-1;}map[0][0]=-3;map[0][11]=-3;map[19][0]=-3;map[19][11]=-3;HANDLE handle;handle=initiate();WORD wColors[1]={ FOREGROUND_GREEN|FOREGROUND_INTENSITY};textout(handle,26+dx,3+dy,wColors,1,"分数");textout(handle,26+dx,7+dy,wColors,1,"等级");textout(handle,26+dx,11+dy,wColors,1,"下一个方块提示");wColors[1]=FOREGROUND_RED|FOREGROUND_INTENSITY;drawblocks(&map[0][0],12,20,0,0,wColors,1);textout(handle,dx,dy,wColors,1,"◇══════════◇");wColors[0]= FOREGROUND_GREEN|FOREGROUND_INTENSITY;textout(handle,dx-16,dy,wColors,1,"按任意键开始");wColors[0]=FOREGROUND_RED|FOREGROUND_INTENSITY ;textout(handle,dx-15,dy+3,wColors,1,"制作者");wColors[0]=FOREGROUND_BLUE| FOREGROUND_GREEN|FOREGROUND_INTENSITY ;textout(handle,dx-15,dy+5,wColors,1,"赵强");int x=_getch();srand(x);textout(handle,dx-16,dy,wColors,1," ");}void drawblocks(int a[],int w,int h,int x,int y,WORD wColors[],int nColors){HANDLE handle;handle = initiate();int temp;for(int i=0;i<h;i++)for(int j=0;j<w;j++)if((temp=a[i*w+j])&&y+i>0){if(temp==-3)textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"◆");else if(temp==-2)textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"║");else if(temp==-1)textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"═");else if(temp==1)textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"■");}}void clearcache(){while(_kbhit()){_getch();}}void end(){exit(EXIT_SUCCESS);}void turn(int a[][4],int w,int h,int *x,int y){int b[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};int sign=0,line=0;for(int i=h-1;i>=0;i--){for(int j=0;j<w;j++)if(a[i][j]){b[j][line]=a[i][j];sign=1;}if(sign){line++;sign=0;}}for(i=0;i<4;i++)if(isavailable(&b[0][0],*x-i,y,w,h)){*x-=i;for(int k=0;k<h;k++)for(int j=0;j<w;j++)a[k][j]=b[k][j];break;}}void clearsquare(int *a,int w,int h,int x,int y){HANDLE handle;handle=initiate();WORD wColors[1]={SQUARE_COLOR};for(int i=0;i<h;i++)for(int j=0;j<w;j++)if(a[i*w+j]&&i+y>0)textout(handle,2*(x+j)+dx,y+i+dy,wColors,1," "); }void gameover(){HANDLE handle;handle=initiate();WORD wColors[1]={FOREGROUND_RED| FOREGROUND_GREEN};textout(handle,7+dx,10+dy,wColors,1,"游戏结束");clearcache();_getch();exit(EXIT_SUCCESS);}void deletemap(int m[][MAPW],int row,int w,int h){HANDLE handle;handle=initiate();WORD wColors[1]={SQUARE_COLOR};textout(handle,2+dx,row+dy,wColors,1,"﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌");_sleep(100);for(int i=row;i>1;i--){clearsquare(&m[i][1],MAPW-2,1,1,i);for(int j=1;j<MAPW-1;j++)m[i][j]=m[i-1][j];drawblocks(&m[i][1],MAPW-2,1,1,i,wColors,1);}for(i=1;i<MAPW-1;i++)m[1][i]=0;}HANDLE initiate(){HANDLE hOutput;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);return hOutput;}BOOL textout(HANDLE hOutput,int x,int y,WORD wColors[],int nColors,LPTSTR lpszString){DWORD cWritten;BOOL fSuccess;COORD coord;coord.X = x; // start at first cellcoord.Y = y; // of first rowfSuccess = WriteConsoleOutputCharacter(hOutput, // screen buffer handlelpszString, // pointer to source stringlstrlen(lpszString), // length of stringcoord, // first cell to write to&cWritten); // actual number writtenif (! fSuccess)cout<<"error:WriteConsoleOutputCharacter"<<endl;for (;fSuccess && coord.X < lstrlen(lpszString)+x; coord.X += nColors){fSuccess = WriteConsoleOutputAttribute(hOutput, // 屏幕缓存处理wColors, // pointer to source stringnColors, // length of stringcoord, // first cell to write to&cWritten); // actual number written }if (! fSuccess)cout<<"error:WriteConsoleOutputAttribute"<<endl;return 0;}4、程序运行结果截图:按任意键游戏开始方块左移方块右移下一个方块开始下落方块变形消一行,增加1分成功消多行消多行后分数增加更多消完30行后,提升一个等级方块叠到顶端后游戏结束5、程序使用说明:(1)按任意键开始游戏(2)控制方块下落位置进行消行处理(3)成功消行后加分,当消30行之后等级升一级,最高达到10等级(4)当产生的新方块不能再下落时,游戏结束。
C语言俄罗斯方块试验报告,包括源程序
![C语言俄罗斯方块试验报告,包括源程序](https://img.taocdn.com/s3/m/e60c4100866fb84ae45c8d94.png)
stopL()检测方块可左移则方块向左移一小格,向右方向键并且 stopR()检测方块可右移则方块向右移一
小格,向下方向键则方块向下移一小格,空格键则直接下移。
D. 消行与计分模块
当一个方块不能移动时需调用本模块 clrLine()。本模块将从该方块的最下面小方格所在行开始到最
上面小方格所在行结束,从左到右判断每一行是否满行;若满行则消行并且下移该行以上的已填充的小
(以下简称窗口M),高为 210 像素,宽为 120 像素,即由 252(21x12)个 10X10 的小方格组成。右
下的小窗口为绿色,主要显示游戏所用的时间、所得分数、所属级别。
2.方块的实现
首先说一下函数 fangKuai()与函数 clrFangKuai()。函数 fangKuai()在指定位置产生边框为蓝色用白
级,300 分到 700 分为 1 级,依此类推,1800 分到 2500 分为 4 级,超过 2500 分为 5 级。可以看到,除
了每一级要求的分数都比上一级多 100 分外,方块的自动下移速度也加快(0 级的 1/13)以增加游戏的
挑战性。
E. 计时模块
本模块主要是计算游戏所用的时间,由函数 coutTime()完成。游戏开始后,首先用 time(0)取得当前
色 WHITE 填充 的小 方格。 函数 clrFangKuai() 在指 定位 置产生 边框 与填充 色都 是窗口 M的 背景色
DARKGRAY 的小方格。
其次说方块的产生与清除。各方块及其顺时针旋转变换而来的方块统一在 16(=4X4)个小方格的
窗口(以下简称窗口L)中用4个小方格表示,建立基于窗口L的坐标系:窗口L左上角的小方格为
实验内容 游戏程序----俄罗斯方块
C语言编写俄罗斯方块实验报告
![C语言编写俄罗斯方块实验报告](https://img.taocdn.com/s3/m/f07676ee770bf78a65295462.png)
`````````学院:数计学院班级:13级数媒班学号:姓名:摘要……………………………………………………………………………………………………..关键字:目录第一部分设计总概........................................................................................................................... 摘要…………………………………………………………………………………………………一、设计目的.............................................................................................................................二、设计要求.............................................................................................................................三、设计内容.............................................................................................................................四、系统分析与设计................................................................................................................. 第二部分数据结构设计................................................................................................................... 第三部分功能实现与程序调试………………………………………………………………….第四部分完成设计...........................................................................................................................一、实习日记.............................................................................................................................二、实习总结.............................................................................................................................三、教师评语.............................................................................................................................四、程序使用说明书………………………………………………………………………….第一部分设计总概一、设计目的二、设计要求三、设计内容四、系统分析与设计第二部分数据结构设计第三部分功能实现与程序调试第四部分完成设计一、实习日记:二、实习总结:………………………三、教师评语:设计成绩:指导老师签名:摘要使用C语言编写一个俄罗斯方块游戏系统,要求程序运行后有一个图形用户界面,实现各种方块的生产,包括形状和颜色等信息,完成左右下旋转的功能,在消行的同时分数加10,在点击暂停或者按下空格的时候暂停或开始游戏,最后结束游戏.关键字:音乐、背景、按键控制、暂停、继续、停止,难度级别第一部分设计总概一、设计目的:本课程设计是一个综合性的实践教学环节,目的在于促进学生复习和巩固计算机软件设计知识,加深对软件设计方法、软件设计技术和设计思想的理解,并能运用所学知识进行开发。
vc++俄罗斯方块
![vc++俄罗斯方块](https://img.taocdn.com/s3/m/7635753a376baf1ffc4fadf9.png)
西安科技大学计算机学院VC++程序设计实验报告----俄罗斯方块一、实验内容用VC++设计与实现俄罗斯方块游戏,并根据实验指导书和所学知识实现双人游戏,并完善游戏,使其更加美观好玩。
二、设计思路1、分析游戏需求,随机给出不同的形状下落填充给定的区域,若填满一条便消掉,记分,设计同的游戏难度,即方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。
2、设计游戏的矩形框类CBin和砖块类CBrick。
3、进行可视化设计,定义成员变量,添加相应的函数代码。
4、添加相应的代码,实现双人游戏模式。
5、完善游戏,如实现砖块的三维化,解决屏幕闪烁的问题,使游戏更美观。
三、代码实现(1)成员变量:CBin *bin; //游戏指针框架CBin *bin2;CBrick *activeBrick; //定义只想当前下落砖块的指针CBrick *activeBrick2;int gameOver; //判断游戏结束与否int gameOver2;int brickInFlight; //判断砖块是否处于下落状态int brickInFlight2;int brickType; //砖块类别int brickType2;unsigned int initOrientation; //初始状态unsigned int initOrientation2;int notCollide; //冲突否int notCollide2;unsigned int numLines; //消得行数unsigned int numLines2;unsigned char **outputImage;unsigned char **outputImage2;int difficulty; //定义难度int difficulty2; //定义难度(2)成员函数:void CNewTetrisView::DrawImage(CBin *bin, unsigned char **image,CBin* bin2,unsigned char**image2,CDC *pDC){unsigned int width,i,j;unsigned int height;unsigned int width2,height2;width = bin->getWidth();height = bin->getHeight();width2=bin2->getWidth();height2=bin2->getHeight();int nSize = 20;CRect rect;GetClientRect(&rect);pDC->FillSolidRect(rect, RGB(200, 50, 0));pDC->Rectangle(0, 0, 200, 400);pDC->Rectangle(500,0,700,400);char buf[100];sprintf(buf, "分数: %d", numLines*10);pDC->TextOut(220, 20, buf);char buf2[100];sprintf(buf2,"分数:%d",numLines2*10);pDC->TextOut(420,20,buf2);CRect rc;COLORREF BrickColor[8] = {0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0x00FFFF, 0xFFFF00, 0x800000, 0x8000080};for(i=0;i<height;i++){for(j=0;j<width;j++){rc=CRect(j*nSize,i*nSize,(j+1)*nSize,(i+1)*nSize);//绘制面板if(image[i][j]!=0){pDC->FillRect(rc, &CBrush(BrickColor[image[i][j]]));pDC->Draw3dRect(rc, GetLightColor(BrickColor[image[i][j]]), GetDarkColor(BrickColor[image[i][j]]));}}}for(i=0;i<height2;i++){for(j=0;j<width2;j++){rc=CRect(j*nSize+500,i*nSize,(j+1)*nSize+500,(i+1)*nSize);//绘制面版if(image2[i][j]!=0){pDC->FillRect(rc,&CBrush(BrickColor[image2[i][j]]));pDC->Draw3dRect(rc,GetLightColor(BrickColor[image2[i][j]]),GetDarkColor(BrickColor[image2[i ][j]]));}}}}void CNewTetrisView::OnGameStart(){// TODO: Add your command handler code heregameOver=0;brickInFlight=0;numLines=0;for(unsigned int i =0;i<20;i++){for(unsigned int j=0;j<10;j++)outputImage[i][j] = 0;}bin->setImage(outputImage);gameOver2=0;brickInFlight2=0;numLines2=0;for(i=0;i<20;i++){for(unsigned int j=0;j<10;j++)outputImage2[i][j]=0;}// activeBrick=new CIBrick;// activeBrick2=new CIBrick;bin2->setImage(outputImage2);SetTimer(0,difficulty,NULL);}void CNewTetrisView::OnDiffEasy(){// TODO: Add your command handler code heredifficulty = 500;difficulty2 = 500;OnGameStart();}void CNewTetrisView::OnDiffMid(){// TODO: Add your command handler code heredifficulty = 350;difficulty2 = 350;OnGameStart();}void CNewTetrisView::OnDiffSup(){// TODO: Add your command handler code heredifficulty = 150;difficulty2 = 150;OnGameStart();}void CNewTetrisView::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call default unsigned int binWidth, binHeight,binWidth2, binHeight2;unsigned int i=0;unsigned int j=0;CDC *pDC=GetDC();binWidth=bin->getWidth();binHeight=bin->getHeight();binWidth2=bin2->getWidth();binHeight2=bin2->getHeight();//start the gameif(!brickInFlight&&!gameOver){brickType = (rand() % NUM_BRICK_TYPES) + 1;initOrientation = (unsigned int)(rand() % 4);//防止rand函数每次运行结果一样/*CTime time = CTime::GetCurrentTime();int q = int(time.GetSecond());brickType = (q % NUM_BRICK_TYPES) + 1;initOrientation = (unsigned int)(q % 4);*/// CTime time=CTime::GetCurrentTime();if(brickType == 1)activeBrick = new CIBrick;else if(brickType == 2)activeBrick = new CLBrick;else if(brickType == 3)activeBrick = new CSBrick;else if(brickType == 4)activeBrick = new COBrick;else if(brickType == 5)activeBrick = new CMBrick;activeBrick->setColour((unsigned char)brickType);activeBrick->putAtTop(initOrientation, binWidth/2);notCollide = activeBrick->checkCollision(bin);if(notCollide){brickInFlight = 1;bin->getImage(outputImage);activeBrick->operator>>(outputImage);Invalidate(FALSE);}else{gameOver=1;delete activeBrick;brickInFlight=0;}}if(brickInFlight&&!gameOver){notCollide = activeBrick->shiftDown(bin);if(notCollide){bin->getImage(outputImage);activeBrick->operator>>(outputImage);}else{brickInFlight = 0;bin->getImage(outputImage);activeBrick->operator>>(outputImage);bin->setImage(outputImage);Invalidate(FALSE);numLines = numLines + bin->removeFullLines();bin->getImage(outputImage);}Invalidate(FALSE);if(gameOver){KillTimer(0);if(MessageBox("输了吧,还玩么","提示",MB_YESNO) == IDYES) OnGameStart();elsePostQuitMessage(0); //这两种方法都可以退出程序}if(!brickInFlight2&&!gameOver2){brickType2= (rand() % NUM_BRICK_TYPES) + 1;initOrientation2 = (unsigned int)(rand() % 4);//防止rand函数每次运行结果一样/*CTime time = CTime::GetCurrentTime();int q = int(time.GetSecond());brickType = (q % NUM_BRICK_TYPES) + 1;initOrientation = (unsigned int)(q % 4);*/if(brickType2 == 1)activeBrick2 = new CIBrick;else if(brickType2 == 2)activeBrick2 = new CLBrick;else if(brickType2 == 3)activeBrick2 = new CSBrick;else if(brickType2 == 4)activeBrick2 = new COBrick;else if(brickType2 == 5)activeBrick2 = new CMBrick;activeBrick2->setColour((unsigned char)brickType2);activeBrick2->putAtTop(initOrientation2, binWidth2/2);notCollide2 = activeBrick2->checkCollision(bin2);if(notCollide2){brickInFlight2 = 1;bin2->getImage(outputImage2);activeBrick2->operator>>(outputImage2);Invalidate(FALSE);}else{gameOver2=1;delete activeBrick2;brickInFlight2=0;}if(brickInFlight2&&!gameOver2){notCollide2 = activeBrick2->shiftDown(bin2);if(notCollide2){bin2->getImage(outputImage2);activeBrick2->operator>>(outputImage2);}else{brickInFlight2 = 0;bin2->getImage(outputImage2);activeBrick2->operator>>(outputImage2);bin2->setImage(outputImage2);Invalidate(FALSE);numLines2=numLines2+bin2->removeFullLines();bin2->getImage(outputImage2);}Invalidate(FALSE);}if(gameOver2){KillTimer(0);if(MessageBox("输了吧,还玩么","提示",MB_YESNO) == IDYES) OnGameStart();elsePostQuitMessage(0); //这两种方法都可以退出程序}CView::OnTimer(nIDEvent);}void CNewTetrisView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {// TODO: Add your message handler code here and/or call default if(nChar==VK_RIGHT)activeBrick->shiftRight(bin);else if(nChar==VK_LEFT)activeBrick->shiftLeft(bin);else if(nChar==VK_UP)activeBrick->rotateClockwise(bin);else if(nChar==VK_DOWN)activeBrick->shiftDown(bin);if(nChar==68)activeBrick2->shiftRight(bin2);else if(nChar==65){activeBrick2->shiftLeft(bin2);}else if(nChar==87){activeBrick2->rotateClockwise(bin2);}else if(nChar==83){activeBrick2->shiftDown(bin2);}Invalidate(FALSE);CView::OnKeyDown(nChar, nRepCnt, nFlags);}COLORREF CNewTetrisView::GetLightColor(COLORREF m_crBody) {BYTE r = GetRValue(m_crBody);BYTE g = GetGValue(m_crBody);BYTE b = GetBValue(m_crBody);r = r + COLOR_CHANGE > 255 ? 255 : r + COLOR_CHANGE;g = g + COLOR_CHANGE > 255 ? 255 : g + COLOR_CHANGE;b = b + COLOR_CHANGE > 255 ? 255 : b + COLOR_CHANGE;return RGB(r, g, b);}COLORREF CNewTetrisView::GetDarkColor(COLORREF m_crBody) {BYTE r = GetRValue(m_crBody);BYTE g = GetGValue(m_crBody);BYTE b = GetBValue(m_crBody);r = r - COLOR_CHANGE < 0 ? 0 : r - COLOR_CHANGE;g = g - COLOR_CHANGE < 0 ? 0 : g - COLOR_CHANGE;b = b - COLOR_CHANGE < 0 ? 0 : b - COLOR_CHANGE;return RGB(r, g, b);}void CNewTetrisView::OnGamePaush(){// TODO: Add your command handler code hereKillTimer(0);}void CNewTetrisView::OnGameContinue(){// TODO: Add your command handler code hereSetTimer(0,difficulty,NULL);}(3)添加的按键:Brick.cpp添加://CSBRICK//1int CSBrick::shiftLeft(CBin *bin){unsigned int posX;posX = getPosX();posX = posX - 1;setPosX(posX);if(checkCollision(bin) == 0){setPosX(posX + 1);return 0;}return 1;}//2int CSBrick::shiftDown(CBin *bin){unsigned int posY;posY = getPosY();posY = posY + 1;setPosY(posY);if(checkCollision(bin) == 0){setPosY(posY - 1);return 0;}return 1;}//3int CSBrick::shiftRight(CBin *bin){unsigned int posX;posX = getPosX();posX = posX + 1;setPosX(posX);if(checkCollision(bin) == 0){setPosX(posX - 1);return 0;}return 1;}//4int CSBrick::rotateClockwise(CBin *bin){unsigned int orientation,oldOrientation;orientation = getOrientation();oldOrientation = orientation;if(orientation == 3)orientation = 0;elseorientation = orientation + 1;setOrientation(orientation);if(checkCollision(bin) == 0){setOrientation(oldOrientation);return 0;}return 1;}//5int CSBrick::checkCollision(CBin *bin){unsigned int width;unsigned int height;unsigned char ** image;unsigned int orientation;unsigned int posX;unsigned int posY;width = bin->getWidth();height = bin->getHeight();image = new unsigned char *[height];for(unsigned int i = 0; i < height; i++) {image[i] = new unsigned char [width];}bin->getImage(image);orientation = getOrientation();posX = getPosX();posY = getPosY();//brick==0;if(orientation == 0){//out edge;if((posX < 1)||(posX + 1> width - 1)||(posY < 1)||(posY > height - 1)) return 0;//重叠if((image[posY - 1][posX] != 0)||image[posY][posX] != 0||(image[posY - 1][posX + 1] != 0)||(image[posY][posX - 1] != 0))return 0;}if(orientation == 1){if((posX + 1 < 1)||(posX + 1 > width - 1)||(posY < 1)||(posY + 1> height - 1)) return 0;if((image[posY][posX + 1] != 0)||image[posY - 1][posX] != 0||(image[posY][posX] != 0)||(image[posY + 1][posX + 1] != 0))return 0;}if(orientation == 2){if((posX < 1)||(posX + 1 > width - 1)||(posY + 1 < 1)||(posY + 1 > height - 1)) return 0;if((image[posY + 1][posX] != 0)||image[posY][posX + 1] != 0||(image[posY][posX] != 0)||(image[posY + 1][posX - 1] != 0))return 0;}if(orientation == 3){if((posX < 1)||(posX > width - 1)||(posY < 1)||(posY + 1 > height - 1)) return 0;if((image[posY][posX - 1] != 0)||image[posY][posX] != 0||(image[posY + 1][posX] != 0)||(image[posY - 1][posX - 1] != 0))return 0;}return 1;}//6void CSBrick::operator >>(unsigned char ** binImage){unsigned int orientation;unsigned int posX;unsigned int posY;unsigned char colour;posX = getPosX();posY = getPosY();orientation = getOrientation();colour = getColour();if(orientation == 0){binImage[posY - 1][posX] = colour;binImage[posY][posX] = colour;binImage[posY][posX - 1] = colour;binImage[posY - 1][posX + 1] = colour;}if(orientation == 1){binImage[posY][posX + 1] = colour;binImage[posY - 1][posX] = colour;binImage[posY][posX] = colour;binImage[posY + 1][posX + 1] = colour;}if(orientation == 2){binImage[posY + 1][posX - 1] = colour;binImage[posY][posX + 1] = colour;binImage[posY][posX] = colour;binImage[posY +1][posX] = colour;}if(orientation == 3){binImage[posY][posX - 1] = colour;binImage[posY][posX] = colour;binImage[posY + 1][posX] = colour;binImage[posY - 1][posX - 1] = colour;}}//7void CSBrick::putAtTop(unsigned int newOrient, unsigned int newPosX) {setPosX(newPosX);setOrientation(newOrient);switch(newOrient){case 0: setPosY(1); break;case 1: setPosY(1); break;case 2: setPosY(0); break;case 3: setPosY(1); break;}}//COBRICK//1int COBrick::shiftLeft(CBin *bin) {unsigned int posX;posX = getPosX();posX = posX - 1;setPosX(posX);if(checkCollision(bin) == 0){setPosX(posX + 1);return 0;}return 1;}//2int COBrick::shiftDown(CBin *bin) {unsigned int posY;posY = getPosY();posY = posY + 1;setPosY(posY);if(checkCollision(bin) == 0){setPosY(posY - 1);return 0;}return 1;}//3int COBrick::shiftRight(CBin *bin) {unsigned int posX;posX = getPosX();posX = posX + 1;setPosX(posX);if(checkCollision(bin) == 0){setPosX(posX - 1);return 0;}return 1;}//4int COBrick::rotateClockwise(CBin *bin){unsigned int orientation,oldOrientation;orientation = getOrientation();oldOrientation = orientation;if(orientation == 3)orientation = 0;elseorientation = orientation + 1;setOrientation(orientation);if(checkCollision(bin) == 0){setOrientation(oldOrientation);return 0;}return 1;}//5int COBrick::checkCollision(CBin *bin){unsigned int width;unsigned int height;unsigned char ** image;unsigned int orientation;unsigned int posX;unsigned int posY;width = bin->getWidth();height = bin->getHeight();image = new unsigned char *[height];for(unsigned int i = 0; i < height; i++){image[i] = new unsigned char [width];}bin->getImage(image);orientation = getOrientation();posX = getPosX();posY = getPosY();//brick==0;if(orientation == 0){//out edge;if((posX + 1 < 1)||(posX > width - 1)||(posY < 1)||(posY > height - 1))return 0;//重叠if((image[posY - 1][posX] != 0)||image[posY][posX] != 0||(image[posY - 1][posX + 1] != 0)||(image[posY][posX + 1] != 0))return 0;}if(orientation == 1){if((posX + 1 < 1)||(posX + 1 > width - 1)||(posY + 1 < 1)||(posY + 1 > height - 1)) return 0;if((image[posY][posX + 1] != 0)||image[posY + 1][posX] != 0||(image[posY][posX] != 0)||(image[posY + 1][posX + 1] != 0))return 0;}if(orientation == 2){if((posX + 1 < 1)||(posX + 1 > width - 1)||(posY + 1 < 1)||(posY + 1 > height - 1)) return 0;if((image[posY][posX + 1] != 0)||image[posY + 1][posX] != 0||(image[posY][posX] != 0)||(image[posY + 1][posX + 1] != 0))return 0;}if(orientation == 3){//out edge;if((posX + 1 < 1)||(posX > width - 1)||(posY < 1)||(posY > height - 1))return 0;//重叠if((image[posY - 1][posX] != 0)||image[posY][posX] != 0||(image[posY - 1][posX + 1] != 0)||(image[posY][posX + 1] != 0))return 0;}return 1;}//6void COBrick::operator >>(unsigned char ** binImage){unsigned int orientation;unsigned int posX;unsigned int posY;unsigned char colour;posX = getPosX();posY = getPosY();orientation = getOrientation();colour = getColour();if(orientation == 0){binImage[posY - 1][posX] = colour;binImage[posY][posX] = colour;binImage[posY][posX + 1] = colour;binImage[posY - 1][posX + 1] = colour;}if(orientation == 1){binImage[posY][posX + 1] = colour;binImage[posY + 1][posX] = colour;binImage[posY][posX] = colour;binImage[posY + 1][posX + 1] = colour;}if(orientation == 2){binImage[posY][posX + 1] = colour;binImage[posY + 1][posX] = colour;binImage[posY][posX] = colour;binImage[posY + 1][posX + 1] = colour;}if(orientation == 3){binImage[posY - 1][posX] = colour;binImage[posY][posX] = colour;binImage[posY][posX + 1] = colour;binImage[posY - 1][posX + 1] = colour;}}//7void COBrick::putAtTop(unsigned int newOrient, unsigned int newPosX) {setOrientation(newOrient);switch(newOrient){case 0: setPosY(1); break;case 1: setPosY(0); break;case 2: setPosY(0); break;case 3: setPosY(1); break;}}//CMBRICK//1int CMBrick::shiftLeft(CBin *bin) {unsigned int posX;posX = getPosX();posX = posX - 1;setPosX(posX);if(checkCollision(bin) == 0){setPosX(posX + 1);return 0;}return 1;}//2int CMBrick::shiftDown(CBin *bin) {unsigned int posY;posY = getPosY();posY = posY + 1;setPosY(posY);if(checkCollision(bin) == 0){setPosY(posY - 1);return 0;}return 1;}//3int CMBrick::shiftRight(CBin *bin) {unsigned int posX;posX = posX + 1;setPosX(posX);if(checkCollision(bin) == 0){setPosX(posX - 1);return 0;}return 1;}//4int CMBrick::rotateClockwise(CBin *bin){unsigned int orientation,oldOrientation;orientation = getOrientation();oldOrientation = orientation;if(orientation == 3)orientation = 0;elseorientation = orientation + 1;setOrientation(orientation);if(checkCollision(bin) == 0){setOrientation(oldOrientation);return 0;}return 1;}//5int CMBrick::checkCollision(CBin *bin){unsigned int width;unsigned int height;unsigned char ** image;unsigned int orientation;unsigned int posX;unsigned int posY;width = bin->getWidth();height = bin->getHeight();image = new unsigned char *[height];for(unsigned int i = 0; i < height; i++){image[i] = new unsigned char [width];}bin->getImage(image);orientation = getOrientation();posX = getPosX();posY = getPosY();if(orientation == 0){if((posX < 1)||(posX > width - 1)||(posY < 1)||(posY > height - 1)) return 0;//重叠if((image[posY - 1][posX] != 0)||image[posY][posX] != 0||(image[posY][posX + 1] != 0)||(image[posY][posX - 1] != 0))return 0;}if(orientation == 1){if((posX + 1 < 1)||(posX > width - 1)||(posY < 1)||(posY > height - 1)) return 0;if((image[posY][posX + 1] != 0)||image[posY - 1][posX] != 0||(image[posY][posX] != 0)||(image[posY + 1][posX] != 0))return 0;}if(orientation == 2){if((posX < 1)||(posX > width - 1)||(posY + 1 < 1)||(posY > height - 1)) return 0;if((image[posY + 1][posX] != 0)||image[posY][posX + 1] != 0||(image[posY][posX] != 0)||(image[posY][posX - 1] != 0))return 0;}if(orientation == 3){if((posX < 1)||(posX + 1 > width - 1)||(posY < 1)||(posY > height - 1)) return 0;if((image[posY][posX - 1] != 0)||image[posY][posX] != 0||(image[posY + 1][posX] != 0)||(image[posY - 1][posX] != 0))return 0;}return 1;}//6void CMBrick::operator >>(unsigned char ** binImage){unsigned int orientation;unsigned int posX;unsigned int posY;unsigned char colour;posX = getPosX();posY = getPosY();orientation = getOrientation();colour = getColour();if(orientation == 0){binImage[posY - 1][posX] = colour;binImage[posY][posX] = colour;binImage[posY][posX - 1] = colour;binImage[posY][posX + 1] = colour;}if(orientation == 1){binImage[posY][posX + 1] = colour;binImage[posY - 1][posX] = colour;binImage[posY][posX] = colour;binImage[posY + 1][posX] = colour;}if(orientation == 2){binImage[posY][posX - 1] = colour;binImage[posY][posX + 1] = colour;binImage[posY][posX] = colour;binImage[posY +1][posX] = colour;}if(orientation == 3){binImage[posY][posX - 1] = colour;binImage[posY][posX] = colour;binImage[posY + 1][posX] = colour;binImage[posY - 1][posX] = colour;}}//7void CMBrick::putAtTop(unsigned int newOrient, unsigned int newPosX) {setPosX(newPosX);setOrientation(newOrient);switch(newOrient){case 0: setPosY(1); break;case 1: setPosY(1); break;case 2: setPosY(1); break;case 3: setPosY(1); break;}}(4)工具栏快捷键添加图标int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CFrameWnd::OnCreate(lpCreateStruct) == -1)return -1;if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){TRACE0("Failed to create toolbar\n");return -1; // fail to create}CImageList img;CString str;//设置按钮的宽度和长度m_wndToolBar.GetToolBarCtrl().SetButtonWidth(40, 100);//改变属性m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT |CBRS_TOOLTIPS |TBSTYLE_TRANSPARENT|TBBS_CHECKBOX );m_wndToolBar.SetButtons(NULL,3);// 添加图像img.Create(28, 28, ILC_COLOR8|ILC_MASK,2,2);img.SetBkColor(RGB(0, 0, 102));//顺序增添按键的图标img.Add(AfxGetApp()->LoadIcon(IDI_ICON_START));img.Add(AfxGetApp()->LoadIcon(IDI_ICON_PAUSE));img.Add(AfxGetApp()->LoadIcon(IDI_ICON_CONTINUE));m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);img.Detach();img.Create(32, 32, ILC_COLOR8|ILC_MASK, 2,2);img.SetBkColor(::GetSysColor(COLOR_BTNFACE));//顺序增添按键的图标img.Add(AfxGetApp()->LoadIcon(IDI_ICON_START));img.Add(AfxGetApp()->LoadIcon(IDI_ICON_PAUSE));img.Add(AfxGetApp()->LoadIcon(IDI_ICON_CONTINUE));m_wndToolBar.GetToolBarCtrl().SetImageList(&img);img.Detach();// 设置文字m_wndToolBar.SetButtonInfo(0, ID_Game_Start, TBSTYLE_BUTTON, 0);m_wndToolBar.SetButtonText(0, "开始");m_wndToolBar.SetButtonInfo(1, ID_GAME_PAUSH, TBSTYLE_BUTTON, 1);m_wndToolBar.SetButtonText(1, "暂停");m_wndToolBar.SetButtonInfo(2, ID_GAME_CONTINUE, TBSTYLE_BUTTON,2);m_wndToolBar.SetButtonText(2, "继续");CRect rectToolBar;//得到按钮的大小m_wndToolBar.GetItemRect(0, &rectToolBar);//设置按钮的大小m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(32,32));if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failed to create status bar\n");return -1; // fail to create}// TODO: Delete these three lines if you don't want the toolbar to// be dockablem_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);return 0;}二、运行结果(1)游戏界面(2)游戏开始(3)游戏结束五、实验心得这次的实验是这学期的第三次实验,通过这次实验我学到了很多东西。
俄罗斯方块实习报告
![俄罗斯方块实习报告](https://img.taocdn.com/s3/m/5f0699c259eef8c75ebfb341.png)
计算机实习报告姓名:刘天班级: 2010211114学号: 10210417小班序号:14指导老师:丘广晖题目:俄罗斯方块俄罗斯方块实验报告一.功能说明1.1总体功能说明本程序主要是用VC6.0编程软件通过Windows控制台,实现俄罗斯方块这一游戏。
本程序实现了俄罗斯方块的随机产生及移动等,玩家在进入游戏界面后,可以通过键盘操作这个游戏。
在游戏界面右边,写有玩家分数和一定的操作说明,同时内部也有暂停和退出的设置,在玩家疲惫时,可随时停止游戏。
1.2用户界面(1)欢迎界面(2)游戏界面(3)结束界面1.3使用方法玩家可通过键盘的W、S、A、D键分别控制方块的上下左右,暂停键是E,之后可按任意键继续游戏,退出键则是Q。
边框右侧有下一个方块的预告。
二.程序设计说明2.1 总体设计框架C++程序执行流程(总流程图):2.2 关键算法描述bool table[15][23]={0}; 绘制操作面板;bool menu(); 设定游戏的初始界面(欢迎界面);void spin(); 决定方块的旋转;TurnLeft()、TurnRight()、TurnDown()则是俄罗斯方块移动方向的判定;typenext=rand()%7; 随机数的产生,决定了方块的形状;while(1); 循环的开始;if(kbhit()); 上下左右控制的判定;2.3 程序设计的难点和关键点一、怎样设置方块的状态,变化等;二、怎样使将要产生的方块与预示方块相同;三、方块下落时如何判定下方已存在方块,从而使这个方块不在下落;四、消行的实现。
2.4 调试的方法调试中多采用断点调试单步执行的方法来查看和改正错误。
2.5 程序性能评价优点:1、游戏运行流畅,整体较为稳定,不会因为玩家的误操作而出现停滞;2、游戏说明简单明确,上手容易;3、采用模块化编程,多个文件组成整个工程;4、编码中的变量、函数等名称合理而清楚,一目了然;不足:1、某些细节上还不够精致,可能还存在bug;2、视觉效果一般。
最新整理c++编程俄罗斯方块计算机实习报告模板.docx
![最新整理c++编程俄罗斯方块计算机实习报告模板.docx](https://img.taocdn.com/s3/m/1b0d641b02768e9951e7386d.png)
最新整理c++编程俄罗斯方块计算机实习报告模板c++编程俄罗斯方块计算机实习报告模板姓名:班级:学号:小班序号:指导老师:题目:用c++编程俄罗斯方块xxxx:用c++编程俄罗斯方块实验报告一.功能说明1.1总体功能说明我所设计的俄罗斯方块在实现俄罗斯方块基本功能的基础上,实现了一些基本的创新。
我们开发的俄罗斯方块游戏,主要实现了以下几种功能:1.对初次玩的玩家进行新手指导。
2.可以灵活控制方块在图形框中运动。
3.游戏过程中方块可以自由旋转。
4.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。
并且当连续消行时分数会有一定奖励。
5.可以提示下一个出现的方块6.游戏前可以选游戏的等级,不同等级对应不同速度,不同等级消行后的加分不同,等级越高分数越高,方便不同水平的玩家游戏。
7.有记录最大分的功能,历史最高分记录在一个名为HighestPoint的txt文件中。
8.游戏结束后弹出对话框提醒结束游戏还是继续游戏。
9.初始化界面和游戏中有音乐,使游戏更吸引人我的游戏的主要特色如下:1、不同的方块的颜色不同,使游戏的视觉效果更佳。
2、分数上,不同的难度等级对应不同速度,速度越快,每消一行所加的分数越多。
3、假如一次消多行,那么加分会比逐次消行更多。
4、有提示下一个方块的功能,是游戏更加人性化。
5、可以记录历史最高分。
当创造最高分后会有庆祝的画面。
6、算法编程上,创建了一个数组structsha{intxy[8];WORD*tcolor;intnext;};用于记录方块的位置、颜色、以及旋转后方块的编号。
这种编程方法可以为后续方块运动的编程创造便利。
7、此外,采用多文件结构,每个cpp文件存储一个功能,便于程序的修改和功能的扩展。
1.2用户界面1、初始化界面。
主要完成的功能是进入游戏后的初始化和功能选择。
2、帮助界面。
功能是方便初玩者尽快熟悉游戏操作。
3、难度选择界面。
C++课程设计实验报告(俄罗斯方块)
![C++课程设计实验报告(俄罗斯方块)](https://img.taocdn.com/s3/m/e1d1d06e561252d380eb6e39.png)
一、需求分析1.1系统概述该游戏在DOS下为玩家提供传统俄罗斯方块游戏的基本功能,玩家可以通过键盘控制在游戏区中堆积软件随机提供的由四个小方块不同组合的7种类型不同颜色的方块,每个小方格的颜色也是随机的,并且在整个下落的过程中,其颜色也呈动态变化。
游戏过程中,每在游戏区堆满一行后,自动消除并记分。
同时消去的行数越多,那一次性所加的分数也就越多。
一行是100,两行是200,三行是400,四行是500分。
为了得到更多的分,那么我们游戏者就要想办法一次尽可能多的消去方块。
当游戏区不能再堆积新来的方块时,游戏结束。
游戏设定3个级别,初级,中级和高级,每个级别有分三个小的级别,级别越高,方块下降的速度越快、难度越大。
为了避免游戏频发枯燥,增加游戏的趣味性,该游戏为游戏者插入了音乐,对该功能有实现暂停的控制。
该游戏的以“英雄榜”来判断玩家水平的高低,如果玩家的得分大于了保存的最高分,则将玩家的的得分写入文件,如果得分不大于最高分,则保持不变。
游戏以最终玩家获得的分数来判断玩家水平的高低。
1.2功能需求描述这次实验以及部分功能的实现都是一次小小的尝试,获得不错的效果。
这个游戏,不仅可以满足游戏爱好者对游戏的要求,同时我们增加了趣味性,让游戏有一个比较好听的背景音乐,在玩游戏的同时,让玩家饱享视听大宴。
这有别于常规的俄罗斯方块算法,游戏中,玩家依靠自己消层来得分,而且保证了玩家对游戏趣味性的追求,并且游戏的英雄榜功能为玩家提供了一个良好的测试水平的平台。
当玩家游戏池中的砖块累积到顶端时游戏失败。
二、系统设计2.1 数据流程图数据流图是对系统数据流向的一种描述,并从本质上让程序的使用者,大致了解系统的使用方法。
本俄罗斯游戏的大致流程图如下:2.2 程序功能模块2.3程序流程图三、关键代码描述3.1 程序模块详细设计3.1.1 界面初始化程序界面程序在启动运行时,系统会通过调用视图类中的重绘图函数对界面进行界面的初始化。
c 俄罗斯方块实验报告
![c 俄罗斯方块实验报告](https://img.taocdn.com/s3/m/d49887fdf021dd36a32d7375a417866fb84ac0af.png)
c 俄罗斯方块实验报告俄罗斯方块实验报告引言:俄罗斯方块,作为一款经典的休闲游戏,深受全球玩家的喜爱。
它不仅能够带来娱乐,还能锻炼人的反应能力和思维灵活度。
本次实验旨在探究俄罗斯方块对人类认知和心理状态的影响,并分析其背后的原理和机制。
一、实验设计与方法1. 实验对象:本次实验共选取了30名年龄在18至30岁之间的大学生作为实验对象,其中男女比例大致相等。
2. 实验设备:实验所需的设备包括电脑、键盘和俄罗斯方块游戏软件。
3. 实验过程:实验对象被要求在实验室内进行连续30分钟的俄罗斯方块游戏,期间记录实验对象的游戏得分、游戏时间以及心理状态的变化。
二、实验结果与分析1. 游戏得分与游戏时间:实验结果显示,实验对象的游戏得分与游戏时间呈正相关关系。
游戏时间越长,实验对象的得分也越高。
这表明俄罗斯方块游戏能够提高玩家的注意力和反应速度,从而使其在游戏中取得更高的成绩。
2. 心理状态的变化:通过实验对象的主观反馈和心理问卷的结果,我们发现俄罗斯方块游戏能够带来积极的心理状态变化。
在游戏过程中,实验对象普遍感到愉悦、振奋和专注。
这可能与游戏的规则简单、操作容易和奖励机制有关。
三、俄罗斯方块背后的原理和机制1. 视觉感知:俄罗斯方块的每个方块都由四个小方块组成,它们的形状和颜色各不相同。
玩家需要通过观察和判断来决定方块的旋转和位置,这对于视觉感知能力提出了较高的要求。
2. 空间认知:在游戏中,玩家需要根据方块的形状和位置,合理地安排和放置方块。
这涉及到对空间的认知和判断能力,需要玩家具备一定的空间思维能力。
3. 反应速度:俄罗斯方块游戏的速度逐渐加快,玩家需要快速地做出决策和操作。
这对玩家的反应速度和手眼协调能力提出了挑战,同时也能够锻炼和提高这些能力。
4. 策略规划:在游戏中,玩家需要根据当前的方块形状和场地情况,制定合理的策略和规划。
这对于玩家的逻辑思维和问题解决能力提出了要求,同时也能够培养玩家的决策能力和灵活性。
俄罗斯方块实训总结报告
![俄罗斯方块实训总结报告](https://img.taocdn.com/s3/m/bfafb1b1e109581b6bd97f19227916888586b915.png)
一、引言随着计算机技术的发展,编程已经成为计算机专业学生必须掌握的基本技能之一。
为了提高我们的编程能力和实践能力,学校组织了一次俄罗斯方块实训活动。
本次实训旨在通过设计和实现一个简单的俄罗斯方块游戏,让我们深入了解游戏编程的基本原理和技巧,培养我们的团队合作精神。
以下是对本次俄罗斯方块实训的总结报告。
二、实训目的1. 掌握游戏编程的基本原理和技巧。
2. 熟悉并运用各种编程语言进行游戏开发。
3. 培养团队合作精神和沟通能力。
4. 提高问题解决能力和创新能力。
三、实训内容1. 游戏设计:确定游戏规则、界面布局、角色设定等。
2. 编程实现:选择合适的编程语言,编写游戏代码。
3. 测试与优化:对游戏进行测试,找出并修复存在的问题,提高游戏性能。
四、实训过程1. 游戏设计阶段在游戏设计阶段,我们小组首先讨论并确定了游戏的基本规则:玩家通过操作控制俄罗斯方块,将不同形状的方块放置在游戏区域,当一行或几行方块被填满时,这些方块会消失,玩家获得分数。
游戏分为多个等级,随着等级的提高,游戏难度逐渐增加。
2. 编程实现阶段在编程实现阶段,我们小组分工合作,分别负责不同模块的开发。
以下是各模块的开发情况:(1)主界面:使用HTML和CSS设计游戏主界面,包括游戏区域、分数显示、游戏难度选择等。
(2)俄罗斯方块生成与移动:使用JavaScript编写代码,实现俄罗斯方块的生成、移动和旋转等功能。
(3)游戏逻辑:编写游戏逻辑代码,包括方块下落、消除、计分等。
(4)游戏音效:使用HTML5的audio标签,为游戏添加背景音乐和音效。
3. 测试与优化阶段在测试与优化阶段,我们对游戏进行了多次测试,发现并修复了一些问题。
主要优化内容包括:(1)提高游戏运行速度,减少卡顿现象。
(2)优化游戏音效,使音效更加真实。
(3)调整游戏难度,使游戏更具挑战性。
五、实训成果通过本次俄罗斯方块实训,我们小组成功实现了一个具有基本功能的俄罗斯方块游戏。
游戏设计俄罗斯方块实验报告
![游戏设计俄罗斯方块实验报告](https://img.taocdn.com/s3/m/022e04d8360cba1aa811da68.png)
7.实验总结: 1)软件设计书的重要性。在软件设计的过程中,一个清晰的思路将会起到很大的作用, 所以在软件设计的最初就应该写好一份足够完善并且足够清晰的软件设计书。只有这样才 能时刻保持头脑清晰,抓住实现软件功能的每一个关键点。 2)掌握一个编译器。编译器是程序员的好朋友,只有熟悉掌握一种编译器,才能让软件 设计的整个过程更加流畅,要相信编译器,因为它是你最好的朋友。 2)冷静。编码是一个极其枯燥的过程,有可能你写的十行代码中会蹦出二十个错误。这 个时候你就应该相信你的编译器,不应该有急躁的心理,保持一颗冷静的心态才能找出隐 藏在代码中的 BUG。 3)代码的可读性。我相信在现在这个社会,程序设计不是一个人的独角戏,在这个需要 团队配合的时代,代码是否具有良好的可读性会成为成败的关键。所以养成良好的代码风 格是每一个程序员应该做的事情。 4)模块化。在这个项目的整个实现过程中,运用到了模块化的设计思想,将程序的各个 部分封装成一个个小的模块,按模块设计软件的各个部分。这个项目更加让我感受到了模 块化设计的优点。 5)逐步求精。在软件的开发中不要一开始就追求细节,要先把整体的框架搭建好,这样 在后续的开发中才能越来越顺利。要学会一步一步去完善整个程序。
开始
c语言俄罗斯方块实验报告
![c语言俄罗斯方块实验报告](https://img.taocdn.com/s3/m/dde2d2a283c4bb4cf7ecd1d8.png)
C语言之游戏俄罗斯方块课程设计报告专业:[]学生姓名:[]指导教师:[]完成时间:目录一、需求分析..................................................................................... 错误!未定义书签。
二、概要设计..................................................................................... 错误!未定义书签。
三、详细设计..................................................................................... 错误!未定义书签。
四、调试分析 (26)五、用户手册 (27)六、测试数据..................................................................................... 错误!未定义书签。
七、附录.............................................................................................. 错误!未定义书签。
一、需求分析1.该程序是完成一个简易的俄罗斯方块的任务,其要完成几个重要的功能:界面,方块下落,旋转,判断是否还能下落,左右移动,分数,速度设置,清楚满的每行,下个方块的预览等;2.可用#include <graphics.h>的头文件来实用几个函数来控制并完成游戏的界面;3.可用7个二维5*5数组去实现下落方块的全部类型,再用随机函数使其随机下落;4.用#include <conio.h>的头文件去使用按键的控制,以保证用户能够合理操作;并用#include <stdlib.h>的头文件来使用rand函数来随机出示七种方块;完成正常的显示和下个方块的预览;5.用#include <bios.h>来运用时针去控制时间;6.程序执行过程:然后加上几个基本的头文件来执行函数,首先设置按键操作,用:w,a,d,s控制,然后进行界面的初始化设置,启动,时针参数设置,开始新游戏,开始随机下落方块,显示下一个方块,再行旋转,移动,清除,加分,速度参数,最后判断是否已满,停止游戏,打出分数,结束的画面设置,游戏终止...二、概要设计该程序中的函数设置总体主要功能大致如下1.找到合适的方块盒子(7种)使其一一下落box[MAX_C][5][5] = { /*MAX_C(7)种预定义的盒子*/ 这样用类似的7个5*5二维数组来实现每个盒子方块的形状,自此就引荐两个作为介绍,{{0,0,0,0,0},{0,0,0,0,0},{0,0,1,0,0},{0,1,1,1,0},{0,0,0,0,0},{0,0,0,0,0}},{{0,0,0,0,0},{1,1,1,1,0},{0,0,0,0,0},{0,0,0,0,0}},如此中用1代表显示的格子,0代表空。
C语言编写俄罗斯方块实验报告
![C语言编写俄罗斯方块实验报告](https://img.taocdn.com/s3/m/4f5ca694cf2f0066f5335a8102d276a2002960fb.png)
C语言编写俄罗斯方块实验报告
实验目的:通过编写俄罗斯方块游戏,加深对C语言的理解和掌握程度,提高编程能力。
实验内容:利用C语言编写一个简单的俄罗斯方块游戏,实现方块的下落、旋转和消除等功能。
实验步骤:
1.定义一个二维数组来表示游戏画面,使用数字来表示不同的方块,例如1表示方块,0表示空白。
2.初始化游戏画面,设置游戏窗口的大小和方块的大小。
3.实现方块的下落功能,通过循环来不断更新方块的位置,使其向下移动。
4.实现方块的旋转功能,通过按键来旋转方块的形状,可以采用矩阵转置的方法来实现旋转功能。
5.判断方块是否可以继续下落,如果到达底部或者下方有其他方块,则停止下落,并将方块固定在该位置。
6.检测是否有一行被填满,如果有,则消除该行并将上方的方块往下移动一行。
7.判断游戏是否结束,如果方块无法继续下落,则游戏结束。
8.实现计分功能,每消除一行方块就增加一定的得分。
实验结果:编写完成俄罗斯方块游戏后,可以在控制台或者图形界面上运行游戏,通过键盘控制方块的下落和旋转,消除满行方块并得分。
实验总结:通过本次实验,我对C语言的掌握和理解有了更深入的认识,通过实际动手编写俄罗斯方块游戏,加深了对于数组、循环和条件语
句等基本知识的运用,提高了编程能力和逻辑思维能力。
在编写游戏过程中,我遇到了一些问题,如方块的位置计算、旋转算法的实现等,但通过
查阅资料和不断调试,最终成功解决了这些问题,取得了较好的实验效果。
通过本次实验,我不仅提高了编程能力,还锻炼了耐心和解决问题的
能力,深刻体会到了实践的重要性,希望在今后的学习和工作中能够继续
努力,不断提升自己的编程水平和能力。
VC++俄罗斯方块(MFC版)实验报告
![VC++俄罗斯方块(MFC版)实验报告](https://img.taocdn.com/s3/m/fd9b4bec856a561252d36fc7.png)
VC++项目开发实验报告课题名称:基于MFC的俄罗斯方块游戏设计姓名:学号:系别:计算机学院班级:专业:指导教师:2012年4月 9日目录一、课程设计的目的与要求 (3)1.1课程设计的目的 (3)1.2课程设计的要求 (3)二、设计正文 (3)2.1需求分析 (3)2.1.1 游戏需求 (3)2.2.2游戏界面需求: (3)2.1.3游戏形状(方块)需求: (3)2.2算法分析 (4)2.2.1程序流程图 (4)2.2.2定义方块的数据结构 (5)2.2.3 游戏设计分析 (6)三系统设计 (7)3.1创建界面的主框架 (7)3.2正常流程的设计 (7)3.2.1定时制机制 (7)3.2.2定时处理 (8)4.1底部到达的判断与销行的实现 (9)4.2中断操作流程的实现 (10)4.3变形的实现 (10)4.4 游戏区域绘图的实现 (11)4.5 功能的完善 (11)4.6 游戏演示 (12)4.7主程序源程序清单 (13)六、参考文献 (20)用VC++实现俄罗斯方块的程序设计一、课程设计的目的与要求1.1课程设计的目的综合运用所学知识,熟练掌握VC++程序设计的编码与MFC框架结构。
1.2课程设计的要求要求用VC++设计与实现俄罗斯方块游戏。
要求包括系统的需求分析;系统总框图及每个模块的设计分析;MFC应用程序架构;框架的扩展;算法的设计与实现;游戏的内部实现;游戏区域绘图的实现;系统存在的问题及错误处理;列出所有定义的函数及说明;附上程序源代码。
二、设计正文2.1需求分析2.1.1 游戏需求随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,设置六关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。
游戏功能要求如下:2.2.2游戏界面需求:良好的用户界面,有关数显示和分数显示。
让方块在一定的区域内运动和变形,该区域用一种颜色表明,既用一种颜色作为背景,最好设为黑色。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
`````````学院:数计学院班级:13级数媒班学号:姓名:摘要……………………………………………………………………………………………………..关键字:目录第一部分设计总概........................................................................................................................... 摘要…………………………………………………………………………………………………一、设计目的.............................................................................................................................二、设计要求.............................................................................................................................三、设计内容.............................................................................................................................四、系统分析与设计................................................................................................................. 第二部分数据结构设计................................................................................................................... 第三部分功能实现与程序调试………………………………………………………………….第四部分完成设计...........................................................................................................................一、实习日记.............................................................................................................................二、实习总结.............................................................................................................................三、教师评语.............................................................................................................................四、程序使用说明书………………………………………………………………………….第一部分设计总概一、设计目的二、设计要求三、设计内容四、系统分析与设计第二部分数据结构设计第三部分功能实现与程序调试第四部分完成设计一、实习日记:二、实习总结:………………………三、教师评语:设计成绩:指导老师签名:摘要使用C语言编写一个俄罗斯方块游戏系统,要求程序运行后有一个图形用户界面,实现各种方块的生产,包括形状和颜色等信息,完成左右下旋转的功能,在消行的同时分数加10,在点击暂停或者按下空格的时候暂停或开始游戏,最后结束游戏.关键字:音乐、背景、按键控制、暂停、继续、停止,难度级别第一部分设计总概一、设计目的:本课程设计是一个综合性的实践教学环节,目的在于促进学生复习和巩固计算机软件设计知识,加深对软件设计方法、软件设计技术和设计思想的理解,并能运用所学知识进行开发。
希望通过本课程设计中简单系统的开发,使学生掌握软件设计的基本方法和基本流程,提高自己的综合应用能力。
二、设计要求利用C++编写俄罗斯方块游戏,使俄罗斯游戏能够在Microsoft Visual C++6.0上运行该游戏。
二、设计内容:俄罗斯方块(1)游戏等级:游戏分为难中易三个等级,等级越高,方块下落速度越快;(2)由方向键控制游戏:上键控制方块变形、下键控制方块下移并判断是否有消行、左键控制方块左移、右键控制方块右移;(3)游戏积分:一次性消的行数越多加的分数越多,当达到一定分数自动提高一个游戏等级。
三、系统分析与设计1.程序功能模块:2.程序流程图:第二部分数据结构设计1.游戏需求随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。
2.游戏界面需求:良好的用户界面,以键盘操作,有关数显示和分数显示。
让方块在一定的区域内运动和变形,并且显示下一个即将出现的方块。
3.游戏形状(方块)需求:良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。
第三部分功能实现与程序调试程序:// testBlock.cpp : Defines the entry point for theapplication.//#define CreateWindow CreateWindowA#include "stdafx.h"#include "resource.h"#include<mmsystem.h>//PlaySound函数的头文件#pragma comment(lib, "WINMM.LIB")#include "commctrl.h"#pragma comment(lib, "comctl32.lib")#include <windows.h>#include <commctrl.h>HMENU hMenu; //菜单句柄#define IDM_NEW 40001#define IDM_PAUSE 40002//#define IDM_STOP 40003#define IDM_HELP 40008#define IDM_MUSIC 40010#define IDM_LEFT 1001#define IDM_RIGHT 1002#define IDM_UP 1003#define IDM_DOWN 1004#define IDC_RADIO1 1005#define IDC_RADIO2 1006#define COLOR_BTNFACE 15#define MAX_LOADSTRING 100#define TIMER_DROP_ID 1int c = 0,contin=1;int cnext=0;int ch1=0;int ch2=0;int ch3=1;int music=0;BOOL bMusicOn; //音乐开关int iMusicBG; //背景音乐canRotate( int rank);BOOL CALLBACK MusicDlgProc(HWND,UINT,WPARAM,LPARAM); void TetrisMusic(BOOL);void MusicItem(int);static TBBUTTON tbButtons[] ={{0,IDC_JIXU,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1} ,{1,IDC_PAUSE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1 },{2,IDM_STOP,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1},{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1},{3,IDM_MUSIC,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1 },{4,IDM_HELP1,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1 },{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1},{5,IDM_ABOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1 },}; //工具栏数据结构struct Block{ POINT a; POINT b; POINT c; POINT d; }; //方块模型数据结构static Block Tetris[7][4] ={//□□//□□(1){{{0,0},{0,1},{1,0},{1,1}},{{0,0},{0,1},{1,0},{1,1}},{{0,0},{0,1},{1,0},{1,1}},{{0,0},{0,1},{1,0},{1,1}}},//□□// □□(2){{{0,0},{1,0},{1,1},{2,1}},{{1,0},{1,1},{0,1},{0,2}},{{0,0},{1,0},{1,1},{2,1}},{{1,0},{1,1},{0,1},{0,2}}},// □□//□□ (2){{{1,0},{2,0},{0,1},{1,1}},{{0,0},{0,1},{1,1},{1,2}}, {{1,0},{2,0},{0,1},{1,1}}, {{0,0},{0,1},{1,1},{1,2}} },//□□□□(2){{{0,0},{1,0},{2,0},{3,0}}, {{1,0},{1,1},{1,2},{1,3}}, {{0,0},{1,0},{2,0},{3,0}}, {{1,0},{1,1},{1,2},{1,3}} },// □//□□□(4){{{1,0},{0,1},{1,1},{2,1}}, {{0,0},{0,1},{1,1},{0,2}}, {{0,0},{1,0},{2,0},{1,1}}, {{1,0},{0,1},{1,1},{1,2}} },//□//□□□(4){{{0,0},{0,1},{1,1},{2,1}}, {{0,0},{1,0},{0,1},{0,2}}, {{0,0},{1,0},{2,0},{2,1}}, {{1,0},{1,1},{0,2},{1,2}} },// □//□□□(4){{{2,0},{0,1},{1,1},{2,1}}, {{0,0},{0,1},{0,2},{1,2}}, {{0,0},{1,0},{2,0},{0,1}}, {{0,0},{1,0},{1,1},{1,2}}}}; //七种方块全部变形数据结构int x = 4 ;//以方块为单位int y = -1;int nBlockAreaX=10;//背景窗口int nBlockAreaY=30;int BlockMatrix[19][10];int nBlockKind = 0;int nBlockColor = 0;int nBlockState = 0;int nBlockAreaXnext=220;//显示窗口int nBlockAreaYnext=37;int BlockMatrixnext[8][6];int nBlockKindnext = 0;int nBlockColornext = 0;int nBlockStatenext = 0;int gamescore=0;BOOL BGame=FALSE;BOOL bGOver=FALSE;HWND hWnd;HDC hdc;HDC hMemDC = NULL;HDC hWndDC = NULL;// Global Variables:HINSTANCE hInst; // current instanceTCHAR szTitle[MAX_LOADSTRING];// The title bar textTCHAR szWindowClass[MAX_LOADSTRING];// The title bar textHBITMAP bmp[999] = {0};// Foward declarations of functions included in this code module:ATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);void DrawTetris( HDC hdc, int offsetX/*0*/, int offsetY/*0*/, int rank/*no use*/ );void Tools(HWND hWnd);LoadImage();void GameStart();void DrawNext(HDC hdc);void GameOver();void DrawButton(LPARAM lParam);LPARAM lParam;int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){// TODO: Place code here.MSG msg;HACCEL hAccelTable;// Initialize global stringsLoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_TESTBLOCK, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);FILE *fp=NULL;////////////char ch[50];fp=fopen("test.txt","r");fgets(ch,523,fp);ch1=atoi(ch);fclose(fp);////////// Perform application initialization:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TESTBLOCK);char fileName[100] = {0};//res\\1.bmpfor (int i = 0; i < 9; i++ ){sprintf(fileName, "res\\%d.bmp", i+1);bmp[i] = (HBITMAP)LoadImage(NULL, fileName,0,0,0,LR_LOADFROMFILE);//LOADIMAGEFROMFILE}for( i=0;i<=18;i++){for(int j=0;j<=9;j++){BlockMatrix[i][j]=-1;}}for(int m=0;m<=5;m++){for(int n=0;n<=5;n++){BlockMatrixnext[m][n]=-1;}}//beijingint a=1000;SetTimer(hWnd,TIMER_DROP_ID,a,NULL);hWndDC = GetDC(hWnd);hMemDC = CreateCompatibleDC(NULL);// Main message loop:Tools(hWnd);while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return msg.wParam;}ATOM MyRegisterClass(HINSTANCE hInstance){WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = (WNDPROC)WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_ICON1);wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+2);wcex.lpszMenuName =MAKEINTRESOURCE(IDC_TESTBLOCK);wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1));return RegisterClassEx(&wcex);}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {hInst = hInstance; // Store instance handle in our global variablehWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 200, 350, 485, NULL, NULL, hInstance, NULL);//窗口大小设置if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;TCHAR szHello[MAX_LOADSTRING];LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);switch (message){case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);// Parse the menu selections:switch (wmId){case IDM_UP:SendMessage(hWnd,WM_KEYDOWN,VK_UP,0);SetFocus(hWnd);break;case IDM_DOWN:SendMessage(hWnd,WM_KEYDOWN,VK_DOWN,0);SetFocus(hWnd);break;case IDM_RIGHT:SendMessage(hWnd,WM_KEYDOWN,VK_RIGHT,0);SetFocus(hWnd);break;case IDM_LEFT:SendMessage(hWnd,WM_KEYDOWN,VK_LEFT,0);SetFocus(hWnd);break;case IDM_START:{InvalidateRect(hWnd,0,1);GameStart();}break;break;//开始按键case IDC_PAUSE://暂停{BGame=FALSE;MessageBox(NULL, "你好,游戏暂停", "暂停", MB_OK);}break;case IDC_JIXU://继续{if(contin!=0)BGame=TRUE;}break;case IDM_STOP://停止BGame=FALSE;GameOver();break;case IDC_easy:InvalidateRect(hWnd,0,0);ch3=1;MessageBox(NULL, "你好,你选择的难易程度为简单", "简单", MB_OK);SetTimer(hWnd,TIMER_DROP_ID,1000,NULL);break;case IDC_normal:InvalidateRect(hWnd,0,0);ch3=2;MessageBox(NULL, "你好,你选择的难易程度为一般", "一般", MB_OK);SetTimer(hWnd,TIMER_DROP_ID,500,NULL);break;case IDC_difficult:MessageBox(NULL, "你好,你选择的难易程度为困难", "困难", MB_OK);ch3=3;InvalidateRect(hWnd,0,0);SetTimer(hWnd,TIMER_DROP_ID,100,NULL);break;case IDM_beijing:{SelectObject(hMemDC,bmp[8]);BitBlt(hWndDC,0,20,2000,2000,hMemDC,0,0,SRCCOPY);InvalidateRect(hWnd,0,0);//重绘//InvalidateRect(hwnd, NULL, false);重画时不擦除背景}break;case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_HELP1), hWnd, (DLGPROC)About);break;case IDM_HELP1:DialogBox(hInst, MAKEINTRESOURCE(IDD_help2), hWnd, (DLGPROC)About);break;case IDM_MUSIC:DialogBox(hInst,MAKEINTRESOURCE(IDD_MUSIC),hWnd,Mu sicDlgProc);break;case IDM_music1:MusicItem(IDM_music1);break;case IDM_music2:MusicItem(IDM_music2);break;case IDM_musicstop:MusicItem(IDM_musicstop);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message,wParam, lParam);}break;{case WM_PAINT:hdc = BeginPaint(hWnd, &ps);RECT rt;GetClientRect(hWnd, &rt);for(int i=0;i<=18;i++){for(int j=0;j<=9;j++){if(BlockMatrix[i][j]==-1){PatBlt(hdc,nBlockAreaX+j*20,nBlockAreaY+i*20,20,20 ,BLACKNESS);}else{SelectObject(hMemDC,bmp[BlockMatrix[i][j]]);BitBlt(hdc,nBlockAreaX+j*20,nBlockAreaY+i*20,20,20 ,hMemDC,0,0,SRCCOPY);}}}//InvalidateRect(hWnd,0,0);for(int m=0;m<=5;m++){for(int n=0;n<=5;n++){if(BlockMatrixnext[m][n]==-1){PatBlt(hdc,nBlockAreaXnext+n*20,nBlockAreaYnext+m* 20,20,20,BLACKNESS);}else{SelectObject(hMemDC,bmp[BlockMatrixnext[m][n]]);BitBlt(hdc,nBlockAreaXnext+n*20,nBlockAreaYnext+m* 20,20,20,hMemDC,0,0,SRCCOPY);}}}DrawTetris(hWndDC, 0, 0, 0);DrawNext( hdc);RECT rtTxt;TCHAR scoreTxt[100];sprintf(scoreTxt, " 得分: %d", gamescore);rtTxt.top = 200;rtTxt.left = 220;rtTxt.right = rtTxt.left+200;rtTxt.bottom = rtTxt.top+50;DrawText(hdc, scoreTxt, strlen(scoreTxt), &rtTxt, DT_LEFT);RECT rtTxt1;TCHARmaxscore[100];///////////////////////////////////// ////sprintf(maxscore, " 最高分: %d", ch1);rtTxt1.top=240;rtTxt1.left=220;rtTxt1.right=rtTxt1.left+300;rtTxt1.bottom=rtTxt1.top+100;DrawText(hdc, maxscore, strlen(maxscore), &rtTxt1, DT_LEFT);RECT rtTxt2;TCHAR eaayORdifficult[100];sprintf(eaayORdifficult, "难易级别: %d", ch3);rtTxt2.top = 280;rtTxt2.left = 220;rtTxt2.right = rtTxt2.left+200;rtTxt2.bottom = rtTxt2.top+50;DrawText(hdc, eaayORdifficult, strlen(eaayORdifficult), &rtTxt2, DT_LEFT);EndPaint(hWnd, &ps);}break;//计算分数case WM_DRAWITEM:DrawButton(lParam); //绘制方向按钮return TRUE;case WM_LBUTTONDOWN:{}break;case WM_TIMER:{DrawTetris(hWndDC, 0, 1, 0);}break;case WM_KEYDOWN:{int virtual_code=(int)wParam;int key_state=(int)lParam;switch(virtual_code){case VK_RIGHT:{DrawTetris(hWndDC, 1, 0, 0);}break;case VK_LEFT:{DrawTetris(hWndDC, -1, 0, 0);}break;case VK_UP:if(canRotate(1)){DrawTetris( hWndDC,0,0,1);}break;case VK_DOWN:{DrawTetris(hWndDC, 0, 1, 0);}break;default: break;}}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;}// Mesage handler for about box.LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){switch (message){case WM_INITDIALOG:return TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return TRUE;}break;}return FALSE;}BOOL CALLBACK MusicDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam){switch ( message ){case WM_INITDIALOG:if( iMusicBG == IDR_WAVE1 ) CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RAD IO1);if( iMusicBG == IDR_WAVE2 ) CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RAD IO2);if( !bMusicOn ) CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RAD IO3);return TRUE;case WM_COMMAND :switch ( LOWORD(wParam) ){case IDC_RADIO1:CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RA DIO1);break;case IDC_RADIO2:CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RA DIO2);break;case IDC_RADIO3:CheckRadioButton(hDlg,IDC_RADIO1,IDC_RADIO3,IDC_RA DIO3);break;case IDOK:if ( IsDlgButtonChecked(hDlg,IDC_RADIO1) == BST_CHECKED ){bMusicOn = TRUE;iMusicBG = IDR_WAVE1;MusicItem(IDM_music1);if ( BGame ) TetrisMusic(TRUE);}if ( IsDlgButtonChecked(hDlg,IDC_RADIO2) == BST_CHECKED ){bMusicOn = TRUE;iMusicBG = IDR_WAVE2;MusicItem(IDM_music2);if ( BGame ) TetrisMusic(TRUE);}if ( IsDlgButtonChecked(hDlg,IDC_RADIO3) == BST_CHECKED ){bMusicOn = FALSE;MusicItem(IDM_musicstop);TetrisMusic(FALSE);}EndDialog(hDlg,0);break;case IDCANCEL:EndDialog(hDlg,0);break;}break;}return FALSE;}//音乐菜单处理void MusicItem(int iCheckID){CheckMenuRadioItem(hMenu,IDM_music1,IDM_musicstop, iCheckID,MF_BYCOMMAND);if ( iCheckID == IDM_music1 ){bMusicOn = TRUE;iMusicBG = IDR_WAVE1;if ( BGame ) TetrisMusic(TRUE);}else if ( iCheckID == IDM_music2 ){bMusicOn = TRUE;iMusicBG = IDR_WAVE2;if ( BGame ) TetrisMusic(TRUE);}else{bMusicOn = FALSE;TetrisMusic(FALSE);}return;}//背景音乐void TetrisMusic(BOOL start){if ( start && bMusicOn && !bGOver )PlaySound(MAKEINTRESOURCE(iMusicBG),NULL,SND_RESOU RCE|SND_LOOP|SND_ASYNC);elsePlaySound(NULL,NULL,NULL);return;}BOOL clear( ){int count=0;for(int i=18;i>=0;i--){for(int j=0;j<10;j++){if(BlockMatrix[i][j]==-1)break;}if(j==10){count++;for(int k=i-1;k>=0;k--){for(int m=0;m<10;m++){BlockMatrix[k+1][m]=BlockMatrix[k][m];}}i++;if(gamescore>=ch1)ch1=gamescore;if(gamescore>450){ch3=3;SetTimer(hWnd,TIMER_DROP_ID,100,NULL);}else if(gamescore<=450&&gamescore>300){ch2=2;if(ch2>=ch3){ch3=ch2;SetTimer(hWnd,TIMER_DROP_ID,500,NULL);}}}}if(count==1){gamescore+=10;}if(count==2){gamescore+=30;}if(count==3){gamescore+=50;}if(count==4){gamescore+=80;}InvalidateRect(hWnd,0,0);return true;}void GameStart(){BGame=TRUE;gamescore=0;FILE *fp=NULL;char ch[50];fp=fopen("test.txt","r");fgets(ch,523,fp);ch1=atoi(ch);fclose(fp);contin=1;for(int i=0;i<=18;i++){for(int j=0;j<=9;j++){BlockMatrix[i][j]=-1;}}srand(GetTickCount()); nBlockKind=nBlockKindnext;nBlockState=nBlockStatenext;c=rand()%7;nBlockKindnext=rand()%7;nBlockStatenext=rand()%4;cnext=rand()%7;x = 4;y = -1;}BOOL DownCheckCollideBlock(int offsetX, int offsetY, int rank){if(y==-1){return FALSE;}if((BlockMatrix[offsetY+y+Tetris[nBlockKind][nBloc kState].a.y][x+Tetris[nBlockKind][nBlockState].a.x] !=-1)||(BlockMatrix[offsetY+y+Tetris[nBlockKind][nBlock State].b.y][x+Tetris[nBlockKind][nBlockState].b.x]! =-1)||(BlockMatrix[offsetY+y+Tetris[nBlockKind][nBlock State].c.y][x+Tetris[nBlockKind][nBlockState].c.x]! =-1)||(BlockMatrix[offsetY+y+Tetris[nBlockKind][nBlock State].d.y][x+Tetris[nBlockKind][nBlockState].d.x]! =-1)){return TRUE;}return FALSE;}BOOL LeftOrRightCheckCollideBlock(int offsetX, int offsetY, int rank){if(y==-1){return FALSE;}if((BlockMatrix[y+Tetris[nBlockKind][nBlockState].a.y][offsetX+x+Tetris[nBlockKind][nBlockState].a.x] !=-1)||(BlockMatrix[y+Tetris[nBlockKind][nBlockState].b .y][offsetX+x+Tetris[nBlockKind][nBlockState].b.x]! =-1)||(BlockMatrix[y+Tetris[nBlockKind][nBlockState].c .y][offsetX+x+Tetris[nBlockKind][nBlockState].c.x]! =-1)||(BlockMatrix[y+Tetris[nBlockKind][nBlockState].d .y][offsetX+x+Tetris[nBlockKind][nBlockState].d.x]! =-1)){return TRUE;}return FALSE;}BOOL canRotate( int rank)//旋转{if(rank==0){return FALSE;}int tempState = (nBlockState+1)%4;if((BlockMatrix[y+Tetris[nBlockKind][tempState].a. y][x+Tetris[nBlockKind][tempState].a.x]!=-1) ||(BlockMatrix[y+Tetris[nBlockKind][tempState].b.y][x +Tetris[nBlockKind][tempState].b.x]!=-1)||(BlockMatrix[y+Tetris[nBlockKind][tempState].c.y][x +Tetris[nBlockKind][tempState].c.x]!=-1)||(BlockMatrix[y+Tetris[nBlockKind][tempState].d.y][x +Tetris[nBlockKind][tempState].d.x]!=-1)||(y+Tetris[nBlockKind][tempState].a.y>18 )|| (y+Tetris[nBlockKind][tempState].b.y>18 )||(y+Tetris[nBlockKind][tempState].c.y>18 )||(y+Tetris[nBlockKind][tempState].d.y>18 )||(x+Tetris[nBlockKind][tempState].a.x<0 || x+Tetris[nBlockKind][tempState].a.x>9)||(x+Tetris[nBlockKind][tempState].b.x<0 || x+Tetris[nBlockKind][tempState].b.x>9)||(x+Tetris[nBlockKind][tempState].c.x<0 || x+Tetris[nBlockKind][tempState].c.x>9)||(x+Tetris[nBlockKind][tempState].d.x<0 || x+Tetris[nBlockKind][tempState].d.x>9)){return FALSE;}return TRUE;}void DrawTetris( HDC hdc, int offsetX, int offsetY, int rank ){if(!BGame){return;}int iX=0;int iY=0;if((y+Tetris[nBlockKind][nBlockState].a.y+offsetY>18 )||(y+Tetris[nBlockKind][nBlockState].b.y+offsetY>18 )||(y+Tetris[nBlockKind][nBlockState].c.y+offsetY>1 8 )||(y+Tetris[nBlockKind][nBlockState].d.y+offsetY>1 8 )||DownCheckCollideBlock(offsetX,offsetY,rank)){BlockMatrix[y+Tetris[nBlockKind][nBlockState].a.y] [x+Tetris[nBlockKind][nBlockState].a.x] = c;//c是步骤1定义的变量,表示绘制背景时使用的图片下标。