俄罗斯方块详细设计说明书
俄罗斯方块课程设计说明书

俄罗斯方块课程设计说明书1 需求分析1.1 设计背景几乎每个人都玩过这个游戏,也是人们接触最多的一款游戏,诺基亚手机的流行使它成为大家随手就能玩的经典游戏,它一直为大家所爱,以前的俄罗斯方块程序都是采用的是黑白色,颜色单调乏味,现如今彩屏技术的成熟运用,更使这款小游戏的种类变化到无法统计,画面更加炫丽,功能更加完善,玩法也是层出不穷。
在当今色彩斑斓的信息时代不能在在颜色方面吸引更多的玩家,特别是喜欢画面鲜艳的小朋友的注意,这就意味着将失去很多的市场,鉴于此编写一个变换颜色的方块就可以符合广大玩家对色彩的需求。
1.2 设计目的尽管这是一项十分成熟的技术,但是对于汇编程序的初学者来说还是值得学习的,因为这款经典的小游戏包含了对计时、功能键、图像显示、背景音乐、逻辑跳转等众多的编程基础技术,具有代表性意义。
按照汇编语言程序设计的基本原理,综合运用所学的知识,以小组为单位,设计开发一个小型的俄罗斯方块。
通过对一个实际问题的分析、设计与实现,将原理与应用相结合,使学生学会如何把书本上学到的知识用于解决实际问题,培养学生的动手能力;另一方面,使学生能深入理解和灵活掌握教学内容。
1.3 设计内容方块移动、旋转;显示分数;参数设置;菜单功能;文件操作。
1.4 设计要求(1)方块左右移动、落下、旋转;(2)显示分数、游戏进行时间和当前时间日期;(3)参数设置:如修改功能键、音乐、改变颜色、速度、屏幕分辨率等;(4)菜单功能:如开始、结束、暂停、设置环境参数等;(5)文件操作:读文件、写文件等(如环境和参数设置等);(6)预先显示下一个方块;2 设计方案2.1 设计思想玩家在开始游戏前会选择游戏难度级别,难度通过方块下落的速度分为快、中、慢三类。
以中为例,进入游戏之后方块开始掉落,每种方块的颜色都不同,但其在移动、变形等操作时只改变形状,不改变颜色,每个方块下落开始同时右上方会显示下一个要掉落的方块及其颜色;当方块不能再落下,即与已落下的方块堆在一起时颜色会变为和之前落下的方块一样的颜色,表明这个方块已不能操作,此时分数加1;若某一行堆满,则消去这一行,此时分数加10,;这期间方块下落一行,每消除一行都有声音提示。
俄罗斯方块游戏设计原理

俄罗斯方块游戏是VHDL 应用于复杂数字系统的一个经典设计,本章将详细介绍该游戏的设计原理和设计方法。
其中包括系统构成、系统设计原理和系统各个模块的实现方法。
8.1 系统结构原理8.1.1 系统端口图8.1给出了系统的顶层设计符号,其端口包括:1)kc :PS/2键盘时钟输入; 2)kd :PS/2键盘数据输入; 3)mclk :系统主时钟输入;4)blue :蓝色信号输出到VGA 显示器接口; 5)grn :绿色信号输出到VGA 显示器接口; 6)red :红色信号输出到VGA 显示器接口; 7)hs :行扫描信号到VGA 显示器接口;8)vs :列扫描信号到VGA 显示器接口要开始一个游戏按F2键,但是当游戏正在运行时,不允许按键F2,如果要开始一个新的游戏必须停止它或者按键F1。
该游戏有5个不同的目标,可以对它进行旋转和左移或右移。
该游戏有4种不同的速度,当分数增加的时候,速度也随之增加,按键S 将增加速度,直到目标到达最底部。
速度和分数的关系是: 1)当分数<100,速度等级为1;2)当分数在(100,200)之间时,速度等级为2; 3)当分数在(200,300)之间时,速度等级为3; 4)当分数在>300时,速度等级为4;如图8.2所示,有两种不同的目标:右边是文本框,左边是俄罗斯方块。
使用两个BRAM 存储数据。
文本框中包含了32x16=512个字符,每个字符包含8比特,所以需要使用BRAM 。
在俄罗斯方块部分也使用了一个BRAM ,但其实这不是必须的,因为这增加了gamecontrol 模块的设计复杂度(只能在一个时钟周期访问一个BRAM )。
俄罗斯方块有10x20个块组成,每个块保存了4位(第1位用于说明是否有其它东西,其它3位保持着颜色)。
在屏幕上画像素需要25MHz 时钟,在设计中使用3线来传送颜色。
这也就是说,只能画出8种颜色(红,绿,蓝,黄,黑,白,浅绿和紫红)。
游戏开发俄罗斯方块设计说明书

