文档库 最新最全的文档下载
当前位置:文档库 › Tc2.0编写俄罗斯方块游戏剖析

Tc2.0编写俄罗斯方块游戏剖析

Tc2.0编写俄罗斯方块游戏剖析
Tc2.0编写俄罗斯方块游戏剖析

Tc2.0编写俄罗斯方块游戏

文章来源:互联网

很多编程爱好者都编写过俄罗斯方块的游戏程序。很久以前,我用Tc2.0

也做过一个;最近有好些朋友看见我以前的俄罗斯方块的程序后,

问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。正好现在放假了,而且离回家还有几天。于是我就把这个程序重新写了一遍,尽量使程序的结构比较清晰好懂一些。同时写了下面的这份东西。

俄罗斯方块游戏的程序中用到了一些方法。为了比较容易理解这些方法,我在讲述的同时写了些专门针对这些方法的示例程序。这些示例程序力求短小,目的是用最小的代码能够清楚的示例所用的方法。这些示例程序都经过tc2.0测试。最后还附了完整的俄罗斯方块游戏的源代码,和最终的可执行程序。如果你看了这份东东,有什么意见和想法,请发电子邮件告诉我。我将会继续更新这分东东,最新的版本可以在我的个人主页上下载。

下面的问题是有关俄罗斯方块程序的,其中有些是朋友问我的,有些是我认为可能会被问到的。我尽量按问题从易到难排列这些问题。 关于俄罗斯方块程序的一些问题:

******************************************************

Tc2.0中怎么样设置图形显示?

Tc2.0中常用图形函数的用法?

怎样获取鍵盘输入?

怎样控制方块的移动?

怎样控制时间间隔(用于游戏中控制形状的下落)?

游戏中的各种形状及整个游戏空间怎么用数据表示?

游戏中怎么判断左右及向下移动的可能性?

游戏中怎么判断某一形状旋转的可能性?

按向下方向键时加速某一形状下落速度的处理?

怎么判断某一形状已经到底?

怎么判断某一已经被填满?

怎么消去已经被填满的一行?

怎么消去某一形状落到底后能够消去的所有的行?(如长条最多可以消去四行)

怎样修改游戏板的状态?

怎样统计分数?

怎样处理升级后的加速问题?

怎样判断游戏结束?

关于计分板设计的问题。

关于“下一个”形状取法的问题。

剩下的问题。

******************************************************

新的问题:

我想有一个最高记录的显示,应该怎么做呀?

我想实现一个进度存储功能,应该怎么做呀?

Tc2.0中怎么样设置图形显示?

Tc2.0中有两种显示模式,一种是我们所熟知的字符模式,另一种是图形模式。在字符模式下只能显式字符,如ASCII字符。一般是显示25

行,每行80个字符。程序缺省的是字符模式。在字符模式下不能显式图形和进行绘图操作。要想进行图形显示和绘图操作,必须切换到图形模

式下。

Tc2.0中用initgraph()函数可以切换到图形模式,用closegraph()可以从图形模式切换回字符模式。initg raph()和closegraph()都是图形

函数,使用图形函数必须包括头文件"graphics.h"。

void far initgraph(int far *graphdriver,int far *graphmode,char far *pathtodriver);graphdriver是上涨指向图形驱动序号变量的指针;graphmode是在graphdriver选定后,指向图形显示模式序号变量的指针。pat htodriver表示存放图形驱动文件的路径。

Tc2.0中有多种图形驱动,每种图形驱动下又有几种图形显示模式。在我的程序中图形驱动序号为V GA,图形显示模式序号为VGAHI。这是一种分辨率为640*480(从左到右坐标依次为0-639,从上到下坐标依次为0-479),能够显示16种颜色的图形模式。别的图形驱动序号和图形显示模式序号,可以从手册或联机帮助中找到。

pathtodriver指示存放图形驱动文件的路径。图形驱动序号不同,图形驱动文件也不同。序号为VGA 图形驱动对应"egavga.bgi"这个图形驱动文件。"egavga.bgi"一般在Tc目录下。

void far closegraph(void);

没有参数,从图形模式直接返回字符模式。

initgraph()和closegraph()的常用用法如下:

int gdriver = VGA, gmode=VGAHI, errorcode;

/* initialize graphics mode */

initgraph(&gdriver, &gmode, "e:\\tc2");

/* read result of initialization */

errorcode = graphresult();

if (errorcode != grOk) /* an error occurred */

{

printf("Graphics error: %s\n", grapherrormsg(errorcode));

printf("Press any key to halt:");

getch();

exit(1); /* return with error code */

}

/* return to text mode */

closegraph();

Tc2.0中常用图形函数的用法?

在这里讲几个游戏中用到的绘图用的图形函数:

setcolor();

line();

rectangle();

settextjustify();

outtextxy();

setfillstyle();

bar();

void far setcolor(int color);

设置画线、画框和在图形模式下显示文字的当前颜色。这个函数将影响line()、rectangle()和outtextxy ()函数绘图的颜色。

color可以取常的颜色常量:

BLACK ? 0

BLUE ? 1

GREEN ? 2

CYAN ? 3

RED ? 4

MAGENTA ? 5

BROWN ? 6

LIGHTGRAY ? 7

DARKGRAY ? 8

LIGHTBLUE ? 9

LIGHTGREEN ?10

LIGHTCYAN ?11

LIGHTRED ?12

LIGHTMAGENTA ?13

YELLOW ?14

WHITE ?15

void far line(int x1,int y1,int x2,int y2);

用当前颜色从(x1,y1)画一条到(x2,y2)的线段。

void far rectangle(int left,int top,int right,int bottom);

用当前颜色画一个左上角为(left,top)、右下角为(right,bottom)的矩形框。

void far settextjustify(int horz,int vert);

设置图形模式下文字输出的对齐方式。主要影响outtextxy()函数。

horiz和vert可取如下枚举常量:

horiz ?LEFT_TEXT ? 0 ?Left-justify text

?CENTER_TEXT ? 1 ?Center text

?RIGHT_TEXT ? 2 ?Right-justify text

vert ?BOTTOM_TEXT ? 0 ?Justify from bottom

?CENTER_TEXT ? 1 ?Center text

?TOP_TEXT ? 2 ?Justify from top

void far outtextxy(int x,int y,char * textstring);

在(x,y)处用当前字体(缺省的字体是DEFAULT_FONT)显示字符串textstring,字符串的对齐方式由settextju stify()指定。

void far setfillstyle(int pattern,int color);

设置图形的填充模式和填充颜色,主要影响bar()等函数。

pattern一般取枚举常量值SOLID_FILL,color的取值与setcolor(int color)中color的取值范围相同。

介绍完了前面两个问题,现在来写一个程序。这个程序演示前了面所介绍的几个图形函数。

