C语言编写俄罗斯方块实验报告

合集下载

c++俄罗斯方块程序实习报告

c++俄罗斯方块程序实习报告

程序实习报告学号:姓名:专业:班级:指导教师:通信与电子工程学院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语言编写俄罗斯方块实验报告

C语言编写俄罗斯方块实验报告实验报告一、实验目的实践C语言的基本语法和操作,测试自己对C语言的熟练程度,实现俄罗斯方块游戏的基本功能。

二、实验步骤1.定义游戏界面:使用二维数组定义游戏界面,用字符来表示方块的状态(空白、正在下落的方块、已经固定的方块)。

2.实现方块的生成和选择:定义方块的类型,通过随机数生成下一个方块,用一个变量来保存下一个方块的类型,并在游戏界面上进行展示。

3.实现方块的下落和移动:方块可以通过用户的操作左右移动和旋转,同时也会自动下落,每当方块到达底部或者碰到已经固定的方块时,就会停止下落。

4.实现方块的旋转:将方块表示为二维数组,通过改变数组元素的位置实现方块的旋转。

5.实现方块的消除:当一行方块被填满时,该行会消除,并且上面的方块会下落填充空缺。

三、实验结果成功实现了俄罗斯方块的基本功能,可以进行游戏的开始、暂停、重新开始、结束等操作。

在游戏过程中,方块可以通过键盘的方向键左右移动,通过按下空格键进行快速下落,通过旋转方向键进行方块的旋转。

当方块都不能下落时,游戏结束,会提示游戏结束的信息,并显示最终得分。

四、实验总结通过本次实验,我进一步了解了C语言的基本语法和操作,也体验到了编程的乐趣。

通过这个实验,我对C语言有了更深入的理解,在实现俄罗斯方块的过程中锻炼了自己的逻辑思维能力和编程能力。

同时,我也学会了如何进行代码的调试和优化,使得程序的运行更加流畅和高效。

在后续的学习中,我将更加深入地学习C语言的高级特性,不断提升自己的编程水平。

通过不断的实践和练习,我相信我可以在C语言编程方面取得更进一步的进展,完成更加复杂和有挑战性的任务。

总体而言,本次实验收获颇多,不仅提高了我的编程能力,也为我的学习之路打下了良好的基础。

我相信在今后的学习和工作中,这些经验将会成为我不断进步的动力和宝贵的财富。

俄罗斯方块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 程序设计实训报告_俄罗斯方块(1)

C 程序设计实训报告_俄罗斯方块(1)

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#俄罗斯方块实验报告

4.游戏逻辑架构
俄4.罗
游戏逻辑架构
斯方块游戏














退







5. 主要功能模块
开始游戏:
点击后游戏开始执行;
退出游戏:
点击后退出游戏;
暂停游戏:
点击后游戏暂停在即时状态;
加快速度、减慢速度: 落速度的快慢;
用于控制方块下
游戏成绩: 游戏速度:
显示当前游戏成绩; 显示当前方块下落速度;
俄罗斯方块实验报
一、 实验课题概述 1. 实验课题描述 俄罗斯方块是一个经典的小游戏,简单而有趣,但俄罗斯方块的设计 工作复杂且富有挑战性,它包含的内容多,涉及的知识广泛,与图形 界面联系较大,包括界面的显示与更新、数据收集等,在设计的过程 中,必将运用到各方面的知识,这对于 C#语言设计者而言,是个很 好的锻炼机. 2. 课题主要任务 设计者首先要对游戏窗口进行合理规划和设计,尽量做到美观实用 (颜色搭配以及各个模块的位置),其次,也是最重要的,就是设计 者对整个程序代码的编辑,以实现游戏应有的功能。 3. 课题基本要求 不仅要求设计出的游戏能实现功能而且要使游戏的操作方便界面赏 心悦目。 4. 自己主要任务 设计者的主要任务就是完成对游戏窗口的设计和程序代码的编辑。 二、 实验课题设计 1. 课题需求分析 首先,设计者必须对俄罗斯方块有一定的了解,熟悉游戏的内容;再 者,设计者必须熟练掌握 C#语言并且熟悉 Visual Studio 2008(2010 也 可以)的开发环境,能够处理好各个类之间的集成关系和继承机制,

C语言课程设计(俄罗斯方块)

C语言课程设计(俄罗斯方块)

实训报告实训名称: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++俄罗斯方块实验报告(附实验体会)

程序设计综合实验设计文档惠州学院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语言俄罗斯方块试验报告,包括源程序

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左上角的小方格为
实验内容 游戏程序----俄罗斯方块
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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定义的变量,表示绘制背景时使用的图片下标。

相关文档
最新文档