游戏开发设计说明书题目俄罗斯方块学号2011115010812 学生姓名袁帅指导教师谢逸所在班级计科1108班专业名称计算机科学与技术目录游戏开发设计说明书 (1)目录 (2)一.课程设计主要内容 (3)1. 题目 (3)2. 需求分析 (3)3. 设计环境 (3)二.详细设计说明 (4)1. 系统程序流程图 (4)2. 系统概要说明 (5)3. 功能说明 (5)4. 系统各函数及知识点说明 (5)三.游戏运行说明 (14)1.游戏运行流程图 (14)1. 游戏开始 (14)2. 游戏进行 (15)3. 游戏结束 (15)四.课程设计总结 (16)一.课程设计主要内容1.题目俄罗斯方块2.需求分析制作一个俄罗斯方块的小游戏,用户能够通过上下左右键来控制方块,满行消去。
3.设计环境运行环境:windows xp,windows 2003 windows 7开发环境:vc 6.0编写语言:c++二.详细设计说明1.系统程序流程图2.系统概要说明本程序是在vc6.0环境下编写的Windows应用程序,函数中利用了画图函数绘制基本方块模型,并通过相应键盘相应对应地执行相应的操作。
在产生7中不同类型的方块中,调用了随机函数,随机产生1~7中的任何一个数字,每一个数字都对应了不同的模块,通过这种方式,实现了游戏中其中不同模块的随机产生。
3.功能说明(1) 实现其中形状不同的方块(2) 实现各个方块的上下左右移动和旋转的功能;(3) 实现消行的功能;4.系统各函数及知识点说明1.主函数主函数为一有返回值型的整型函数,主要功能为执行游戏主线及定义边界。
2. DrawCell函数(画方格)DrawCell类的功能定义了单个方块的构架。
此类中,定义了一内一外两个正方形,使方块看起来更有立体感。
画正方形通过调用四个LineTo()函数,即画出一个张方形。
代码说明:void DrawCell (HDC hdc, int l, int t, int r, int b)// 函数DrawCell: 画【方格】, //参数: 设备环境句柄和【方格】的四角坐标,每个方格由内外两个【正方形】(DrawCell)画成,使其有立体感{MoveToEx (hdc, l+1, t+1, NULL);//内正方形, MoveToEx()函数,设置画笔当前位置的函数LineTo (hdc, r-1, t+1);//LineTo()函数,从当前位置向指定坐标点画直线的函数,x 和y为线段的终点坐标LineTo (hdc, r-1, b-1);LineTo (hdc, l+1, b-1);LineTo (hdc, l+1,t+1);MoveToEx (hdc, l+3, t+3, NULL);//外正方形LineTo (hdc, r-3, t+3);LineTo (hdc, r-3, b-3);LineTo (hdc, l+3, b-3);LineTo (hdc, l+3,t+3);}3. DrawBlock函数(画方块)此函数调用绘图函数,首先定义画笔,然后定义一个for循环,依次调用自定义的DrawCell函数,最后画出一个由四个方格组合成的方块代码说明:void DrawBlock (HDC hdc, int block[4][2])// 函数DrawBlock: 画【方块】// 参数: 设备环境句柄和【方块】中四个【方格】在游戏区域中的位置{int i;HPEN hpen;hpen =CreatePen(PS_SOLID,1,RGB(255,255,255));//用指定的样式、宽度和颜色创建一个画笔,PS_SOLID—画笔画出的是实线SelectObject(hdc,hpen);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
俄罗斯方块说明