程序prog1.c

怎样获取鍵盘输入?

在Tc2.0中有一个处理键盘输入的函数bioskey();

int bioskey(int cmd);

当cmd为1时,bioskey()检测是否有键按下。没有键按下时返回0;有键按下时返回按键码(任何按键码都不为0),但此时并不将检测到的按

键码从键盘缓冲队列中清除。

当cmd为0时,bioskey()返回键盘缓冲队列中的按键码,并将此按键码从键盘缓冲队列中清除。如果键盘缓冲队列为空,则一直等到有键按

下,才将得到的按键码返回。

Escape键的按键码为0x11b,下面的小程序可以获取按键的按键码。

for (;;)

{

key=bioskey(0); /* wait for a keystroke */

printf("0x%x\n",key);

if (key==0x11b) break; /* Escape */

}

常用按键的按键码如下:

#define VK_LEFT 0x4b00

#define VK_RIGHT 0x4d00

#define VK_DOWN 0x5000

#define VK_UP 0x4800

#define VK_HOME 0x4700

#define VK_END 0x4f00

#define VK_SPACE 0x3920

#define VK_ESC 0x011b

#define VK_ENTER 0x1c0d

完整的程序请参见prog2.c、prog3.c。

prog2.c获取按键的按键码,按Escape键退出程序。

prog3.c根据不同的按键进行不同的操作,按Escape键退出程序。

怎样控制方块的移动?

方块移动的实现很简单,将方块原来的位置用背景色画一个同样大小的方块,将原来的方块涂去。然后在新的位置上重新绘制方块就可以

了。这样就实现了方块的移动。完整的程序请参见prog4.c。这个用方向键控制一个黄色的小方块在屏幕上上、下、左、右移动。这个程序用到了前面几个问题讲的内容,如果你有点忘了,还要回头看看哦。:)

怎样控制时间间隔(用于游戏中控制形状的下落)?

解决这个问题要用到时钟中断。时钟中断大约每秒钟发生18.2次。截获正常的时钟中断后,在处理完正常的时钟中断后,将一个计时变量

加1。这样,每秒钟计时变量约增加18。需要控控制时间的时候,只需要看这个计时变量就行了。

截获时钟中断要用到函数getvect()和setvect()。

两个函数的声明如下:

?void interrupt (*getvect(int interruptno))();

?void setvect(int interruptno, void interrupt (*isr) ( ));

保留字interrupt指示函数是一个中断处理函数。在调用中断处理函数的时候,所有的寄存器将会被保存。中断处理函数的返回时的指令是iret,而不是一般函数用到的ret指令。

getvect()根据中断号interruptno获取中断号为interruptno的中断处理函数的入口地址。

setvect()将中断号为interruptno的中断处理函数的入口地址改为isr()函数的入口地址。即中断发生时,将调用isr()函数。

在程序开始的时候截获时钟中断,并设置新的中断处理。在程序结束的时候,一定要记着恢复时钟中断哦,不然系统的计时功能会出问题的。具体演示程序请参见prog5.c。由于中断处理大家可能用的不多,所以我把prog5.c这个程序完整地贴在下面,并加上详细的解释。

/* prog5.c */

This is an interrupt service routine. You can NOT compile this

program with Test Stack Overflow turned on and get an executable file which will operate correctly. */

/* 这个程序每隔1秒钟输出一个整数,10秒钟后结束程序。

按escape键提前退出程序。*/

#include

#include

#include

/* Escape key */

#define VK_ESC 0x11b

#define TIMER 0x1c /* 时钟中断的中断号*/

/* 中断处理函数在C和C++中的表示略有不同。

如果定义了_cplusplus则表示在C++环境下,否则是在C环境下。*/

#ifdef __cplusplus

#define __CPPARGS ...

#else

#define __CPPARGS

#endif

int TimerCounter=0; /* 计时变量,每秒钟增加18。*/

/* 指向原来时钟中断处理过程入口的中断处理函数指针(句柄) */ void interrupt ( *oldhandler)(__CPPARGS);

/* 新的时钟中断处理函数*/

void interrupt newhandler(__CPPARGS)

{

/* increase the global counter */

TimerCounter++;

/* call the old routine */

oldhandler();

}

/* 设置新的时钟中断处理过程*/

void SetTimer(void interrupt (*IntProc)(__CPPARGS))

{

oldhandler=getvect(TIMER);

disable(); /* 设置新的时钟中断处理过程时,禁止所有中断*/ setvect(TIMER,IntProc);

enable(); /* 开启中断*/

}

/* 恢复原有的时钟中断处理过程*/

void KillTimer()

{

disable();

setvect(TIMER,oldhandler);

enable();

}

void main(void)

{

int key,time=0;

SetTimer(newhandler); /* 修改时钟中断*/

for (;;)

{

if (bioskey(1))

{

key=bioskey(0);

if (key==VK_ESC) /* 按escape键提前退出程序*/ {

printf("User cancel!\n");

break;

}

}

if (TimerCounter>18) /* 1秒钟处理一次*/

{

/* 恢复计时变量*/

TimerCounter=0;

time++;

printf("%d\n",time);

if (time==10) /* 10秒钟后结束程序*/

{

printf("Program terminated normally!\n");

break;

}

}

}

KillTimer(); /* 恢复时钟中断*/

}

游戏中的各种形状及整个游戏空间怎么用数据表示?

以后我提到的形状都是指下面七种形之一及它们旋转后的变形体。

□□□□ □□□□ □□□□ □□□□

□■□□ □■■□ □□□□ □□□□

□■□□ □■□□ □■□□ □■■□

□■■□ □■□□ ■■■□ ■■□□

□□□□ □■□□ □□□□

□□□□ □■□□ □□□□

■■□□ □■□□ □■■□

□■■□ □■□□ □■■□

我定义了一个结构来表示形状。

struct shape

{

int xy[8];

int color;

int next;

}

-1 0 1 2

-3□□□□

-2□□□□

-1□□□□

0□■□□

所有的各种形状都可以放在4x4的格子里。假定第二列,第四行的格子坐标为(0,0)(如上图中黑块所示),则每个形状的四个方块都可以用4

个数对来表示。坐标x从左向右依次增加,y从上到下依次增加。表示的时候,组成该形状的四个方块从左到右,从上到下(不一定非要按这个顺

序)。如上面七种形状的第一个用数对来表示就是(-2,0)、(-1,0)、(0,0)、(1,0)。结构shape中的xy就是用来表示这4个数对的。为了简化程序,用一维数组xy[8]来表示。xy[0]、xy[1]表示第一个数对,xy[2]、xy[3]表示第二个数对,依次类推。

shape中的color表示形状的颜色,不同的形状有不同的颜色。七种形状及它们旋转后的变形体一共有19种形状,用一个全局数组表示。假定旋转的方向是逆时针方向(顺时针方向道理一样)。shape中的next

