俄罗斯方块C语言程序设计报告
C语言编写俄罗斯方块实验报告
C语言编写俄罗斯方块实验报告实验报告一、实验目的实践C语言的基本语法和操作,测试自己对C语言的熟练程度,实现俄罗斯方块游戏的基本功能。
二、实验步骤1.定义游戏界面:使用二维数组定义游戏界面,用字符来表示方块的状态(空白、正在下落的方块、已经固定的方块)。
2.实现方块的生成和选择:定义方块的类型,通过随机数生成下一个方块,用一个变量来保存下一个方块的类型,并在游戏界面上进行展示。
3.实现方块的下落和移动:方块可以通过用户的操作左右移动和旋转,同时也会自动下落,每当方块到达底部或者碰到已经固定的方块时,就会停止下落。
4.实现方块的旋转:将方块表示为二维数组,通过改变数组元素的位置实现方块的旋转。
5.实现方块的消除:当一行方块被填满时,该行会消除,并且上面的方块会下落填充空缺。
三、实验结果成功实现了俄罗斯方块的基本功能,可以进行游戏的开始、暂停、重新开始、结束等操作。
在游戏过程中,方块可以通过键盘的方向键左右移动,通过按下空格键进行快速下落,通过旋转方向键进行方块的旋转。
当方块都不能下落时,游戏结束,会提示游戏结束的信息,并显示最终得分。
四、实验总结通过本次实验,我进一步了解了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-俄罗斯方块-课程设计报告-刘阳
c-俄罗斯方块-课程设计报告-刘阳吉林工程技术师范学院信息工程学院《 C语言程序设计》课程设计报告题目: 俄罗斯方块专业: 计算机科学与技术班级: 计算机1241 姓名: 刘阳学号: 1201044120 指导教师:郭天娇时间:2013年6月17日至2013年6月28日摘要俄罗斯方块,Tetris, 俄文,Тетрис,是一款风靡全球的电视掌上游戏机游戏,它由俄罗斯人阿列克谢•帕基特诺夫发明,故得此名。
俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
由于上手简单、老少皆宜,从而家喻户晓,风靡世界。
原本是前苏联科学家阿列克谢•帕基特诺夫所开发的教育用软件,之后开始提供授权给各个游戏公司,造成各平台上软件大量发行的现象。
由于俄罗斯方块具有的数学性、动态性与知名度,也经常拿来作为游戏程序设计的练习题材。
俄罗斯方块曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事,它看似简单但却变化无穷,令人上瘾。
相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。
俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。
作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。
关键字,经典俄罗斯方块游戏I目录摘要 .............................................. 错误~未定义书签。
错误~未定义书签。
目录 ..................................................................... ............................................... 1第一章课程设计的目的 ..................................................................... ............. 2 第二章设计方案的论证 ..................................................................... .......... 3-4 第三章设计实现过程 ..................................................................... ................. 5 第四章调试运行及结果分析 ..................................................................... .. 6-7 第五章测试及问题探讨 ..................................................................... ............. 8 第六章课设总结及体会 ..................................................................... ............. 9 第七章致谢 ..................................................................... ............................... 10 第八章参考文献 ..................................................................... ....................... 11 第九章附录 ..................................................................... .......................... 12-361第一章课程设计目的俄罗斯方块家喻户晓,他能动态进行显示和判断方块位置,能对程序的综合设计有更深入的了解,同时对程序的综合开发,创新了思路,增长了开发经验。
c语言 俄罗斯方块
如 box[0]="0x88",box[1]="0xc0",其中 0x88 和 0xc0 为十六进制表示形式,具体表现
的含义如图 3.3 所示。
SHAPE 结构示意图 2.2.3 程序结构(流程图)
4
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
2.2.4 各模块的功能及程序说明 左移的实现过程如下: (1) 判断在当前的游戏底板中能否左移。这一判断必须满足如下两条件:游戏方块整
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
第 1 章 课程设计的目的与要求
1.1 课程设计目的 本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程
序设计语言(C)》课程后进行的一次全面的综合练习。本课程设计的目的和任务: 1. 巩固和加深学生对 C 语言课程的基本知识的理解和掌握 2. 掌握 C 语言编程和程序调试的基本技能 3. 利用 C 语言进行基本的软件设计 4. 掌握书写程序设计说明文档的能力 5. 提高运用 C 语言解决实际问题的能力
5
辽 宁 工 业 大 学 课 程 设 计 说 明 书(论 文)
体左移一位后,游戏方块不能超越游戏底板的左边线,否则越界;并且在游戏方块有值(值 为 1)的位置,游戏底板必须是没有被占用的(占用时,值为 1)。若满足这两个条件,则 执行下面的左移动作。否则不执行左移动作。
(2) 清除左移前的游戏方块。 (3) 在左移一位的位置,重新显示此游戏方块。 右移的实现过程如下: (1) 判断在当前游戏底板中能否右移。这一判断必须满足如下两个条件:游戏方块整 体右移一位后,游戏方块不能超越游戏底板的右边线,否则越界;并且在游戏方块有值(值 为 1)的位置,游戏底板必须是没有被占用的(占用时,值为 1)。若满足这两个条件,则 执行下面的右移动作。否则不只执行右移动作。 (2) 清除右移前的游戏方块。 (3) 在右移一位的位置,重新显示此游戏方块。 下移的实现过程如下: (1) 判断在当前游戏底板中能否下移。这一判断必须满足如下两个条件:游戏方块整 体下移一位后,游戏方块不能超越游戏底板的底边线,否则越界;并且在游戏方块有值(值 为 1)的位置,游戏底板必须是没有被占用的(占用时,值为 1)。若满足这两个条件,则 执行下面的下移动作。否则,将 flag_newbox 标志置 1,主循环中会判断此标志,若为 1, 则会生成下一个游戏方块,并更新预览游戏方块。 (2) 清除下移前的游戏方块。 (3) 在下移一位的位置,重新显示此游戏方块。 旋转的实现过程如下: (1) 判断在当前游戏底板中能否旋转。这一判断必须满足如下条件:游戏方块整旋转 后,游戏方块不能超越游戏底板的左边线、右边线和底边线,否则越界;并且在游戏方 块有值(值为 1)的位置,游戏底板必须是没有被占用的(占用时,值为 1)。若满足这些条 件,则执行下面的旋转动作。否则不只执行旋转动作。 (2) 清除旋转前的游戏方块。 (3) 在游戏方块显示区域(4×4)不变的位置,利用保存当前游戏方块的数据结构中的 next 值作为旋转后形成的新游戏方块的编号,并重新显示这个编号的游戏方块。 当生成新的游戏方块前,执行行满的检查,判断行满的过程为: 一次从下到上扫描游戏底板中的各行,若某行中 1 的个数等于游戏底板水平方向上的
俄罗斯方块C#程序设计报告
河北联合大学2011-2012第2学期《软件设计基础-C#》课程设计报告设计名称:俄罗斯方块姓名:冯玉杰学号:201114210217专业班级:工业工程2班学院:机械工程学院设计时间:5月10日—5月28日设计地点:学校机房目录1.课程设计目的 ···············································································2.课程设计任务与要求 ······································································3.课程设计说明书 ············································································4.课程设计成果 ···············································································5.程序调试过程 ···············································································6.设计问题的不足和改进方案 ·····························································7.课程设计心得 ···············································································8.附录 ···························································································9.参考文献 ·····················································································《软件设计基础-C#》课程设计报告第 11 页,共 29 页square4.location = new Point(square4.location.X + squareSize, square4.location.Y);Draw(GameField.winHandle);return true;}else //如果不能右移了{return false;}}/*旋转block*/public void Rotate(){//保存每个小块的位置Point oldPosition1 = square1.location;Point oldPosition2 = square2.location;Point oldPosition3 = square3.location;Point oldPosition4 = square4.location;//保存当前的方向RotateDirections oldRotation = myRotation;//开始试着旋转方块,旋转方向:顺时针方向 旋转中心点为形状拐点Erase(GameField.winHandle);switch(blockType){case BlockTypes.square:break;case BlockTypes.line://直线的旋转只有两种方向switch (myRotation){case RotateDirections.North:myRotation = RotateDirections.East;square1.location = new Point(square2.location.X-squareSize,square2.location.Y);square3.location = new Point(square2.location.X+squareSize,square2.location.Y);square4.location = new Point(square2.location.X + 2 * squareSize, square2.location.Y);break;case RotateDirections.East:myRotation = RotateDirections.North;square1.location = new Point(square2.location.X,square2.location.Y-squareSize);square3.location = new Point(square2.location.X, square2.location.Y +squareSize);square4.location = new Point(square2.location.X, square2.location.Y + 2 * squareSize);break;}break;case BlockTypes.J://J形方块有四种旋转方向switch (myRotation)《软件设计基础-C#》课程设计报告第 12 页,共 29 页{case RotateDirections.North:myRotation = RotateDirections.East;square1.location = new Point(square3.location.X+2*squareSize,square3.location.Y);square2.location = new Point(square3.location.X+squareSize,square3.location.Y);square4.location = new Point(square3.location.X,square3.location.Y-squareSize);break;case RotateDirections.East:myRotation = RotateDirections.South;square1.location = new Point(square3.location.X,square3.location.Y+2*squareSize);square2.location = new Point(square3.location.X,square3.location.Y+squareSize);square4.location = new Point(square3.location.X+squareSize,square3.location.Y);break;case RotateDirections.South:myRotation = RotateDirections.West;square1.location = new Point(square3.location.X-2*squareSize,square3.location.Y);square2.location = new Point(square3.location.X-squareSize,square3.location.Y);square4.location = new Point(square3.location.X,square3.location.Y+squareSize);break;case RotateDirections.West:myRotation = RotateDirections.North;square1.location = new Point(square3.location.X,square3.location.Y-2*squareSize);square2.location = new Point(square3.location.X,square3.location.Y-squareSize);square4.location = new Point(square3.location.X-squareSize,square3.location.Y);break;}break;case BlockTypes.L://L形方块有四种旋转方向switch (myRotation){case RotateDirections.North:myRotation = RotateDirections.East;square1.location = new Point(square3.location.X+2*squareSize,square3.location.Y);square2.location = new Point(square3.location.X+squareSize, square3.location.Y);square4.location = new Point(square3.location.X, square3.location.Y+squareSize);break;case RotateDirections.East:myRotation = RotateDirections.South;square1.location = new Point(square3.location.X, square3.location.Y + 2 * squareSize);square2.location = new Point(square3.location.X, square3.location.Y + squareSize);square4.location = new Point(square3.location.X - squareSize, square3.location.Y);break;case RotateDirections.South:myRotation = RotateDirections.West;square1.location = new Point(square3.location.X - 2 * squareSize, square3.location.Y);《软件设计基础-C#》课程设计报告第 13 页,共 29 页square2.location = new Point(square3.location.X - squareSize, square3.location.Y);square4.location = new Point(square3.location.X, square3.location.Y - squareSize);break;case RotateDirections.West:myRotation = RotateDirections.North;square1.location = new Point(square3.location.X, square3.location.Y - 2 * squareSize);square2.location = new Point(square3.location.X, square3.location.Y - squareSize);square4.location = new Point(square3.location.X + squareSize, square3.location.Y);break;}break;case BlockTypes.T://T形方块也有四种旋转方向switch (myRotation){case RotateDirections.North:myRotation = RotateDirections.East;square1.location = new Point(square2.location.X,square2.location.Y-squareSize);square3.location = new Point(square2.location.X, square2.location.Y+squareSize);square4.location = new Point(square2.location.X-squareSize, square2.location.Y);break;case RotateDirections.East:myRotation = RotateDirections.South;square1.location = new Point(square2.location.X+squareSize, square2.location.Y);square3.location = new Point(square2.location.X-squareSize, square2.location.Y);square4.location = new Point(square2.location.X, square2.location.Y-squareSize);break;case RotateDirections.South:myRotation = RotateDirections.West;square1.location = new Point(square2.location.X, square2.location.Y+squareSize);square3.location = new Point(square2.location.X, square2.location.Y-squareSize);square4.location = new Point(square2.location.X+squareSize, square2.location.Y);break;case RotateDirections.West:myRotation = RotateDirections.North;square1.location = new Point(square2.location.X-squareSize, square2.location.Y);square3.location = new Point(square2.location.X+squareSize, square2.location.Y);square4.location = new Point(square2.location.X, square2.location.Y+squareSize);break;}break;case BlockTypes.Z://Z形方块有两种旋转方向switch (myRotation){case RotateDirections.North:《软件设计基础-C#》课程设计报告第 14 页,共 29 页myRotation = RotateDirections.East;square1.location = new Point(square2.location.X, square2.location.Y - squareSize);square3.location = new Point(square2.location.X - squareSize, square2.location.Y);square4.location = new Point(square2.location.X - squareSize, square2.location.Y +squareSize);break;case RotateDirections.East:myRotation = RotateDirections.North;square1.location = new Point(square2.location.X-squareSize, square2.location.Y);square3.location = new Point(square2.location.X, square2.location.Y+squareSize);square4.location = new Point(square2.location.X+squareSize,square2.location.Y+squareSize);break;}break;case BlockTypes.S://S形方块有两种旋转方向switch (myRotation){case RotateDirections.North:myRotation = RotateDirections.East;square1.location = newPoint(square3.location.X+squareSize,square3.location.Y+squareSize);square2.location = new Point(square3.location.X+squareSize, square3.location.Y);square4.location = new Point(square3.location.X, square3.location.Y-squareSize);break;case RotateDirections.East:myRotation = RotateDirections.North;square1.location = new Point(square3.location.X-squareSize,square3.location.Y+squareSize);square2.location = new Point(square3.location.X, square3.location.Y+squareSize);square4.location = new Point(square3.location.X+squareSize, square3.location.Y);break;}break;}//旋转之后检测位置是否冲突if (!(GameField.isEmpty(square1.location.X / squareSize, square1.location.Y / squareSize)&&GameField.isEmpty(square2.location.X / squareSize, square2.location.Y / squareSize)&&GameField.isEmpty(square3.location.X / squareSize, square3.location.Y / squareSize)&&GameField.isEmpty(square4.location.X / squareSize, square4.location.Y / squareSize))){//如果有冲突则回到原来的状态myRotation = oldRotation;square1.location = oldPosition1;square2.location = oldPosition2;square3.location = oldPosition3;《软件设计基础-C#》课程设计报告第 15 页,共 29 页square4.location = oldPosition4;}Draw(GameField.winHandle);}/*检测是否到顶*/public int Top(){returnMath.Min(square1.location.Y,Math.Min(square2.location.Y,Math.Min(square3.location.Y,square4.location.Y)));}}}《软件设计基础-C#》课程设计报告 ⑴功能描述第 16 页,共 29 页本系统为一个用 C#实现的为我们所熟悉的简单的俄罗斯方块游戏,该系统的具体功能如下:1). 能简便的开始游戏,游戏中的方块的功能与日常我们所熟悉的游戏的功能一致,各种块的设置也一致, 包括块的旋转,加速下降,平移,满行消去,到顶游戏结束功能;2). 能够自定义游戏中功能键的具体按键,设置游戏的级别,即方块下降的速度等,并在设置后立即生效,在 游戏中立刻体现,在下次程序运行时读取上次设置的游戏环境;3). 显示下一方块提示信息,以及游戏数据的统计,如速度,按键速度,分数行者等等;4). 游戏有级别设置,级别越高,方块下降的速度越快,当到达一定分数后进入下一级别;⑵概要设计主要写模块说明,模块结构图,系统流程图(例 N-S 流程图)(五号,宋体)模块结构图:根据功能分析,建立系统的体系结构,即将整个系统分解成若干子模块,用框图表示各功能模块之间 的接口关系。
c语言程序设计 俄罗斯方块
{"0000110000"},
{"0001001000"},
{"0010000100"},
{"0100000010"}}},
{{{"0000000000"}, //5
{"0000000000"},
{"1011001101"},
{"0101111010"}}},
{{{"0000000000"}, //16
{"0000000000"},
{"0000200000"},
{"0000000000"},
{"1010101010"},
{"0001001000"},
{"0010000100"},
{"0010200100"},
{"0001111000"},
{"0001001000"},
{"0001001000"}}},
{{{"0000000000"}, //6
{"0001201000"},
{"0001111000"},
{"0001111000"}}},
{{{"0000000000"}, //3
{"0000000000"},
{"0000000000"},
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++俄罗斯方块实验报告(附实验体会)
程序设计综合实验设计文档惠州学院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语言俄罗斯方块试验报告,包括源程序
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语言编写俄罗斯方块实验报告
`````````学院:数计学院班级:13级数媒班学号:姓名:摘要……………………………………………………………………………………………………..关键字:目录第一部分设计总概........................................................................................................................... 摘要…………………………………………………………………………………………………一、设计目的.............................................................................................................................二、设计要求.............................................................................................................................三、设计内容.............................................................................................................................四、系统分析与设计................................................................................................................. 第二部分数据结构设计................................................................................................................... 第三部分功能实现与程序调试………………………………………………………………….第四部分完成设计...........................................................................................................................一、实习日记.............................................................................................................................二、实习总结.............................................................................................................................三、教师评语.............................................................................................................................四、程序使用说明书………………………………………………………………………….第一部分设计总概一、设计目的二、设计要求三、设计内容四、系统分析与设计第二部分数据结构设计第三部分功能实现与程序调试第四部分完成设计一、实习日记:二、实习总结:………………………三、教师评语:设计成绩:指导老师签名:摘要使用C语言编写一个俄罗斯方块游戏系统,要求程序运行后有一个图形用户界面,实现各种方块的生产,包括形状和颜色等信息,完成左右下旋转的功能,在消行的同时分数加10,在点击暂停或者按下空格的时候暂停或开始游戏,最后结束游戏.关键字:音乐、背景、按键控制、暂停、继续、停止,难度级别第一部分设计总概一、设计目的:本课程设计是一个综合性的实践教学环节,目的在于促进学生复习和巩固计算机软件设计知识,加深对软件设计方法、软件设计技术和设计思想的理解,并能运用所学知识进行开发。
vc++俄罗斯方块
西安科技大学计算机学院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)游戏结束五、实验心得这次的实验是这学期的第三次实验,通过这次实验我学到了很多东西。
俄罗斯方块 C课程设计论文(报告)
辽宁工业大学C语言程序设计课程设计(论文)题目:俄罗斯方块游戏院(系):软件学院专业班级:电子商务112班学号: 111401043学生姓名:张欢廷指导教师:武志刚教师职称:讲师起止时间: 2011.12.05至2011.12.18课程设计(报告)任务及评语目录第1章课程设计的目的与要求 (1)1.1 课程设计目的 (1)1.2 课程设计的实验环境 (1)1.3 课程设计的预备知识 (1)1.4 课程设计要求 (1)第2章课程设计内容 (2)2.1课程设计题目 (2)2.2课程设计整体设计说明 (2)2.2.1课程设计内容 (2)2.2.2系统功能模块结构图........................... 错误!未定义书签。
2.2.3数据结构设计及用法说明 (2)2.2.4程序结构(画流程图) (3)2.2.5各模块的功能 (3)2.3程序源代码及注释 (3)第3章课程设计总结 (12)参考资料 (13)第1章课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行Windows 2000/XP操作系统的微机系统。
C语言程序设计及相应的开发环境。
1.3 课程设计的预备知识熟悉C语言及C语言开发工具。
1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章课程设计内容2.1程序功能介绍1、一个用于摆放小型正方形的平面虚拟场地,其标准大小:行宽为10,列高为20,以每个小正方形为单位。
俄罗斯方块编程课程设计报告
课程设计报告题目:俄罗斯方块设计设计者:* *专业班级:* *学号:* *指导教师:* *所属系部:* ** *年* *月* *日、目录目录 .................... 错误!未定义书签。
一.设计的目的和要求..... 错误!未定义书签。
二.设计内容............. 错误!未定义书签。
三.设计任务............. 错误!未定义书签。
四.游戏基本规则......... 错误!未定义书签。
五.总体设计............. 错误!未定义书签。
六.详细设计与程序实现... 错误!未定义书签。
七.主要处理流程.......... 错误!未定义书签。
八.游戏设计源程序........ 错误!未定义书签。
九.截图 ................. 错误!未定义书签。
十心得体会.............. 错误!未定义书签。
十一参考文献............ 错误!未定义书签。
一.设计的目的和要求加深对《C语言》课程所学知识的理解,进一步巩固C语言语法规则。
学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力。
二.设计内容在熟练掌握C语言的基本知识:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。
进一步掌握各种函数的应用,包括时间函数、绘图函数,以及文件的读写操作等。
三.设计任务1.游戏欢迎界面。
2.游戏执行功能,包括计算得分。
3.游戏结束界面。
四.游戏基本规则游戏共由7种不同形状的方块组成,游戏开始以后随机产生一个方块由屏幕的顶端开始向下落下,落到低端则固定到桌面,并开始下一个方块。
在游戏窗口的左边作为游戏的桌面,用宽度10和高度20的表格表示。
游戏桌面的右边靠上显示得分,最下边显示游戏帮助。
C++课程设计实验报告(俄罗斯方块)
一、需求分析1.1系统概述该游戏在DOS下为玩家提供传统俄罗斯方块游戏的基本功能,玩家可以通过键盘控制在游戏区中堆积软件随机提供的由四个小方块不同组合的7种类型不同颜色的方块,每个小方格的颜色也是随机的,并且在整个下落的过程中,其颜色也呈动态变化。
游戏过程中,每在游戏区堆满一行后,自动消除并记分。
同时消去的行数越多,那一次性所加的分数也就越多。
一行是100,两行是200,三行是400,四行是500分。
为了得到更多的分,那么我们游戏者就要想办法一次尽可能多的消去方块。
当游戏区不能再堆积新来的方块时,游戏结束。
游戏设定3个级别,初级,中级和高级,每个级别有分三个小的级别,级别越高,方块下降的速度越快、难度越大。
为了避免游戏频发枯燥,增加游戏的趣味性,该游戏为游戏者插入了音乐,对该功能有实现暂停的控制。
该游戏的以“英雄榜”来判断玩家水平的高低,如果玩家的得分大于了保存的最高分,则将玩家的的得分写入文件,如果得分不大于最高分,则保持不变。
游戏以最终玩家获得的分数来判断玩家水平的高低。
1.2功能需求描述这次实验以及部分功能的实现都是一次小小的尝试,获得不错的效果。
这个游戏,不仅可以满足游戏爱好者对游戏的要求,同时我们增加了趣味性,让游戏有一个比较好听的背景音乐,在玩游戏的同时,让玩家饱享视听大宴。
这有别于常规的俄罗斯方块算法,游戏中,玩家依靠自己消层来得分,而且保证了玩家对游戏趣味性的追求,并且游戏的英雄榜功能为玩家提供了一个良好的测试水平的平台。
当玩家游戏池中的砖块累积到顶端时游戏失败。
二、系统设计2.1 数据流程图数据流图是对系统数据流向的一种描述,并从本质上让程序的使用者,大致了解系统的使用方法。
本俄罗斯游戏的大致流程图如下:2.2 程序功能模块2.3程序流程图三、关键代码描述3.1 程序模块详细设计3.1.1 界面初始化程序界面程序在启动运行时,系统会通过调用视图类中的重绘图函数对界面进行界面的初始化。
c语言俄罗斯方块实验报告
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语言编写俄罗斯方块实验报告
实验目的:通过编写俄罗斯方块游戏,加深对C语言的理解和掌握程度,提高编程能力。
实验内容:利用C语言编写一个简单的俄罗斯方块游戏,实现方块的下落、旋转和消除等功能。
实验步骤:
1.定义一个二维数组来表示游戏画面,使用数字来表示不同的方块,例如1表示方块,0表示空白。
2.初始化游戏画面,设置游戏窗口的大小和方块的大小。
3.实现方块的下落功能,通过循环来不断更新方块的位置,使其向下移动。
4.实现方块的旋转功能,通过按键来旋转方块的形状,可以采用矩阵转置的方法来实现旋转功能。
5.判断方块是否可以继续下落,如果到达底部或者下方有其他方块,则停止下落,并将方块固定在该位置。
6.检测是否有一行被填满,如果有,则消除该行并将上方的方块往下移动一行。
7.判断游戏是否结束,如果方块无法继续下落,则游戏结束。
8.实现计分功能,每消除一行方块就增加一定的得分。
实验结果:编写完成俄罗斯方块游戏后,可以在控制台或者图形界面上运行游戏,通过键盘控制方块的下落和旋转,消除满行方块并得分。
实验总结:通过本次实验,我对C语言的掌握和理解有了更深入的认识,通过实际动手编写俄罗斯方块游戏,加深了对于数组、循环和条件语
句等基本知识的运用,提高了编程能力和逻辑思维能力。
在编写游戏过程中,我遇到了一些问题,如方块的位置计算、旋转算法的实现等,但通过
查阅资料和不断调试,最终成功解决了这些问题,取得了较好的实验效果。
通过本次实验,我不仅提高了编程能力,还锻炼了耐心和解决问题的
能力,深刻体会到了实践的重要性,希望在今后的学习和工作中能够继续
努力,不断提升自己的编程水平和能力。
俄罗斯方块C课程设计报告
.课程设计报告题目:基于C++俄罗斯方块学院:专业:学号:姓名:二○一三年十二月经典小游戏设计-俄罗斯方块一、需求分析。
1.1、游戏需求随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T 字型)下落填充给定的区域,若填满一条便消掉,若在游戏中各形状填满了给定区域,为输者,弹出相应提示。
1.2、游戏界面需求良好的用户界面,有关信息显示(如操作方法、等级等)。
让方块在一定的区域内运动和变形,该区域用一种颜色表明,即用一种颜色作为背景,本游戏的背景设为黑色。
还需用另一种颜色把黑色围起来,宽度适中,要实现美感。
而不同的方块用不同的着色表示,使游戏界面更加清晰、有条理。
消层时采用一定的时间延迟,增加视觉消行的感官效果。
1.3、游戏方块需求良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、L字形、反L形、T字型)以及另外本程序另外加入的点形方块,各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。
为体现游戏的趣味性和扩展性,本游戏象征性的增加了点形方块,其他更多形状的方块可用类似方法增加。
1.4、游戏控制的需求游戏控分为多个方面,包括画面绘制,控制命令的获取,控制命令的分配、控制命令的处理,方块的绘制,方块的移动,方块的旋转,方块下落和消层以及计分等。
对各个命令的合理处理和综合控制十分重要,一旦出错可能导致整个程序的崩溃,因此需要小心设计。
二、系统设计。
2.1、程序流程图:2.2、游戏设计概述从整体上而言,在该游戏可设计一个方块类,其中包括对方块的信息描述(如:ID)、方块的操作(如:旋转、下沉)。
再设计一个控制类,实现各种控制(如:获取控制信号,分发控制信号)。
另定义一个游戏区类,用以处理游戏区绘制等内容。
框图如方块类(GAME_BLOCK)游戏区类(Window)Private: BLOCKINFO g_CurBlock; Private: 无在主函数中(按照2.1中框图),先通过控制类初始化游戏,再通过随机时间函数获得一个随机数,该随机数确定一个方块,即用该随机数产生一个ID从而确定产生的为方块。
C课程设计俄罗斯方块
c课程设计俄罗斯方块G#程序设计实训报告题目:俄罗斯方块专业—计算机科学与技术年级班别计算机09-2班学生姓名指导教师=一系统设计要求课题分析错误!未定义书签。
设计环境设计思路二课题总体框架设计程序流程图类的结构图三课题实现程序主界面开始游戏界面游戏结束界面暂停游戏界面关键程序代码四总结设计总结设计体会212122一、系统设计要求1.1课题分析本游戏系统是利用C#实现的,是制作为我们所熟悉的非常简单的俄罗斯方块游戏,该系统能实现的具体功能如下: 1).能简便的开始游戏,游戏中的方块的功能与日常我们所熟悉的游戏的功能一致,各种块的设置也一致,包括方块的旋转,加速下降,左右移动,满行消去,满行消去自动加分,以及到顶游戏结束等功能;2).能够经过对话框窗体说明各个功能的使用说明,以及一些其它功能。
3).界面简洁美观,简单易用。
跟其它一般的游戏相差不大。
1.2设计环境本程序选择Visual Studio作为实验环境。
设计思路用面向对象的方法分析系统对于俄罗斯方块的程序制作,我们能够定义一个或者几个类,专门来描述俄罗斯方块,在这个类中,包含与之相关的方法、属性和字段,经过封装,实现其业务逻辑。
其中,每一个俄罗斯方块都有相同的特征,由4个小正方形构成,有旋转,左右移动,下落的动作,整行被填满除去并计算分数而构成行的小正方体块。
基中块的形状类型有7种:田、一、L、倒L、Z、倒Z、上。
在窗口中经过调用主窗体Forml当中的菜单栏来设置游戏的开始、暂停、结束、重新开始以及推出程序。
还能够经过其菜单中游戏说明选项来查看游戏各个键的使用说明,还可调用帮助菜单来查看版权说明。
二、课题总体框架设计、程序流程图2.2.类的结构图S B —c-ass X *Formrndmon+ ?『3sh10-eB-od<V Fomu ClassX -bismjie Q vs s< < < <> r <QgV4 < <VED2. •Qd 0s 3B 0mR og sTop B-oekc一*纭q 代代d * £fcpbuuonlcomponents labc-lldbc_2 ldbe-3labe-5%_%_&_but?3厂c-inkDispose你dhionEdhionJ.oakdTnitQ-zecomp …P3g 53 Q U Ks i w ^E-W5 Mbskco-o rV f or*®c o -o rV -o d o r l* 22®D 址册< O s s<^s ssing-e巴ock«|9 CESCD G;buttonlcomporwms -abed一ab 业 2-oba-3-Abe-4MbeJ5 -3bd16buHonlfchk Dispose『nHi •亍•comp …nfDat 电** 弋*、**%*、*、*%*、*、**%*、**%%、**CQmpoMntscerrentB-odeulbe-1_o b c_2 mencsMpl. 3启ne^Block piebrevicY piemsek scoreMertLOEion二i--Runingcs ^o1i351~02stripMem・議港-ogstrpg老屯yroostr?.7wfro2stHP,.^{srrogstrip!«s s -o o -«,js±rroostrpgK^T O O -beginGomeoppose FofwlF231$Act壬「:FoffplJ<ayDO… Fofwl_Lood Inhia-izecomp• Pierz 墨・c :.5ho,Mag先颈WTOO一sgp!%7rJ67oo_strip,・H ?O FiSUToo 一stnp・・l ^^T OO 一 5q ・程序主界面开始游戏界面③诱5访决•旦(回r■■■■IT■■■■■ ■•・■■■ ■■游戏结束⑧密Sf«決 S ⑥ 22;3・SK.5H 希戏便R••+T40下一仆■■1■ ■Game Over !■ ■ ■■■■■ ■■ ■■■■ ■ ■ ■■■..・・■ ■ ■■・ ■■・ ■■暂停关键程序代码1、Forml 类1)构造函数,设定当前运行的方块,下一个即将出现的方块,方块产生的位置,玩家积分,游戏开关等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
a[tetris->x+2][tetris->y]=b[3];
break;
}
case 7:
//T 字顺时针转 270 度方块
{
a[tetris->x][tetris->y-1]=b[1];
a[tetris->x][tetris->y+1]=b[2];
a[tetris->x+2][tetris->y]=b[3];
a[tetris->x-2][tetris->y]=b[2];
a[tetris->x-2][tetris->y+1]=b[3];
break;
}
case 10:
//Z 字顺时针转 180 度方块
{
a[tetris->x][tetris->y-1]=b[1];
a[tetris->x-2][tetris->y-1]=b[2];
a[tetris->x][tetris->y+1]=b[2];
a[tetris->x-2][tetris->y]=b[3];
break;
}
俄罗斯方块程序设计报告 2017-1-13
case 6:
//T 字顺时针转 180 度方块
{
a[tetris->x][tetris->y-1]=b[1];
a[tetris->x-2][tetris->y]=b[2];
a[tetris->x][tetris->y+1]=b[2];
a[tetris->x+2][tetris->y+1]=b[3];
a[tetris->x+2][tetris->y]=b[2];
a[tetris->x+4][tetris->y]=b[3];
break;
}
case 3:
//直线方块: |
{
a[tetris->x][tetris->y-1]=b[1];
a[tetris->x][tetris->y-2]=b[2];
a[tetris->x][tetris->y+1]=b[3];
}
俄罗斯方块程序设计报告 2017-1-13
}
4)、制作俄罗斯方块
void make_tetris(struct Tetris *tetris)
{
a[tetris->x][tetris->y]=b[0]; //中心方块位置的图形状态:1-有,0-无
switch(tetris->flag)
//共 6 大类,19 种类型
for(i=2;i<2*Frame_width-2;i+=2)
{
gotoxy(hOut,FrameX+i,FrameY);
printf("═");
//打印上横框
}
for(i=2;i<2*Frame_width-2;i+=2)
{
gotoxy(hOut,FrameX+i,FrameY+Frame_height);
printf("Esc :退出游戏");
gotoxy(hOut,FrameX,FrameY);
//打印框角并记住该处已有图案
printf("╔");
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);
printf("╗");
gotoxy(hOut,FrameX,FrameY+Frame_height);
//记住左竖框有图案
}
for(i=1;i<Frame_height;i++)
{
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);
printf("║");
//打印右竖框
a[FrameX+2*Frame_width-2][FrameY+i]=2; //记住右竖框有图案
在本次设计中,要求支持键盘操作和若干种不同类型方块的旋转变换,并且 界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越 高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,为玩家提 供了不同的选择。
二、功能分析
I、俄罗斯方块游戏需要解决的问题包括: ⑴、随机产生方块并自动下移 ⑵、用 Esc 键退出游戏 ⑶、用 键变体 ⑷、用 键和 键左右ntf("═");
//打印下横框
a[FrameX+i][FrameY+Frame_height]=2; //记住下横框有图案
}
for(i=1;i<Frame_height;i++)
{
gotoxy(hOut,FrameX,FrameY+i);
printf("║");
//打印左竖框
a[FrameX][FrameY+i]=2;
//7 字顺时针转 90 度方块
{
a[tetris->x-2][tetris->y]=b[1];
a[tetris->x-2][tetris->y+1]=b[2];
a[tetris->x+2][tetris->y]=b[3];
break;
}
case 14:
//7 字顺时针转 180 度方块
{
a[tetris->x][tetris->y-1]=b[1];
(4)、游戏信息提示功能。玩家进入游戏后,将有对本游戏如何操作的友情 提示。
(5)、游戏结束退出功能。判断游戏结束条件,通过 Esc 键进行退出。
打开程序,运行,进入界面 开始游戏
游
游
游
游
游
戏
戏
戏
戏
戏
方
方
数
信
结
块
块
据
息
束
预
控
显
提
退
览
制
示
示
出
功
功
功
功
功
否
能
能
能
能
能
俄罗斯方块程序设计报告 2017-1-13
俄罗斯方块程序设计报告 2017-1-13
C 语言课程设计报告
俄罗斯方块程序设计报告
一、 问题描述
俄罗斯方块(Tetris, 俄文:Тетрис)是一款电视游戏机和掌上游 戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的 基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行 或多行并且消除得分。
break;
}
case 12:
//7 字方块
{
俄罗斯方块程序设计报告 2017-1-13
a[tetris->x][tetris->y-1]=b[1];
a[tetris->x][tetris->y+1]=b[2];
a[tetris->x-2][tetris->y-1]=b[3];
break;
}
case 13:
printf("俄罗斯方块");
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7); //打印选择菜单
printf("**********下一个方块:");
gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);
printf("**********");
{
case 1:
//田字方块
{
a[tetris->x][tetris->y-1]=b[1];
a[tetris->x+2][tetris->y-1]=b[2];
a[tetris->x+2][tetris->y]=b[3];
break;
}
case 2:
//直线方块:----
{
a[tetris->x-2][tetris->y]=b[1];
break;
}
case 8:
//Z 字方块
{
a[tetris->x][tetris->y+1]=b[1];
a[tetris->x-2][tetris->y]=b[2];
a[tetris->x+2][tetris->y+1]=b[3];
break;
}
case 9:
//Z 字顺时针转 90 度方块
{
a[tetris->x][tetris->y-1]=b[1];
printf("╚");
gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);
printf("╝");
a[FrameX][FrameY+Frame_height]=2;
a[FrameX+2*Frame_width-2][FrameY+Frame_height]=2;
(3)、游戏数据显示功能。在游戏玩家进行游戏过程中,需要按照一定的游 戏规则给玩家计算游戏分数。例如,消除一行加 100 分,游戏分数达到一定数量