俄罗斯方块单人版1、需求分析俄罗斯方块,或称积木游戏,它是利用一些形状各异却又是用正方形组成的方块,经过不同位置不同角度的变化之后,堆积在一起的一种智力游戏。
2、概要设计而从编程的角度讲,只需要提供各种方块的图形,提供几个键盘操作键以供方块的形状和位置的变化,提供几个功能函数以供游戏的正常进行。
各种方块图形:利用数组定形,然后利用随机函数随机地不按顺序地按游戏的需要而出现。
功能函数将在变量函数里面介绍。
3、详细设计添加位图:封面:IDB_BITMAP1背景:IDB_BITMAP2方块:IDB_BITMAP4添加菜单:开始:ID_MENU_START接着就是定义变量了,但是,由于这个游戏要添加的变量和函数太多了,要建一个新类。
是否应该先添加应该类呢?最好是这样。
因为新类将会涉及到变量。
添加普通类Crussia,见下图。
图4-1-1添加变量函数:由于两个类一共有很多变量函数,列举如下:View.h :Public://俄罗斯类CRussia russia;//开始标志bool start;//封面CBitmap fenmian;//暂停BOOL m_bPause;//开始菜单afx_msg void OnMenuStart();//计时器afx_msg void OnTimer(UINT nIDEvent);//键盘操作afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);// Russia.h:Public://游戏数组int Russia[100][100];// 当前图形int Now[4][4];//上一图形int Will[4][4];//变换后的图形int After[4][4];//当前图形的左上角位置CPoint NowPosition;//当前可能出现的图形形状数,int Count;//游戏结束bool end;//级别int m_Level;//速度int m_Speed;//分数int m_Score;//行列数int m_RowCount,m_ColCount;//方块CBitmap fangkuai;//背景CBitmap jiemian;//显示分数等内容void DrawScore(CDC*pDC);//消行void LineDelete();//方块移动void Move(int direction);//方块变化,即方向键上键操作bool Change(int a[][4],CPoint p,int b[][100]);//是否与原来方块接触,或与边界接触bool Meet(int a[][4],int direction,CPoint p);//显示下一个方块void DrawWill();//显示界面void DrawJiemian(CDC*pDC);//开始void Start();然后,就可以一步一步地实现游戏了。
俄罗斯方块游戏的方案设计书_java课设_含可运行程序

}3.设计结果与分析调试程序,没有错误后开始运行,进入游戏界面模块图4 进入游戏界面图选择确定后进入游戏界面,设置了此容器为边界布局,控制面板上设置六个控制按钮。
将显示面板放在中央,控制面板放在右侧。
"开始游戏"、"退出游戏"、"提高速度"、"降低速度"、"提高关数"、"降低关数"。
,分数模块设置字体格式按网格布局添加四个标签,设置标签格式Show(),加边框。
四个标签分别"当前得分"、"当前速度"、"当前闯关"、"勇往直前"。
图5 游戏界面图游戏开始前可以选择游戏的速度和关数从而设置游戏的难度,游戏开始的默认难度速度为1级,关数也为1级所得学分为0,设置的关数越高,难度就越大。
游戏开始后,就不可以改变难度,只能选择暂停和退出程序。
图6 提高级别后运行界面图玩家开始玩游戏后,如果在方块没有到达顶端的前提下可以消除一行,当前得分自动增加100分,当方块到达顶端时而无法消除,生成的方块不能再下了,则游戏结束,出现游戏结束的界面模块,出现你也太差劲了几个字样。
图7 游戏结束界面图游戏结束后显示本次游戏的得分数,点击确定后就可以继续选择进行游戏。
图8 本次游戏得分界面图当游戏结束或者中途想重新玩游戏的时候,就可一选择新游戏选项或者点击ctrl+n进行新游戏。
点击退出或者快捷键ctrl+x就退出游戏界面。
图9 进入新游戏界面图一轮游戏是一个大循环,在这个循环中,每隔100毫秒,检查游戏中的当前块是否已经到底了,如果没有,就继续等待。
如果到底了,就看有没有全填满的行,如果有就删除它,并为游戏者加分,同时随机产生一新的当前块,让它自动下落。
当新产生一个块时,先检查画布最顶上的一行是否已经被占了,如果是,可以判断Game Over了。
俄罗斯方块设计书

俄罗斯方块设计书1项目开发目的1.1熟练掌握已经学习的C语言基础,利用项目开发巩固已学习的知识;1.2扩展C语言知识:在完成项目的同时学习更高级的C语言知识,仅仅掌握课堂所学内容是远远不够的,需要通过项目扩展自己的C语言知识库;1.3掌握规范编码的基本要求,养成良好的编码习惯;1.4学习一个项目的基本开发过程,练习开发文档的编写;2需求说明本项目主要开发一个功能简单的俄罗斯方块游戏。
开发环境如下:Win-TC开发工具俄罗斯方块需求如下:2.1界面需求分析2.1.1界面分辨率大小测定2.1.2界面设计2.2功能需求分析2.2.1初始化游戏开始时,初始化屏幕、记分牌、级别、速度。
2.2.2设定游戏级别和速度等待玩家设置游戏级别和速度,给出开始按键提示,具体要求如下:a)通过下划线闪烁提示玩家正在修改的是级别还是速度,利用左键和右键在两者之间进行切换;b)通过上下键改变级别和速度:按上键数字变小,按下键数字变大,当数字由0变-1时,修改-1为9,当数字由9变10时,修改10为0;c)打印提示语:press ENTER to play,提示玩家按回车键开始游戏;d)按下回车,下划线不再闪烁,屏幕上显示已设定的级别和速度;e)按其他键无效,保持按键前的状态。
2.2.3根据游戏级别初始化方块布局当回车键按下开始游戏后,需要根据设定的游戏级别初始化游戏池中的方块布局,当级别为0时,池中为空,无预先放置的随机生成的方块,每增加一个级别,在初始的游戏池中就增加一行不完整的方块组,以增加游戏难度,最多有9行。
2.2.4绘制各种俄罗斯方块每个俄罗斯方块由4个小方块组成,总共有直线形、田字形、丁字形、Z字形、7字形五类俄罗斯方块,除了田字形其他各类俄罗斯方块都可以变形,因此可以得出共有19种形状的方块,而且每一种形状经过变形后只能变换到另一种形状的方块。
2.2.5时钟中断处理程序通过时钟中断处理程序控制程序的等待时长、方块移动的速度等。
俄罗斯方块单片机课程设计作品说明书