就表示当前形状逆时针旋转后的下一个形状的序号。例如:第一种形状及其旋

转变形的形状用结构表示如下。

□□□□ □□□□ □□□□ □□□□

□■□□ □□□□ □■■□ □□□□

□■□□ □□■□ □□■□ ■■■□

□■■□ ■■■□ □□■□ ■□□□

struct shape shapes[19]=

{

/*{x1,y1,x2,y2,x3,y3,x4,y4, color, next}*/

{ 0,-2, 0,-1, 0, 0, 1, 0, CYAN, 1}, /* */

{-1, 0, 0, 0, 1,-1, 1, 0, CYAN, 2}, /* # */

{ 0,-2, 1,-2, 1,-1, 1, 0, CYAN, 3}, /* # */

{-1,-1,-1, 0, 0,-1, 1,-1, CYAN, 0}, /* ## */

……

}

游戏空间指的是整个游戏主要的界面(呵呵,这个定义我实在想不出更准确的,还请哪位大虾指点)。实际上是一个宽10格子、高20格子的

游戏板。用一个全局数组board[12][22]表示。表示的时候:board[x][y]为1时表示游戏板上(x,y)这个位置上已经有方块占着了,board[x][y]

为0表示游戏板上这位置还空着。为了便于判断形状的移动是否到边、到底,初始的时候在游戏板的两边各加一列,在游戏板的下面加一行,全

部填上1,表示不能移出界。即board[0][y],board[11][y](其中y从0到21)初始都为1,board[x][21](其中x 从1到10)初始都为1。

1 2 3 4 5 6 7 8 910

1□□□□□□□□□□

2□□□□□□□□□□

3□□□□□□□□□□

4□□□□□□□□□□

5□□□□□□□□□□

6□□□□□□□□□□

7□□□□□□□□□□

8□□□□□□□□□□

9□□□□□□□□□□

10□□□□□□□□□□

11□□□□□□□□□□

12□□□□□□□□□□

13□□□□□□□□□□

14□□□□□□□□□□

15□□□□□□□□□□

16□□□□□□□□□□

17□□□□□□□□□□

18□□□□□□□□□□

19□□□□□□□□□□

20□□□□□□□□□□

prog6.c演示了用结构表示各种形状的方法。虽然程序稍长一些,但并不是特别复杂。其中游戏板初始化部分并没有真正用到,但是后面的程序会用到的。其中SIZE定义为16,这样将整个屏幕的坐标系由原

来的640×480转换成40×30(640/16=40,480/16=30)。游戏中所有的坐标都是基于40×30的坐标系的,这样有助于简化程序。坐标的转换在程序中由DrawBlock(int x,int y)来体现。

新的坐标系如下图所示:

-8-7-6-5-4-3-2-1 0 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031

-4□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

-3□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

-2□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

-1□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

0□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

1□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

2□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

3□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□

4□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□

5□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□

6□□□□□□□□□■■■■■■■■■■□□□■■■■□□□□□□□□□□□□□□

7□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

8□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

9□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

10□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

11□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

12□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

13□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

14□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

15□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

16□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

17□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

18□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

19□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

20□□□□□□□□□■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□

21□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

22□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

23□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

24□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

25□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

26□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

新坐标中最主要的是就是上面两块黑色的部分。左边那块大的就是游戏板(横坐标从1到10,纵坐标从1到20),右边那块小的就是显示“下一个”形状的部分(横坐标从14到17,纵坐标从3到6)。这个新的坐标系是整个游戏的基础,后面所有的移动、变形等的计算都是基于这个坐标系的。

游戏中怎么判断左右及向下移动的可能性?

看懂了前面的各种形状和游戏板等的表示,接下来的东西就都好办多了。先来看一下某个形状如何显示在游戏板当中。假设要在游戏板中

显示第一个形状。第一个形状在结构中的表示如下:

struct shape shapes[19]=

{

/*{x1,y1,x2,y2,x3,y3,x4,y4, color, next}*/

{ 0,-2, 0,-1, 0, 0, 1, 0, CYAN, 1},

……

}

那么这个组成形状四个方块的坐标表示为(0,-2)、(0,-1)、(0,0)和(1,0)。这实际上是相对坐标。假形状的实际坐标指的是4x4方块中的第

二列、第三行的方块的位置,设这个位置为(x,y)。那么组成这个形状的四个小方块的实际坐标(以第一个形状为例)就是(x+0,y-2)、(x+0,y-1)、(x+0,y+0)和(x+1,y+0)。由于所有的形状都可以在4x4的方块阵列中表示,这样就找到了一种统一的方法来表示所有的形状了。

-1 0 1 2

-3□□□□ 相对坐标

-2□■□□

-1□■□□ 组成第一种形状的四个方块的相对坐标为(0,-2)、(0,-1)、(0,0)和(1,0)。

0□■■□

让我们看看形状是如何显示在游戏板中的(以第一个形状为例)。

1 2 3 4 5 6 7 8 910

1□■□□□□□□□□ 形状的坐标为(2,3)。组成形状的四个方块的坐标由形状的

2□■□□□□□□□□ 坐标加上这四个小方块各自的相对坐标得出。它们分别是:

3□■■□□□□□□□ (2+0,3-2)、(2+0,3-1)、(2+0,3-0)和(2+1,3-0)。即:

4□□□□□□□□□□ (2,1)、(2,2)、(2,3)和(3,3)。如左图所示。

5□□□□□□□□□□

6□□□□□□□□□□

7■□□□□□□□□□ 形状的坐标为(1,9)。组成形状的四个方块的坐标分别是:

8■□□□□□□□□□ (1+0,9-2)、(1+0,9-1)、(1+0,9-0)和(1+1,9-0)。即:

9■■□□□□□□□□ (1,7)、(1,8)、(1,9)和(2,9)。如左图所示。

10□□□□□□□□□□

11□□□□□□□□□□

12□□□□□□□□□□

13□□□□□□□□□□

14□□□□□□□□□□

15□□□□□□□□□□

16□□□□□□□□□□

17□□□□□□□□□□

18□□□□□□□□■□ 形状的坐标为(9,20)。组成形状的四个方块的坐标分别是:

19□□□□□□□□■□ (9+0,20-2)、(9+0,20-1)、(9+0,20-0)和(9+1,20-0)。即:

20□□□□□□□□■■ (9,18)、(9,19)、(9,20)和(10,20)。如左图所示。

从现在起,我不再举别的示例程序了。从现在开始所有的示例代码均来自于我写的"Russia.c"。为了记录游戏板的状态,用了一个全局数组board[12][22]。board[x][y](其中x从0到11,y从1到21)等于1

