您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 俄罗斯方块c语言详解
俄罗斯方块最详解做每一件事前,都会有一个粗略的构想。编程更应该这样,现在先说一些大的、粗略的东西。********************************************************************************************************************************************************************************目录:●屏幕的划分●图形显示●三种坐标。绝对坐标、相对坐标、左上角坐标●方块的构造●动画效果●键盘控制●判断方块碰撞●消行●变形●关于菜单的制作●附录(完整的源程序)********************************************************************************************************************************************************************************1、屏幕的划分将整个屏幕划分成四部分:a、一个没盖的杯子;b、一个不断下落4*4数组的盒子;c、一个给预览下一个方块4*4数组的盒子;d、提示信息。由于提示信息比较简单,这里只讨论前三样。没盖的杯子:即平时说玩这款游戏时,下落方块不可超出的那个边界,下落的方块从这个“杯口”的上方往下下落,方块只在“杯子”里移动、变形、停止。游戏空间指的是整个游戏主要的界面(呵呵,其实就是所说的“杯子”)。实际上是一个宽10格子、高20格子的游戏板。用一个全局数组GameSpace[22][12]表示。表示的时候:GameSpace[x][y]为1时表示游戏板上(x,y)这个位置上已经有方块占着了,GameSpace[x][y]为0表示游戏板上这位置还空着。为了便于判断形状的移动是否到边、到底,初始的时候在游戏板的两边各加一列,在游戏板的下面加一行,全部填上1,表示不能移出界。即GameSpace[x][0],GameSpace[x][11](其中x从0到20)初始都为1,GameSpace[20][y](其中y从0到11)初始都为1。0123456789100■□□□□□□□□□□■1■□□□□□□□□□□■2■□□□□□□□□□□■3■□□□□□□□□□□■4■□□□□□□□□□□■5■□□□□□□□□□□■6■□□□□□□□□□□■7■□□□□□□□□□□■8■□□□□□□□□□□■9■□□□□□□□□□□■10■□□□□□□□□□□■11■□□□□□□□□□□■12■□□□□□□□□□□■13■□□□□□□□□□□■14■□□□□□□□□□□■15■□□□□□□□□□□■16■□□□□□□□□□□■17■□□□□□□□□□□■18■□□□□□□□□□□■19■□□□□□□□□□□■20■■■■■■■■■■■■下落的4*4盒子:即7种标准的方块形状,如我认为比较经典的测试方块“7字形”可看作:01230□□□□{{0,0,0,0},1□■■□用数组表示则是{0,1,1,0},2□□■□{0,0,1,0},3□□■□{0,0,1,0}}预览4*4数组盒子:即玩这款游戏时,给看下一个方块是什么样的窗口。这三样东西可以这样联系起来:一个不断下落的盒子由杯子的上方下落到杯子底部,之后将预览盒子的东西放到下落的4*4盒子中,如此循环反复……2、图形显示Tc2.0中有两种显示模式,一种是我们所熟知的字符模式,另一种是图形模式。在字符模式下只能显式字符,如ASCII字符。一般是显示25行,每行80个字符。程序缺省的是字符模式。在字符模式下不能显式图形和进行绘图操作。要想进行图形显示和绘图操作,必须切换到图形模式下。Tc2.0中用initgraph()函数可以切换到图形模式,用closegraph()可以从图形模式切换回字符模式。initgraph()和closegraph()都是图形函数,使用图形函数必须包括头文件graphics.h。voidfarinitgraph(intfar*graphdriver,intfar*graphmode,charfar*pathtodriver);graphdriver是上涨指向图形驱动序号变量的指针;graphmode是在graphdriver选定后,指向图形显示模式序号变量的指针。pathtodriver表示存放图形驱动文件的路径。特别值得一提的是驱动文件路径的写法,由于有转义字符,如bgi文件夹(一般这个文件夹就在Tc文件夹目录下,这个说明文档黙认bgi在c:\,后面举的例子亦然)在c:\,写的时候很多人写成c:\bgi,少了个\,应写成c:\\bgi,切记。此外,我还强烈建议借一本叫《c作图与c汉字技术》的书,这是我见过介绍c绘图方面最全面的书了,为了节省时间,可以直接看这几个函数,这些函数均包含在头文件#includegraphics.h中voidline(intx,inty,intxx,intyy);/*从(x,y)到(xx,yy)处以setcolor()决定的颜色画直线*/voidsetlinestyle(intlinestyle,unsignedupattern,intthickness);/*linestyle变化范围为0~4,也可以是大写的英文*//*分别表示实线,点线,中心线,点画线,用户自定义线*//*upattern处一般写0*//*thickness只有1、3两个值,分别表示一个像素宽,三个像素宽*/voidsetcolor(intcolor);/*决定前景颜色,color变化范围为0~15也可以是大写的英文*/voidsetbkcolor(intcolor);/*决定背景颜色,color变化范围为0~15也可以是大写的英文*/voidrectangle(intx,inty,intxx,intyy);/*以(x,y)为左上角,以(xx,yy)为右下角画矩形*/voidbar(intx,inty,intxx,intyy);/*以(x,y)为左上角,以(xx,yy)为右下角画条形*/voidbar3d(intx,inty,intxx,intyy,intdepth,inttopflag);/*以(x,y)为左上角,以(xx,yy)为右下角画立体条形*//*depth决定了三维直方图的长度*//*当topflag非0时,画出三维顶,否则不画出三维顶*/voidsetfillstyle(intpattern,intcolor);/*pattern变化范围为0~12也可以是大写的英文*//*color变化范围为0~15也可以是大写的英文*/char*itoa(intn,char*str,intradix);/*n是要转的整型变量*//*str用来存的字符串*//*radix是按什么进制转化*//*能将整型数字转成字符型数字,结合outtextxy()*//*可将得分、菜单上的数值等简单地显示在屏幕上*/voidsettextjustify(inthoriz,intvert);/*horiz变化范围为0~2,也可以是大写的英文,分别代表左对齐,字符串中心对齐,右对齐*//*vert变化范围为0~2,也可以是大写的英文,分别代表底部对齐,中心对齐,顶部对齐*/voidsettextstyle(intfont,intdirection,intcharsize);/*font变化范围为0~12也可以是大写的英文*//*direction只能是0、1,也可以是大写的英文,0、1分别代表水平输出,垂直输出*//*charsize变化范围为1~10也可以是大写的英文,数值越大,字体越大*/voidouttextxy(intx,inty,char*str);/*按settextjustify()决定的对齐方式*//*以setcolor()决定的颜色,在(x,y)附近输出字符串*/(在第10点的小程序中有以上的大部分函数的实现)3、三种坐标。绝对坐标、相对坐标、左上角坐标绝对坐标:图形屏幕其实是个y轴的正方向朝下,原点在屏幕最左上角的直角坐标系,vga模式下的一般分辨率为640*480,这样就把屏幕横向、纵向分别平分640等分、480等分,横、纵坐标变化范围分别为0~639,0~479,每个像素点占用一个1的长度。我们说的绝对坐标就是以屏幕原点为相对点的切切实实的坐标。相对坐标:即以屏幕上某个绝对坐标为相对点(或把它看成原点),在这个基础上再计算的坐标。如以(0,0)为相对点,(1,1)的绝对坐标为(1,1),相对坐标为(1,1);以(2,2)相对点,(1,1)的绝对坐标为(1,1),相对坐标为(-1,-1)。左上角坐标:特别提出这个,是因为在俄罗斯方块中解决数组与屏幕连接的关健所在。如画个小正方形时用函数rectangle(x,y,x+单位长度,y+单位长度)(其中(x,y)为这个正方形的左上角坐标,单位长度可以是10,16,我就取了16,这样在640*480中便变成了(640/16)*(480/16)=40*30),又如前面说的GameSpace[21][12]可以这样化散为整成GameSpace[(x-相对原点的x)/单位长度][(y-相对原点的y)/单位长度]。4、方块的构造为了简单处理,我选择了数组构造方块,而不是坐标描点,但这样浪费空间。在要画的地方赋1,不画的地方赋0,如长条可表示为01230□■□□{{0,1,0,0},到了这里,我们应____1□■□□用数组表示则是{0,1,0,0},已深入的将各种方■■2□■□□{0,1,0,0},块看成由四个小正||看成■3□■□□{0,1,0,0}}形组成,如|_|■为突出立体感,可以在画了一个小正方形后,再用line()函数在这个小正方形的左上角坐标附近画横、纵两条白线,再在小正方形的右侧画一条黒线,如图是放大的小正方形________|______|(其中,里面的横线为白,里面左侧的纵线为白,里面右侧的纵线为黒)|||||||||||||________|在我的程序里就没搞立体感,只为体现算法而已。现在,整个屏幕在我们眼里应达到这样理性的看法:□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□■□□□■■■■■■□□□□□□□□□□■□□□□□■■□□□■□□□■□□□□■□□□□□□□□□□■□□□□■■□□□□■□□□■□■■□■□□□□□□□□□□■□□□□□□□□□□■□□□■□■■□■□□□□其中每个小正方形放大看为□□□□□□■□□□□□□□□□□■□□□■□□□□■□□□□□□□□□□■□□□□□□□□□□■□□□■■■■■■□□□□(x,y)______□□□□□□■□□□□□□□□□□■□□□□□□□□□□□□□||□□□□□□■□□□□□□□□□□■□□□□□□□□□□□□□||□□□□□□■□□□□□□□□□□■□□□□□□□□□□□□□||□□□□□□■□□□□□□□□□□■□□□□□□□□□□□□□|_______|□□□□□□■□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□■□□□□□□□□□□□□□(x,y)为左上角坐标□□□□□□■□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□■□□□□□□□□□□■□□□□□□□□□□□□□□□□□□□■□□□□□□□■□□■□□□□□□□□□□□□□□□□□□□■□□□□□□□■□□■□□□□□□□□□□□□□□□□□□
本文标题:俄罗斯方块c语言详解
链接地址:https://www.777doc.com/doc-3365337 .html