单片机课程实训作品说明书姓名:武跃忠完成时间:2016年7月4日一、作品说明介绍1.作品名称:掌上游戏机(俄罗斯方块)2.作品实现功能:a)按下、左、右键控制图形改变位置;b)图形在落到底部和障碍物上时,把图形变为障碍物;c)复位键使游戏重新开始;d)暂停/继续键可以暂停、继续游戏3.选择目的:实践单片机课程所学到的知识。
二、作品操作介绍1.作品外观图⑮⑭①点阵屏:显示障碍物以及图形②零欧电阻,用作飞线③ 16个1K欧电阻,用来限制电流大小④ STC12C5A60S2单片机,用来烧录烧录主控程序,是整个作品的控制器⑤ 74LS154N芯片(4-16)译码器,用来产生列选信号⑥电源指示灯:通电时点亮⑦微动开关1:向上的按键,用于改变图形⑧排针:用于连接电源正负极以及RXD和TXD⑨ 10K欧电阻,用来限制通过电源指示灯的电流⑩微动开关2:功能按键,用于游戏的复位操作⑪自锁开关:实现整体的电源总控制(断负)⑫微动开关3:功能按键,用于游戏的暂停/继续⑬微动开关4:向右的按键,用于图形右移⑭微动开关5:向下的按键,用于图形下移⑮微动开关6:向左的按键,用于图形左移2.作品功能介绍及操作说明a)给游戏机上电①将电源正极接在排针处标有VCC的位置②将电源负极接在排针处标有GND的位置③按下自锁开关完成上电b)让图形移动或改变图形朝向①按向上键:改变图形的朝向②按向下键:让图形瞬间落到可以下落的最下方③按向左键:图形向左移动一位④按向右键:图形向右移动一位c)游戏暂停/继续、复位①按暂停/继续键:游戏暂停/继续②按复位键:游戏复位,重新开始三、作品制作说明1.电路原理图2.3.PCBa)主板正面图(见附录1)b)主板F5图(见附录2)c)主板F6图(见附录3)d)屏幕正面图(见附录4)e)屏幕F5图(见附录5)f)屏幕F6图(见附录6)四、产品控制程序/*************************************************************** *作品名称:掌上游戏机(俄罗斯方块)制作时间:2016年6月21日程序修改时间:2016年6月23日程序基本框架完善2016年6月25日完成图形生成,简单移动2016年6月29日完善图形移动函数,添加图形生成数量2016年7月1日排除致命BUG2016年7月2日重新整理图形生成逻辑,重写图形生成函数2016年7月3日写出图形变形函数,游戏载入动画2016年7月4日排除已知BUG,完善游戏整体运行逻辑*************************************************************** **/#include<stc12c5a60s2.h>#include<stdlib.h>sbit key_left=P3^4; //方向按键左sbit key_right=P3^7; //方向按键右sbit key_up=P3^5; //方向按键上sbit key_down=P3^6; //方向按键下sbit key_start=P3^3; //功能按键暂停,开始sbit key_reset=P3^2; //功能按键复位unsigned char shape[16][2]; //图形落地之前unsigned char map[16][2]; //障碍物图形落地之后//line用来在显示时候标记列数,shapeIndex用来记录当前形状,shapex、shapey用来记录图形所在位置unsigned char line,shapeIndex,shapex,shapey; unsigned char code fk[2][2]={{1,1}, //方块{1,1}};unsigned char code sx1[4][4]={{0,1,0,0}, //竖线{0,1,0,0},{0,1,0,0},{0,1,0,0}};unsigned char code sx2[4][4]={{0,0,0,0},{0,0,0,0},{1,1,1,1},{0,0,0,0}};unsigned char code zl1[3][3]={{1,0,0}, //正L形{1,0,0},{1,1,0}};unsigned char code zl2[3][3]={{0,0,1},{1,1,1},{0,0,0}};unsigned char code zl3[3][3]={{0,1,1},{0,0,1},{0,0,1}};unsigned char code zl4[3][3]={{1,1,1},{1,0,0},{0,0,0}};unsigned char code fl1[3][3]={{0,1,0}, //反L形{0,1,0},{1,1,0}};unsigned char code fl2[3][3]={{1,1,1},{0,0,1},{0,0,0}};unsigned char code fl3[3][3]={{0,1,1},{0,1,0},{0,1,0}};unsigned char code fl4[3][3]={{1,0,0},{1,1,1},{0,0,0}};unsigned char code zz1[3][3]={{1,0,0}, //正Z形{1,1,0},{0,1,0}};unsigned char code zz2[3][3]={{0,1,1},{1,1,0},{0,0,0}};unsigned char code fz1[3][3]={{0,1,0}, //反Z形{1,1,0},{1,0,0}};unsigned char code fz2[3][3]={{1,1,0},{0,1,1},{0,0,0}};unsigned char code txz1[3][3]={{0,1,0}, //T形{1,1,1},{0,0,0}};unsigned char code txz2[3][3]={{0,0,1},{0,1,1},{0,0,1}};unsigned char code txz3[3][3]={{1,1,1},{0,1,0},{0,0,0}};unsigned char code txz4[3][3]={{1,0,0},{1,1,0},{1,0,0}};bit game_reset; //用来标记游戏是否被重置void shapeLeft(bit flag); //声明图形左移的函数void delay(unsigned int i) //软件延时函数{unsigned int j;while(i--)for(j=600;j>0;j--);}void mapClear(void) //清除背景数组函数{unsigned int i,j;for(i=0;i<16;i++)for(j=0;j<2;j++)map[i][j]=0;}void shapeClear(void) //清除图形数组函数{unsigned int i,j;for(i=0;i<16;i++)for(j=0;j<2;j++)shape[i][j]=0;}void shapeToMap(void) //把图形变为背景的函数{unsigned int i,j;for(i=0;i<16;i++)for(j=0;j<2;j++)map[i][j]|=shape[i][j];}void txToShape() //把图形载入到shape数组{//i,j为循环变量,t,k为临时变量,其他为指向各种大小的二位数组的指针unsigned char i,j,t,k,(*tx2)[2],(*tx3)[3],(*tx4)[4];shapeClear();switch(shapeIndex) //根据需要的图形的标号,找到对应的图形数组{case 0:tx2=fk;k=2;break;case 1:tx4=sx1;k=4;break;case 2:tx4=sx2;k=4;break;case 3:tx3=zl1;k=3;break;case 4:tx3=zl2;k=3;break;case 5:tx3=zl3;k=3;break;case 6:tx3=zl4;k=3;break;case 7:tx3=fl1;break; case 8:tx3=fl2;k=3;break; case 9:tx3=fl3;k=3;break; case 10:tx3=fl4;k=3;break; case 11:tx3=zz1;k=3;break; case 12:tx3=zz2;k=3;break; case 13:tx3=fz1;k=3;break; case 14:tx3=fz2;k=3;break; case 15:tx3=txz1;k=3;break; case 16:tx3=txz2;k=3;break; case 17:tx3=txz3;k=3;break; case 18:tx3=txz4;break;}switch(k) //把找到的图形数组放入shape数组中{case 2:for(i=0;i<k;i++){for(j=0;j<k;j++){if(tx2[i][j]==1){if(i+shapex>7){t=(0x01<<(i+shapex-8));shape[15-shapey-j+1][1]|=t;}else{t=(0x01<<(i+shapex));shape[15-shapey-j+1][0]|=t;}}}}break;case 3:for(i=0;i<k;i++){for(j=0;j<k;j++){if(tx3[i][j]==1){if(i+shapex>7){t=(0x01<<(i+shapex-8));shape[15-shapey-j+1][1]|=t;}else{t=(0x01<<(i+shapex));shape[15-shapey-j+1][0]|=t;}}}break;case 4:for(i=0;i<k;i++){for(j=0;j<k;j++){if(tx4[i][j]==1){if(i+shapex>7){t=(0x01<<(i+shapex-8));shape[15-shapey-j+1][1]|=t;}else{t=(0x01<<(i+shapex));shape[15-shapey-j+1][0]|=t;}}}}break;}}void shapeCreat(void) //创建一个新图形的函数{shapex=0;shapey=7;shapeIndex=rand()%19;txToShape();}bit shapeAndMap() //检测是否与障碍物重叠{unsigned char i,j,t;for(i=0;i<16;i++)for(j=0;j<2;j++){t=map[i][j]&shape[i][j];if(t>0)return 0;return 1;}bit shapeDown(void) //图形下移函数{unsigned char i,t;bit flag;flag=1;for(i=0;i<16;i++) //检测是否到底部{if(shape[i][1]>=0x80){shapeToMap();flag=0;break;}}if(flag){for(i=0;i<16;i++) //图形下移{t=(shape[i][0]>=0x80)?1:0;shape[i][0]<<=1;shape[i][1]<<=1;shape[i][1]|=t;}shapex++;flag=shapeAndMap();if(!flag) //重叠则撤销下移操作{for(i=0;i<16;i++){t=(shape[i][1]%2==1)?0x80:0;shape[i][0]>>=1;shape[i][1]>>=1;shape[i][0]|=t;}shapeToMap(); //将图形转换为障碍物}}return flag;}/****************************************图形左右移函数,参数flag表示移动模式为0时无条件移动,为1时会检测是否可移动****************************************/void shapeRight(bit flag) //图形右移函数{unsigned char i,t;if(shape[0][0]==0&&shape[0][1]==0) //没移动到墙体则右移{for(i=0;i<15;i++){shape[i][0]=shape[i+1][0];shape[i][1]=shape[i+1][1];}shape[15][0]=0;shape[15][1]=0;shapey++;}else{flag=0;}if(flag){for(i=0;i<16;i++) //检测移动是否合法,非法则撤销{t=shape[i][0]&map[i][0];if(t!=0x00){shapeLeft(0);break;}t=shape[i][1]&map[i][1];if(t!=0x00){shapeLeft(0);break;}}}}void shapeLeft(bit flag){unsigned char i,t;if(shape[15][0]==0&&shape[15][1]==0) //没移动到墙体则左移{for(i=15;i>0;i--){shape[i][0]=shape[i-1][0];shape[i][1]=shape[i-1][1];}shape[0][0]=0;shape[0][1]=0;shapey--;}elseflag=0;if(flag){for(i=0;i<16;i++) //检测移动是否合法,非法则撤销{t=shape[i][0]&map[i][0];if(t!=0x00){shapeRight(0);break;}t=shape[i][1]&map[i][1];if(t!=0x00){shapeRight(0);break;}}}}void shapeChange(unsigned char oldShape){bit flag; //标记图形是否在合理范围//i,j为循环变量,k为临时变量,存储需要数组的大小,其他为指向各种大小的数组的指针unsigned char i,j,k,(*tx2)[2],(*tx3)[3],(*tx4)[4];switch(shapeIndex) //根据图形当前状态得出图形下一个状态{case 0:return;break;case 1:shapeIndex=2;tx4=sx2;k=4;break;case 2:shapeIndex=1;tx4=sx1;k=4;break;case 3:shapeIndex=4;tx3=zl2;k=3;break;case 4:shapeIndex=5;tx3=zl3;k=3;break;case 5:shapeIndex=6;tx3=zl4;k=3;break;case 6:shapeIndex=3;tx3=zl1;k=3;break;case 7:shapeIndex=8;tx3=fl2;k=3;break;case 8:shapeIndex=9;tx3=fl3;k=3;break;case 9:shapeIndex=10;tx3=fl4;k=3;break;case 10:shapeIndex=7;tx3=fl1;k=3;break;case 11:shapeIndex=12;tx3=zz2;k=3;break;case 12:shapeIndex=11;tx3=zz1;k=3;break;case 13:shapeIndex=14;tx3=fz2;k=3;break;case 14:shapeIndex=13;tx3=fz1;k=3;break;case 15:shapeIndex=16;tx3=txz2;k=3;break;case 16:shapeIndex=17;tx3=txz3;k=3;break;case 17:shapeIndex=18;tx3=txz4;k=3;break;case 18:shapeIndex=15;tx3=txz1;k=3;break;}flag=1;for(i=0;i<k&&flag;i++) //判断变形后图形有没有移动出规定范围{for(j=0;j<k&&flag;j++){switch(k){case 2:if((shapey==0||shapey+j>16)&&tx2[i][j]==1)flag=0;break;case 3:if((shapey==0||shapey+j>16)&&tx3[i][j]==1)flag=0;break;case 4:if((shapey==0||shapey+j>16)&&tx4[i][j]==1)flag=0;break;}}}if(flag)txToShape(); //如果没有移动出范围则变形if(!shapeAndMap()) //如果变形后与障碍重叠则撤销操作{shapeIndex=oldShape;txToShape();}}void deleteLine(void) //删除某行函数{unsigned char t,i,j,k,t1;for(j=0;j<2;j++){for(k=0;k<8;k++){for(i=0;i<16;i++) //判断某行是否全为1{t=0x80>>k;t&=map[i][j];if(t!=0x80>>k)break;}if(i==16) //全为1则消除{for(i=0;i<16;i++) //地图下移{if(j){t1=~(0xff>>k); //保存不需要消除的行t1&=map[i][1];t=(map[i][0]>=0x80)?1:0;map[i][0]<<=1; //障碍全体下移map[i][1]<<=1;map[i][1]|=t;t=0xff>>k; //把不需要消除的行放回原处map[i][1]&=t;map[i][1]|=t1;}else{t1=~(0xff>>k); //保存不需要消除的行t1&=map[i][0];t=(map[i][0]>=0x80)?1:0;//上部障碍下移map[i][0]<<=1;t=0xff>>k; //把不需要消除的行放回原处map[i][0]&=t;map[i][0]|=t1;}}}}}}void shapeMoveDown(void) //图形直接移动到底部{while(shapeDown());}void shapeMove(void) //图形移动的主控函数{unsigned char i;bit isStart; //用来标记游戏是否在运行1为在运行0为暂停isStart=1;do{for(i=0;i<70;i++) //延时且检测按键状态{if(!key_right&&isStart) //方向右键{delay(20);if(!key_right)shapeRight(1);while(!key_right);delay(20);}if(!key_left&&isStart) //方向左键{delay(20);if(!key_left)shapeLeft(1);while(!key_left);delay(20);}if(!key_down&&isStart) //方向下键{delay(20);if(!key_down)shapeMoveDown();while(!key_down);delay(20);}if(!key_up&&isStart) //方向上键{delay(20);if(!key_up)shapeChange(shapeIndex);while(!key_up);delay(20);}if(!key_start) //功能键暂停继续{delay(20);if(!key_start)isStart=~isStart;while(!key_start);delay(20);}if(!key_reset) //功能键复位{delay(20);if(!key_reset)game_reset=1;while(!key_reset);delay(20);if(game_reset)return;}if(!isStart)i--;delay(10);}}while(shapeDown());deleteLine();deleteLine();deleteLine();deleteLine();}bit gameOver(void) //判断游戏是否结束{unsigned int i;bit game_over;game_over=0;for(i=0;i<16;i++){if(map[i][0]%2==1) //如果顶端有障碍则游戏结束{game_over=1;break;}}return game_over;}void init(void) //初始化函数{P0M1=0x00; //设置IO口为强推模式P0M0=0xff;P2M1=0x00;P2M0=0xff;TMOD=0X01; //开启定时计数器EA=1;ET0=1;TH0=(65536-1000)/256;TL0=(65536-1000)%256;TR0=1;mapClear(); //初始化地图数组shapeClear(); //初始化图形数组game_reset=0; //初始化游戏结束标志}void loadGame() //游戏载入动画{unsigned char i;for(i=0;i<16;i++){if(i<8){map[i][0]=map[i][1]=0xff;map[15-i][0]=map[15-i][1]=0xff;delay(50);}else{map[i-8][0]=map[i-8][1]=0x00;map[15-(i-8)][0]=map[15-(i-8)][1]=0x00;delay(50);}}mapClear();delay(500);}void main(void){ready: init();loadGame();while(1){if(!gameOver()){shapeCreat();shapeMove();}if(!key_reset){delay(20);if(!key_reset)game_reset=1;while(!key_reset);delay(20);}if(game_reset)goto ready;}}void display(void) interrupt 1 //图形显示函数{TR0=0;TH0=(65536-1000)/256;TL0=(65536-1000)%256;P1=line;P2=shape[line][0]|map[line][0];P0=shape[line][1]|map[line][1];line++;if(line==16)line=0;TR0=1;}附录1附录3附录4附录6。
俄罗斯方块项目细设计说明书