表示(x,y)这个位置已经被填充了,组成形状的四个方块的坐标都不能为(x,y),否则将发生冲突。board[x][y](其中x从1到10,y从1到20)等于表示(x,y)这个位置还没有被填充。

游戏板初始化时,给board[0][y],board[11][y](其中y从1到21)都赋为1,给board[x][21](其中x 从1到10)都赋为1。这相当于一开始就给游戏板左右和下方加了个“边”。所有的形状都不能够移入这个“边”,否则将发生冲突。

现在我们可以开始讨论如何判断一个形状向左、向右和向下移动的可能性了。先说个概念,“当前形状”是指那个正在下落还没有落到底的那个形状。如果当前形状向左移动,不与游戏板现有状态发生冲突,则可以向左移动。具体做法是:先假设当前形状已经向左移动了,判断此时是否与游戏板现有状态发生冲突。如果不发生冲突,则可以向左移动。否则,不可以向左移动。

判断索引号为ShapeIndex的形状在坐标(x,y)是否与游戏板当前状态发生冲突的代码如下。我把详细的说明加在这段代码中。

enum bool Confilict(int ShapeIndex,int x,int y)

{

int i;

/* 对组成索引号为ShapeIndex的形状的四个方块依次判断*/

for (i=0;i<=7;i++,i++) /* i分别取0,2,4,6 */

{

/* 如果四个方块中有任何一个方块的x坐标小于1或大于10,表示超出左边界或右边界。

此时,发生冲突。*/

if (shapes[ShapeIndex].xy[i]+x<1 ||

shapes[ShapeIndex].xy[i]+x>10) return True;

/* 如果四个方块中某个方块的y坐标小于1,表示整个形状还没有完全落入游戏板中。

此时,没有必要对这个方块进行判断。*/

if (shapes[ShapeIndex].xy[i+1]+y<1) continue;

/* 如果四个方块中有任何一个方块与游戏板当前状态发生冲突,则整个形状在(x,y)处

与游戏板当前状态冲突*/

if (board[shapes[ShapeIndex].xy[i]+x][shapes[ShapeIndex].xy[i+1]+y])

return True;

}

/* 四个方块中没有任何一个方块与游戏板当前状态发生冲突,则整个形状在(x,y)处

没有与游戏板当前状态冲突*/

return False;

}

对以上代码附加说明如下:

shapes[ShapeIndex].xy[i](其中i等于0,2,4,6)表示组成索引号为ShapeIndex的形状的某个方块的x

相对坐标。(i等于0时,表示第1个方块的x相对坐标;i等于2时,表示第2个方块的x相对坐标;i等于4时,表示第3个方块的x相对坐标;i等于6时,表示第4个方块的x相对坐标。)

shapes[ShapeIndex].xy[i](其中i等于1,3,5,7)表示组成索引号为ShapeIndex的形状的某个方块的y相对坐标。(i等于1时,表示第1个方块的y相对坐标;i等于3时,表示第2个方块的y相对坐标;i等于5时,表示第3个方块的y相对坐标;i等于7时,表示第4个方块的y相对坐标。)

shapes[ShapeIndex].xy[i]+x(其中i等于0,2,4,6)表示索引号为ShapeIndex的形状的坐标为(x,y)时,组成该形状的某个方块的x实际坐标。(i等于0时,表示第1个方块的x实际坐标;i等于2时,表示第2个方块的x实际坐标;i等于4时,表示第3个方块的x实际坐标;i等于6时,表示第4个方块的x实际坐标。)

shapes[ShapeIndex].xy[i]+y(其中i等于1,3,5,7)表示索引号为ShapeIndex的形状的坐标为(x,y)时,组成该形状的某个方块的y实际坐

标。(i等于1时,表示第1个方块的y实际坐标;i等于3时,表示第2个方块的y实际坐标;i等于5时,表示第3个方块的y实际坐标;i等于7时,表示第4个方块的y实际坐标。)

现在来看看这句是什么意思吧。

board[shapes[ShapeIndex].xy[i]+x][shapes[ShapeIndex].xy[i+1]+y]

可以这样理解,把上面一句分开来看::

ActualX=shapes[ShapeIndex].xy[i]+x;/* 其中x为0,2,4,6 */

表示某个方块实际的x坐标。

ActualY=[shapes[ShapeIndex].xy[i+1]+y;

表示某个方块实际的y坐标。

board[ActualX][ActualY]就是与某个方块坐标相同处的游戏板的标志。如果此标志不为0(为1),表示这个方块与游戏板发生冲突。如果此标志为0,表示这个方块没有与游戏板发生冲突。

这段写的比较长,但是不是特别难理解。游戏中很多地方都用到了这种相对坐标向实际坐标的转换方式,看懂了这一段对理解其他部分的代码很有帮助。

仔细看过这段代码后,你可能会提一个问题:不是已经在游戏板的左右两边都加了“边”了吗,为什么还要加下面这个对x坐标的判断呢?

/* 如果四个方块中有任何一个方块的x坐标小于1或大于10,表示超出左边界或右边界。

此时,发生冲突。*/

if (shapes[ShapeIndex].xy[i]+x<1 ||

shapes[ShapeIndex].xy[i]+x>10) return True;

这是因为有一种特殊情况,如下图所示:

■■

■ 2 3 4 5 6 7 8 910

1■□□□□□□□□□ 这在当前形状刚出来的时候,是可能发生的。但是我们只给游戏板

2□□□□□□□□□□ 加了一层“边”。对于这个形状的最左边的那个方块将失去判断,

3□□□□□□□□□□ 如果不予理会,这个形状将会“挂”在游戏板的左上角!当初我也

4□□□□□□□□□□ 没有想到这一点,后来发现会有形状“挂”在最顶层,而导致游戏

5□□□□□□□□□□ 提前退出。发现了这个问题。

6□□□□□□□□□□

7□□□□□□□□□□

8□□□□□□□□□□ 加了这个判断后,游戏板的左右两个“边”对冲突的判断就是去意

9□□□□□□□□□□ 义了。因为没有这两个“边”,对于冲突的判断也不会出错。不过

10□□□□□□□□□□ 为了程序易于理解,还是保留了游戏板的左右两个“边”。

11□□□□□□□□□□

12□□□□□□□□□□

13□□□□□□□□□□

14□□□□□□□□□□

15□□□□□□□□□□

16□□□□□□□□□□

17□□□□□□□□□□

18□□□□□□□□□□

19□□□□□□□□□□

20□□□□□□□□□□

如果你对我上面提出的新问题及对于这个问题的解释不太明白,没关系,这并不重要。因为现在才刚刚开始,而且刚才所说的这个问题只

有在特殊情况下才出现(当然,一旦发生上面说的问题,游戏就出错啦!^_^ ),对于理解整个程序的思路影响不大。看多了就会明白了(你

会说:原来就这么简单!)。

俄罗斯方块游戏的开发需求分析

俄罗斯方块游戏的开发 组长:XXX 组员:XXX XXX XXX XXX 05软件工程一班 一、课程设计的目的和意义 俄罗斯方块游戏是一个经典的小游戏,由于它简单有趣,因而得到了广泛的流行,男女老幼都适合。而俄罗斯方块游戏的设计工作复杂且富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系较大,包括界面的显示与更新、数据收集等,在设计的过程中,必将运用到各方面的知识,这对于visualbasi语言设 计者而言,是个很好的锻炼机会。 二、系统功能设计 本系统主要设计以下几种功能 1、游戏难度选择功能 游戏难度选择界面设置在程序运行开始时,一共有九种难度供玩家选择,每选一级难度,都会相应地显示出代表该难度的图片。开始时不设置任何默认的难度,如果玩家不选难度直接按“Enter”进入,将会弹出提示框,提示其先选难度再 进入。 2、方块下落、变形功能 在整个俄罗斯方块游戏中,方块的设计是核心。这里设计了一个方块类:Square(),用来生成方块以及实现块的左移、右移、向下、变形、重画、同步显 示、初始化新块等。 3、自动升级功能 当分数累积到一定大小时,系统将自动为玩家提高难度。这里设置了每消除10行方块,就增加一级难度。当难度增加的时候,方块会相应地改变颜色,以作为 对玩家的提示。 4、游戏音乐功能 游戏开始音乐就自动播放,游戏暂停与结束时音乐相应消除。 5、获取帮助功能 这里设置了一个类,用来显示帮助,按F1键就能弹出窗口,显示游戏规则。

三、系统功能设计分析 俄罗斯方块游戏根据功能的不同,设置了如下12个类:Square,Command, GameArea,GameSetting,GameOver,Help,ImagePanel,JieMian,MyPanel, MyTimer,PlayMidi,WinListener,每个类的描述如下: 1、Square,方块类。这个类中定义了生成方块的方法,用二维数组int[][]pattern,存放7种方块的四种状态。在构造方法中以随机的形式生成方块,同时提供了以下几种方法:reset(),leftTurn(),leftMove(),rightMove(),fallDown(),assertValid(int t,int s,int row,int col),dispBlock(int s)。分别实现方块的重画、翻转、 左移、右移、下落、同步显示等功能。 2、Command,处理控制类。这是一个实现ActionListener接口的类,主要处理点击按钮事件。类中定义了三个int型变量:button_play,button_quit,button_pause,和一个boolean型的变量:pause_resume,并赋值。在GameArea类中通过事件响应,在按钮执行方法中调用其值,使用switch语句,根据不同按钮不同的值, 来响应不同的事件。 3、GameArea,游戏界面类。GameArea继承了JFrame,是俄罗斯方块的主要游 戏界面。这个类定义了GameSetting类的gameScr对象和ImagePanel类的imagepanel对象作为游戏区域面板和控制区域面板。在游戏区域,主要是根据相应格子的设置标志来显示相应的图形图片,这样就实现了俄罗斯方块的实时显 示。 4、GameSetting,游戏画布类。这个类生成的对象将作为游戏界面的方块下落区域,画布的设置为15行10列,当中的方格边长为30,类中还定义了一个二维数组int[][]scrArr作为屏幕数组,表示每一个方格。游戏区域中每一个方格是否存在游戏方块是由该方格的值来决定的,如果该方格的值为1,则表示该方格中存在游戏方块;如果该方格中的值为0,则表示该方格中不存在游戏方块,因此二维数组用于记录游戏区域中每个小方格的值。此外,类中还定义了画方块的方法,根据不同的难度画出不同颜色的方块。单击Play按钮时,系统调用initScr()方法,初始化屏幕,将屏幕数组清零。当满足满行删除的条件时,系统调用deleteFullLine()方法,进行删行加分,而且每删除十行,难度自动增加一级,方块颜色改变,并在难度显示框中相应显示。 5、GameOver,游戏结束弹出提示框类。当游戏结束时,系统弹出提示,包括玩 家分数以及询问玩家要继续游戏还是退出。 6、Help,帮助类。在游戏界面,按F1键,弹出提示窗口,获取帮助。 7、ImagePanel,背景图片类。这个类继承了JPanel类,用来作为游戏界面中控 制区域的容器,并添加图片。 8、JieMian,主界面类。这个类继承了JPanel类,作为游戏的第一个界面,也是难度选择界面。定义了9个单选按钮,当玩家未选任何难度就按Enter时,系统会弹出一个提示框,提示玩家先选难度再进入。 9、MyPanel,重写MyPanel类,使Panel的四周留空间。

俄罗斯方块软件需求规格说明书

软件需求规格说明书 1306401-35 王正 一、引言 1.1编写目的 通过本游戏的设计,综合自己在校期间所学的理论知识,设计开发俄罗斯广场游戏,使自己熟应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,进一步巩固和加强自身对编程语言知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。 1.2项目背景 游戏是人们活动中一项非常重要的内容,有人认为如果哪一天人类对所有的游戏都失去兴趣,恐怕世界的末日就要到了。电脑对游戏的贡献有目共睹,现在摸索电脑的人很少没玩过电脑游戏的,喜欢游戏的人也很少不玩电脑的。 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。随着计算机的发展而发展,俄罗斯方块不断推陈出新,深爱广大玩家喜爱。这个游戏有的简单,有的复杂,但其根本原理是一样的都是对运动的方块进行组合,

来训练玩家的反应能力。因此开发此游戏软件可满足人们的一些娱乐的需求。 此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。 此次需要开发一项软件,在通过认真的考虑之后,决定做一个“俄罗斯方块”,对于我个人来说,这是一个相当具有挑战性的任务,也是一次不错的锻炼机会。 1.3定义 (1)游戏区:玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况。 (2)游戏控制:玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏。 (3)级别设置:玩家可以根据自己的需要自行设定游戏的开始级别,级别越高,游戏的速度越快,难度越大。 1.4参考资料 [1]朱福喜著,JAVA程序设计技巧与开发实例[M] 北京:人民邮电出版社,2004.2 [2] 张海藩软件工程(第五版) 北京:清华大学出版社,2008

俄罗斯方块游戏

俄罗斯方块游戏设计规格说明 Ver:1.0

目录 1 引言 (3) 1.1 目标 (3) 1.2 文档范围 (3) 1.3 术语和缩略语 (3) 1.4 参考资料 (3) 2 系统设计 (4) 2.1 逻辑流程视图 (4) 2.1.1 功能模块流程图 (5) 2.1.2 核心模块代码流程图 (5) 3 质量及其他方面 (6) 3.1 可维护性 (6) 3.2 安全性 (6) 3.3 可扩展/灵活性 (6) 3.4 稳定性/可靠性 (6) 3.5 可用性/用户体验 (6) 4 附录 (6) 4.1 附件 (6) 4.2 修过记录 (7)

1引言 1.1目标 通过编写俄罗斯方块游戏学习使用SDL图形库,从而掌握图片的显示方法,声音的播放方法,使用vs应用第三方产品的方法以及软件设计的方法和算法设计的方法。另外,程序的编写也能够进一步熟悉C语言编程方法,有利于提高编程兴趣并获取成就感,为后续课程的开展打下更好的基础。 1.2文档范围 项目目的,设计说明、使用说明。 1.3术语和缩略语 SDL:是Simple DirectMedia Layer缩写,SDL是一个自由的跨平台的多媒体开发包,适用于游戏、游戏SDK、演示软件、模拟器、MPEG播放器和其他应用软件。 1.4参考资料 a)SDL官方文档 b)https://www.wendangku.net/doc/417134180.html,/space.php?uid=7773715&do=blog&cuid=429545 c)https://www.wendangku.net/doc/417134180.html,/SDL_tutorials/index.php