百度文库- 让每个人平等地提升自我C语言版俄罗斯方块项目详细设计说明书杰普物联网研发中心Briup IOT R&D Center文档类型:☐需求文档☐计划文档☑设计文档☐测试文档☐用户文档☐工程文档☐维护文档密级:☑公开资料☐内部资料☐保密资料☐机密资料版权声明上海杰普软件有限公司版权所有,保留一切权利。
未经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档的部分或全部,并以任何形式传播。
产品支持服务我们将不断改进我们的产品和用户手册,使其更完善、更便于使用,您的意见和建议对我们的工作非常重要,您可以用您喜欢的任何方式与我们联系。
我们的联系地址和电话是:公司地址:邮编:215300电话:传真:网址:文档修改/审批记录目录1简介 (6)1.1目的 (6)1.2范围 (6)1.3参考资料 (6)1.4术语定义及说明 (6)2系统详细设计 (7)2.1主流程 (7)2.2功能模块框图 (7)2.3非功能模块介绍 (7)3模块详细设计 (8)3.1游戏模块 (8)3.1.1功能概述 (8)3.1.2界面概述 (8)3.1.3类(结构)设计 (9)3.1.4关键逻辑与算法说明 (9)3.1.5访问的表或其他数据实体 (9)3.1.6调用外部接口说明 (9)3.1.7提供调用接口说明 (10)3.1.8模块内部使用的公共函数、包的说明 (10)3.1.9流程逻辑 (10)3.1.10尚未解决的问题 (11)3.2预览模块 (11)3.2.1功能概述 (11)3.2.2界面概述 (11)3.2.3类(结构)设计 (11)3.2.4关键逻辑与算法说明 (12)3.2.5访问的表或其他数据库实体 (12)3.2.6调用外部接口说明 (12)3.2.7提供调用接口说明 (12)3.2.8模块内部使用的公用函数/包等的说明 (12)3.2.9流程逻辑 (13)3.2.10尚未解决的问题 (13)3.3等级积分表模块 (13)3.3.1功能概述 (13)3.3.2界面概述 (13)3.3.3类设计 (14)3.3.4关键逻辑与算法说明 (14)3.3.5访问的表或其他数据实体 (14)3.3.6调用外部接口说明 (14)3.3.7提供调用接口说明 (14)3.3.8模块内部使用的公共函数、包的说明 (14)3.3.9流程逻辑 (14)3.3.10尚未解决的问题 (14)4限制条件 (14)5测试计划 (14)6附录: (14)1简介1.1 目的阐述C语言实现俄罗斯方块游戏的界面的功能和界面设计。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式根据其目的可分为三种类型:创建型模式、结构型模式和行为型模式,共有23种。
本文将结合其中的几个设计模式阐述俄罗斯方块游戏的基本设计思想。
俄罗斯方块(Tetris, 俄文:Тетрис)是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。
俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
由于上手简单、老少皆宜,从而家喻户晓,风靡世界。
一. 绪论 (4)
1. 俄罗斯方块游戏简介 (4)
2. 俄罗斯方块游戏规则 (4)
二. 需求分析与游戏设计 (5)
1. 游戏界面 (5)
2. 方块控制 (6)
3. 图形显示 (6)
三、模块设计 (6)
1. 开始模块 (6)
2. 方块的生成 (7)
3. 方块的控制 (8)
4. 方块的预览 (9)
5. 消行、计分 (10)
一. 绪论
1.俄罗斯方块游戏简介
原本是前苏联科学家阿列克谢·帕基特诺夫所开发的教育用软件,之后开始提供授权给各个游戏公司,造成各平台上软件大量发行的现象。
Game Boy版的俄罗斯方块在日本卖出424万套,是Game Boy史上卖最好的游戏。
海湾战争时,也是前线美军最常拿消磨时间的游戏之一。
由于俄罗斯方块具有的数学性、动态性与知名度,也经常拿来作为游戏程序设计的练习题材。
俄罗斯方块曾经造成的轰动与带来的经济价值,可以说是世界游戏史上的一个奇迹。
它看似简单却又变化无穷,令人上瘾。
相信大多数用户都还记得为它痴迷得“茶不思饭不想”的那个俄罗斯方块时代。
俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。
作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。
2.俄罗斯方块游戏规则
1.游戏主画面在一个用于摆放方块的面板上
2.(1)一组由4个小型正方形组成的规则图形(即方块)共有7种形状,分别为一字形、田字形、7字形、反7形、Z形、反Z形、T形。
(2)一字形:一次最多消除四层
田字形:消除一至二层
7字形:最多消除三层,或消除二层
反7形:最多消除三层,或消除二层
Z形:最多二层,容易造成孔洞
反Z形:最多二层,容易造成孔洞
T形:最多二层
3. 方块从区域上方开始下落,玩者可以按指定按钮左右移动方块、逆时针旋转方块,以及让方块加速落下。
4. 方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。
5. 当区域中某一行横向格子全部由方块填满,则该列会消失,玩家得分。
6. 当固定的方块累积堆到一定层数(设计游戏时设置)时,游戏结束。
7. 游戏分为初级、中级、高级三关。
8. 游戏会提示下一个要落下的方块形状,并随着游戏的进行而加速提高难度。
二. 需求分析与游戏设计
1.游戏界面
良好的用户界面设计。
本游戏主要有三个界面,一是主游戏区的面板,显示变化和下落的方块;二是用于放置按钮以及显现游戏信息的面板,三是双人对战时用以显示对方游戏信息的面板。
2.方块控制
方块下落时,可通过特定按钮对该方块进行翻转、加速,以及向左、向右移动等操作。
3.图形显示
随机给出不同的形状(一字形、田字形、7字形、反7形、Z形、反Z形、T 形),下落填充给定的区域,填满一行则消掉记分,当达到一定的分数时过关,共设置五关。
每关方块下落的速度不同,方块累积到一定层数无法再消去行时游戏结束。
三、模块设计
1.开始模块
2.方块的生成
a.文件导入
b.变量定义
c.函数定义
3.方块的控制
d.文件导入
e.变量定义
f.函数定义
4.方块的预览
g.文件导入
h.变量定义
i.函数定义
5.消行、计分
a.文件导入
标准
b.变量定义
c.函数定义
文案。