2系统设计2.1逻辑流程视图

C语言俄罗斯方块游戏源代码

/*学无止境*/ #include #include #include #define ESC 27 #define UP 328 #define DOWN 336 #define LEFT 331 #define RIGHT 333 #define BLANK 32 #define BOTTOM 2 #define CANNOT 1 #define CAN 0 #define MAX 30 #define F1 315 #define ADD 43 #define EQUAL 61 #define DEC 45 #define SOUNDs 115 #define SOUNDS 83 #define PAUSEP 80 #define PAUSEp 112

void Init(); void Down(); void GoOn(); void ksdown(); void Display(int color); void Give(); int Touch(int x,int y,int dx,int dy); int GeyKey(); void Select(); void DetectFill(); void GetScores(); void Fail(); void Help(); void Quit(); void DrawBox(int x,int y,int Color); void OutTextXY(int x,int y,char *String); void DispScore(int x,int y,char Ch); void DrawNext(int Color); int Heng=12,Shu=20; /*横竖*/ int Position[MAX][MAX]; int middle[MAX][MAX]; int ActH,ActS;

俄罗斯方块游戏设计

俄罗斯方块游戏设计 俄罗斯方块游戏设计 JAVA语言 Eclipse平台开发 以下为开发过程需要使用的packages及其中classes and methods JAVA语言和C语言、C++语言很接近,它是一种面向对象、独立于开发平台的高级编程语言。它独特的语法规则和类库是组成JAVA技术的两个重要部分。 假期总结: 坦白讲,这个暑假我没花多少时间在学习计算机编程技术上面。在刚放暑假的时候,我去图书馆借了七八本编程书,有Visual C++、C#、以及JAVA方面的书,信誓旦旦这个暑假要好好研究技术。然而,执行力是我很缺乏的一个缺陷吧。在家贪图一时之爽,基本上没去翻书学习,久而久之,就越害怕打开书本。后期提前回学校,学了一点点JAVA。回想整个大一,包括这个暑假,我很羞愧。自己在过去的一年里浪费了太多的时间,对成绩抱着一种比较无所谓的心态,对于学习也是,可想而知,与别人的差距也就越来越大,这也是我现在不愿意看到的。在往后的日子,我不敢保证自己能如何刻苦勤奋地学习,但是,至少我会尽力做到问心无愧,我会清楚自己要什么,并且行动起来。 一、Package cn.itcast.tetris.controller 控制器 控制Ground, Snake, Food 负责游戏的逻辑 处理按键事件

一、Package cn.itcast.tetris.entities

1、Class Ground: public class Ground extends https://www.wendangku.net/doc/417134180.html,ng.Object 可以叫做地形, 或地面 维护障碍物的信息 可以使用提供的 addObstacle(int, int) 和addStubbornObstacle(int ,int) 方法添加障碍物。 可以通过setObstacleColor(), setStubbornObstacleColor() 或setGriddingColor()方法更改障碍物或网格的颜色 通过setDrawGridding() 方法设置是否画空白(网格) 用 setColorfulSupport() 方法设置是否支持彩色显示 覆盖 drawObstacle(Graphics, int, int, int, int) 方法可以改变障碍物的显示方式

俄罗斯方块游戏

课程设计说明书 课程名称:高级语言程序设计 设计题目:俄罗斯方块游戏 院部:计算机科学与信息工程学院 学生姓名: 学号: 专业班级:物联网工程 指导教师: 2015年6月 课程设计任务书

目录 一前言 (4) 二需求分析 (4) 三概要设计 (5) 四详细设计 (7) 五改进或增加功能模块说明 (8) 六程序测试 (8) 七课程设计总结 (11) 八致谢 (11) 九参考文献 (12) 十源程序 (12)

俄罗斯方块游戏 一前言 C++程序设计牵涉到面向对象程序设计的理论、C++语言的语法以及算法等3个方面的内容,其中每一方面都包含十分丰富的内容,都可以分别单独成论。显然在一个程序中深入、详细地介绍以上3个方面的知识是不可能的,必须把它们有机地结合起来,综合应用。不同的书对此采取不同的写法,侧重点有所不同,各有道理,也各有优缺点,适合于不同的读者。需要在教学实践中检验,取长补短,不断完善。 作者认为:要进行C++程序设计当然需要了解面向对象程序设计的有关概念,但是本课程毕竟不是一门面向对象程序设计的理论课程,在本书中不是抽象地介绍面向对象程序设计的理论,而是在介绍C++语言的特点和应用过程中自然地引出面向对象程序设计的有关概念,通过C++的编程过程理解面向对象程序设计方法。在介绍程序设计过程中,介绍有关的算法,引导读者思考怎样构造一个算法。编写程序的过程就是设计算法的过程。 要用C++编程序,最基本的要求是正确掌握和运用C++。由于C++语法复杂,内容又多,如果对它缺乏系统的了解,将难以真正应用,编出来的程序将会错误百出,编译出错,事倍功半。本书的做法是全面而系统地介绍C++的主要特点和功能,引导读者由简而繁地学会编写C++程序。有了C++编程的初步基础后,再进一步提高,掌握更多更深入的算法。这样的方法可能符合大多数学习者的情况,降低了学习难度。 程序设计是一门实践性很强的课程,只靠听课和看书是学不好的。衡量学习好坏的标准不是“懂不懂”,而是“会不会干”。因此必须强调多编程,多上机实践。考虑到不同学校、不同专业、不同读者对学习C++有不同的要求。 二需求分析 1 要求 (1)用C语言实现程序设计;

基于Java语言的俄罗斯方块游戏课程设计

基于Java语言的 俄罗斯方块游戏课程设计 学院:X 专业:X 班级:X 姓名:X 学号:X 指导老师:X

摘要 第一章引言 1.1 设计的课题背景 1.2 研究课题的任务,目的和意义 1.2.1 课题的任务 1.2.2 课题的目的 1.2.3 课题的意义 1.3 系统的主要功能和特色 1.3.1 系统的主要功能 1.3.2 系统的特色 第二章系统需求分析 2.1 本课题研究现状分析 2.2 要解决的问题及解决方法 2.3 系统设计的主要内容、目标 2.3.1 系统设计的主要内容 2.3.2 设计的目标 2.4 使用的关键技术 第三章系统的详细设计 3.1 系统的总体系结构 3.2 系统各模块的界面设计及实现 3.2.1 主窗体程序模块设计与实现 3.2.2 方块变换模块设计与实现 3.2.3 满行消除并计分模块设计与实现第四章系统的安装与测试 4.1 系统的安装 4.1.1 系统的运行环境 4.1.2 系统的安装 4.2 系统的测试 结束语

参考文献 附录:有关程序代码

摘要: 在现代,高科技的飞跃发展,人们工作习惯的改变,特别是电脑的大量普及,人们生活节奏越来越快,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一。俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。为此,我设计了一款简单的俄罗斯方块JAVA 游戏程序,以便更好的满足广大电脑工作者闲暇之余的消遣,并且也让我学到编程技术。 关键字:俄罗斯方块游戏、Java语言、编程

俄罗斯方块游戏设计报告

C语言课程设计 报告 设计题目:俄罗斯方块游戏设计 院系: 班级: 学号: 姓名: 指导教师: 设计地点: 开课时间:

学生姓名成绩 评语: 指导教师(签名) 年月日

目录 1.设计目的和任务....................................................................................................................................... - 1 - 1.1目的: .............................................................................................................................................. - 1 - 1.2任务: .............................................................................................................................................. - 1 - 2.开发环境.................................................................................................................................................... - 1 - 2.1硬件环境:.................................................................................................................................... - 1 - 2.2软件环境:.................................................................................................................................... - 1 - 3.设计题目...................................................................................................................................................... - 2 - 3.1题目名称:.................................................................................................................................... - 2 - 3.2题目详细描述: ........................................................................................................................... - 2 - 3.3功能要求: ............................................................................................................................................ - 2 - 4.相关技术以及知识点.......................................................................................................................... - 3 - 4.1编写BLOCK类:............................................................................................................................... - 3 - 4.2 PATHGRADIENTBRUSH 类: ........................................................................................................ - 3 - 4.3 RANDOM类:.................................................................................................................................. - 3 - 4.4 GDI图形处理: ........................................................................................................................... - 3 - 5. 设计与实现 .............................................................................................................................................. - 4 - 5.1 设计流程图................................................................................................................................... - 4 - 5.2 游戏主体界面 .............................................................................................................................. - 4 - 5.3 游戏图形界面 ............................................................................................................................ - 11 - 5.4 图形的移动与消行 ................................................................................................................... - 13 - 5.5 得分的实现................................................................................................................................. - 15 -6.总结 ........................................................................................................................................................ - 16 -7.参考资料................................................................................................................................................ - 16 -

俄罗斯方块C语言代码

【转载】88行代码实现俄罗斯方块游戏(含讲解) 来源:https://www.wendangku.net/doc/417134180.html,/p/8 在正式阅读本文之前,请你记得你应该用娱乐的心态来看, 本代码所使用到的技巧,在工作了的人眼里会觉得很纠结,很蛋疼,很不可理喻,很丑, 注意,是你蛋疼,不关我的事 通常,写一个俄罗斯方块,往往动不动就几百行,甚至上千行,而这里只有88行 正所谓头脑风暴,打破常规。这里将使用很多不平常的手段来减少代码 以下是Win-TC可以成功编译并执行的代码(代码保证单行长度不超过80字符,如果你是Win7系统,那请看后文): 程序代码: #include"graphics.h" #include #include int gcW = 20, gcColor[] = {DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA,MAGENTA, YELLOW}; struct tetris { int _pool[16][32], (*pool)[32], tmap[8][4][16]; int x, y, s, st, t; }gt; void trsInit() { int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802}, {39,305,114,562},{54,561},{99,306},{51,51},{-1}}; int *p, i, j, b; for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2]; gt.pool = >._pool[4]; for (j = 0; j < 7; ++j) for (i = 0; i < 4; ++i) for (b = 0; b < 16; ++b) gt.tmap[j+1][i][b] = (sp[j][i] & 1) * (j + 1), sp[j][i] >>= 1; memset(gt._pool, -1, sizeof(gt._pool));

俄罗斯方块说明

俄罗斯方块单人版

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; //速度

俄罗斯方块完整源代码

//不多说,直接可以拷贝下面的东西,就可以运行。 package day04; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.applet.*; import https://www.wendangku.net/doc/417134180.html,ng.String.*; import https://www.wendangku.net/doc/417134180.html,ng.*; import java.io.*; public class ERSBlock extends JPanel implements ActionListener,KeyListener//应该是继承JPanel { static Button but[] = new Button[6]; static Button noStop = new Button("取消暂停"); static Label scoreLab = new Label("分数:"); static Label infoLab = new Label("提示:"); static Label speedLab = new Label("级数:"); static Label scoreTex = new Label("0"); static Label infoTex = new Label(" "); static Label speedTex = new Label("1");

static JFrame jf = new JFrame(); static MyTimer timer; static ImageIcon icon=new ImageIcon("resource/Block.jpg"); static JMenuBar mb = new JMenuBar(); static JMenu menu0 = new JMenu("游戏 "); static JMenu menu1 = new JMenu("帮助 "); static JMenuItem mi0 = new JMenuItem("新游戏"); static JMenuItem mi1 = new JMenuItem("退出"); static JMenuItem mi1_0 = new JMenuItem("关于"); static JDialog dlg_1; static JTextArea dlg_1_text = new JTextArea(); static int startSign= 0;//游戏开始标志 0 未开始 1 开始 2 暂停 static String butLab[] = {"开始游戏","重新开始","降低级数","提高级数","游戏暂停","退出游戏"}; static int game_body[][] = new int[19][10]; static int game_sign_x[] = new int[4];//用于记录4个方格的水平位置 static int game_sign_y[] = new int[4];//用于记录4个方格的垂直位置

俄罗斯方块

俄罗斯方块

俄罗斯方块小游戏姓名:罗君 学号:102054221 指导老师:孔老师 日期:2011/12/22

1设计描述 这个程序是由MFC所做的小游戏:俄罗斯方块,俄罗斯方块也就是人们广泛称为积木的游戏,它是利用一些形状各异小方块却是用正方形组成的方块,当然在我所做的这个程序里,我用了有着7种不同的方块。,经过不同位置不同角度的变化之后,堆积在一起的一种智力游戏。而当同一行被小方格填满时,那一行也就跟着消失,此时玩家就可以得到一分,这里所设置的分值为,没消去一行,便可以得到一分,而主界面的背景被设为了12行及18列,当所堆积的小方块的垂直高度等于界面背景的高度时,这时就会在视图类中弹出一个消息对话框“游戏已经结束”。这里所要实现的就是这样一个小游戏,不过出于达到为了更加使游戏玩家得到娱乐的放松,我已经为此游戏添加了动听的游戏的背景音乐。还有就是当程序运行时,首先出现在客户区的是一幅封面位图,当游戏玩家点击文件菜单中的开始子菜单时,游戏正式进入游戏界面。 而从我们编程的角度讲,我们只需要提供各种方块的图形,提供几个键盘操作键以供方块的形状和位置的变化,提供几个功能函数以供游戏的正常进行。各种方块图形:利用数组定形,然后利用随机函数随机地不按顺序地按游戏的需要而出现。键盘操作键:就是四个方向键。其中左、右、下三个键意思一样,上键的功能不是使方块向上,而是使方块的下落角度改变。 2设计分析 2.1由于所选封面的位图的大小的限制,贴的客户区的位图不能完全覆盖整个客户区,考虑到游戏运行的效果,所以必须对运行后客户区大小重新作出界定,处于这种原因,所以应该在CMainFrame类中的PreCreateWindow (CREATESTRUCT& cs)函数中添加代码:cs.cx=500,cs.cy=590;再者就是一个有戏必须有开始,暂停和结束的按钮,为了实现这一功能,我做了如下程序,将菜单栏中的文件菜单项下的子菜单项都删除,重新为该菜单项添加3个子菜单项,分别为开始(IDC_MENU_START),暂停(IDC_MENU_PAUSE),退出(IDC_MENU_EXIT).并分别给这三个菜单项添加Command命令响应,并让CView类接收此命令响应消息。 2.2 资源编辑 添加位图: 封面:IDB_BITMAP1

C语言俄罗斯方块游戏源代码

/*学无止境*/ #include <> #include <> #include <> #define ESC 27 #define UP 328 #define DOWN 336 #define LEFT 331 #define RIGHT 333 #define BLANK 32 #define BOTTOM 2 #define CANNOT 1 #define CAN 0 #define MAX 30 #define F1 315 #define ADD 43 #define EQUAL 61 #define DEC 45 #define SOUNDs 115 #define SOUNDS 83 #define PAUSEP 80 #define PAUSEp 112

void Init(); void Down(); void GoOn(); void ksdown(); void Display(int color); void Give(); int Touch(int x,int y,int dx,int dy); int GeyKey(); void Select(); void DetectFill(); void GetScores(); void Fail(); void Help(); void Quit(); void DrawBox(int x,int y,int Color); void OutTextXY(int x,int y,char *String); void DispScore(int x,int y,char Ch); void DrawNext(int Color); int Heng=12,Shu=20; /*横竖*/ int Position[MAX][MAX]; int middle[MAX][MAX]; int ActH,ActS;

Python 俄罗斯方块游戏

【Python】用Python实现一个俄罗斯方块游戏 俄罗斯方块游戏,使用Python实现,总共有350+行代码,实现了俄罗斯方块游戏的基本功能,同时会记录所花费时间,消去的总行数,所得的总分,还包括一个排行榜,可以查看最高记录。 排行榜中包含一系列的统计功能,如单位时间消去的行数,单位时间得分等。 附源码: from Tkinter import* from tkMessageBox import* import random import time #俄罗斯方块界面的高度 HEIGHT=18 #俄罗斯方块界面的宽度 WIDTH=10 ACTIVE=1 PASSIVE=0 TRUE=1 FALSE=0 root=Tk();root.title('Russia') class App(Frame): def__init__(self,master): Frame.__init__(self) master.bind('',self.Up) master.bind('',self.Left) master.bind('',self.Right) master.bind('',self.Down) #master.bind('',self.Space) master.bind('',self.Space) master.bind('',self.Play) master.bind('',self.Pause) self.backg="#%02x%02x%02x"%(120,150,30) self.frontg="#%02x%02x%02x"%(40,120,150) self.nextg="#%02x%02x%02x"%(150,100,100) self.flashg="#%02x%02x%02x"%(210,130,100) self.LineDisplay=Label(master,text='Lines:',bg='black',fg='red') self.Line=Label(master,text='0',bg='black',fg='red') self.ScoreDisplay=Label(master,text='Score:',bg='black',fg='red') self.Score=Label(master,text='0',bg='black',fg='red') #Display time self.SpendTimeDisplay=Label(master,text='Time:',bg='black',fg='red') self.SpendTime=Label(master,text='0.0',bg='black',fg='red') self.LineDisplay.grid(row=HEIGHT-2,column=WIDTH,columnspan=2)

用matlab编写的俄罗斯方块小游戏

用matlab编写的俄罗斯方块小游戏 ?function RussiaBlock( varargin ) if nargin == 0 OldHandle = findobj( 'Type', 'figure', 'Tag', 'RussiaBlock' ) ; if ishandle( OldHandle ) delete( OldHandle ) ; end FigureHandle = figure( 'Name', '俄罗斯方块MATLAB版', 'Tag', 'RussiaBlock', 'NumberTitle', 'off',... 'Menubar', 'none', 'DoubleBuffer', 'on', 'Resize', 'off', 'visible', 'on',... 'KeyPressFcn', 'RussiaBlock( ''KeyPress_Callback'', gcbo )',... 'HelpFcn', 'helpdlg(''帮不了你- -!'',''不好意思'')',... 'CloseRequestFcn', 'RussiaBlock( ''CloseFigure_Callback'', gcbo )' ) ; generate_FigureContent( FigureHandle ) ; init_FigureContent( FigureHandle ) ; set( FigureHandle, 'Visible', 'on' ) ; elseif ischar( varargin{1} ) feval( varargin{:} ) ; end % ------------------------------------------------------------------------- function generate_FigureContent( FigureHandle ) TabSpace = 30 ; BlockWidth = 20 ; BlockHeight = 20 ; FigureWidth = BlockWidth * (12 + 1) + TabSpace * 7; FigureHeight = 500 ; set( FigureHandle, 'Position', [0 0 FigureWidth FigureHeight] ) ; movegui( FigureHandle, 'center' ) ; % 创建菜单 BeginMenu = uimenu( FigureHandle, 'Label', '开始' ) ; StartMenu = uimenu( BeginMenu, 'Label', '开始新游戏', 'Accelerator', 'N',...

相关文档
相关文档 最新文档