当前位置:文档之家› 俄罗斯方块-规则简述及源代码-Java Applet小程序

俄罗斯方块-规则简述及源代码-Java Applet小程序

俄罗斯方块-规则简述及源代码-Java Applet小程序
俄罗斯方块-规则简述及源代码-Java Applet小程序

〈俄罗斯方块规则简述〉 游戏元素: [元素] 方块

[规格] 5×5像素 [颜色] 黑色

[状态] 透明,不透明 [核心规则]

元素: Fangkuai_bitmap(方块美术图文件名) 规格: 5×5像素 黑色

变量: alpa (alpa=1为透明,alpa=0为不透明)

场景构成:

[形状] 长方形,长>宽

[规格] 由M ×N 个元素方块构成,M 表示长,N 表示宽,一个方块大小为一个计量单位 比如:18×12 表示长度为18个方块大小,宽度为12个方块大小。 [颜色] 透明

[状态] 所有方块alpa=1 [核心规则]

构成元素: M ×N 个Fangkuai_bitmap 方块识别: 引入数组ALL[X,Y]来对每一个方块在场景中的位置做唯一的标记,X 的数值

对应M 的数值,Y 的数值对应N 的数值。

例如:18×12大小的场景,由18×12个方块组成,那么用ALL[X ,Y]来标记方块

变量赋值: alpa=1(默认初始状态)

积木生成: [元素] 方块

[规格] 由4个方块按照一定规则组合而成 ,如图: 共计19件

[颜色]黑色 [状态]不透明 [核心规则]

积木是通过场景中以下坐标标记的方块的alpa 值来生成的: [1,Y\2-1] [1,Y\2] [1,Y\2+1] [2,Y\2-1] [2,Y\2] [2,Y\2+1] [3,Y\2-1] [3,Y\2] [3,Y\2+1]

生成积木的时候,更改相应的方块变量值 ,其变量alpa=0 以下坐标标记的方块为需要更改alpa 值的方块: (参考场景构成的[方块识别

] )

积木代号:A_1

积木代号:A_2

积木代号:B_1

积木代号:B_2

碰撞检测规则:

[碰撞规则]

(在方块下落之前,我们要先进行碰撞检测。一判定是否满足下落的条件。) 当构成积木的方块有一个方块最先与场景中其他积木方块有垂直方向接触时,或者与场景底部有接触时,为成功碰撞,

积木代号:C_1

积木代号:C_2

积木代号:C _3

积木代号:C_4

积木代号:D_1

积木代号:D_2

积木代号:D_3

积木代号:D_4

积木代号:E_1 积木代号:F_1

积木代号:F_2

积木代号:G_1

积木代号:G_2

积木代号:G_3

积木代号:G_4

否则为碰撞检测失败。

当构成积木的方块有一个方块最先与场景中其他积木方块有水平方向接触时,为成功碰撞

否则为碰撞检测失败。

[检测方法]

(积木下落过程中,构成积木的方块的坐标是随时在变动着,也代表着场景中方块alpa值的变动)

构成积木的方块坐标[X,Y],检测[X+1,Y]=1时候成立,为碰撞检测失败

检测[X,Y+1]=1时候成立,为碰撞检测失败

检测[X,Y-1]=1时候成立,为碰撞检测失败

检测[X+1,Y]=1时候不成立,即[X+1,Y]=0,为成功碰撞。

检测[X,Y+1]=1时候不成立,即[X,Y+1]=0,为成功碰撞

检测[X,Y-1]=1时候不成立,即[X,Y-1]=0,为成功碰撞当X+1>M时,或则Y+1>N或则Y-1<=0时,不需要进行检测,默认为成功碰撞

积木变形:

[操作按键] A_1:变形键

[变形规则] 一个积木只有几个有限的可变型状,当把其他的型状变完后,再变的话就又会回到原来的形状。

积木变形是一个循环的过程。

[核心规则]

(积木在场景中显示出来是因为指定的方块透明度=0,而透明度=1的方块是看不见颜色的,也就是用黑色方块来显示出积木的形状)

(具体变换,那就是根据方块标记的唯一坐标来给指定的方块透明度进行赋值的过程了)

因为篇幅问题所以就只列出一部分来说明: 。

注意:*[X ,Y]=1/0 表示该坐标的方块alpa 值 alpa=1/0。

*参考积木的代号

*

alpa 值

A :

变形前/变形后

输入变形命令 变形后/变形前 [1,N\2

]=0

[1

,N\2 ]=1

[2,

N\2 ]=0

[2,N\2 ]=0 [2,N\2 ]=1 [2,N\2+1]=0 [2,N\2+1]=0 [2,N\2+1]=1 [3,N\2 ]=0 [3,N\2+1]=0 [3,N\2+1]=1 [3,N\2-1]=0

优化:

变形前/变形后 输入变形命令 变形后/变形前 [1,N\2 ]=0 [1,N\2 ]=1 [2,N\2 ]=0 [2,N\2 ]=0 [2,N\2+1]=0 [2,N\2+1]=0 [3,N\2 ]=0 [3,N\2+1]=0 [3,N\2+1]=1 [3,N\2-1]=0

B :

C :

变形前/变形后 输入变形命令 变形后/变形前 输入变形命令 变形前/变形后 [1,N\2 ]=0 [1,N\2 ]=1 [2,N\2 ]=0 [2,N\2 ]=1 [1,N\2-1]=0 [2,N\2 ]=0 [2,N\2 ]=1 [2,N\2-1]=0 [2,N\2-1]=1 [1,N\2 ]=0 [3,N\2 ]=0 [3,N\2 ]=1 [2,N\2+1]=0 [2,N\2+1]=1 [2,N\2 ]=0 [3,N\2+1]=0 [3,N\2+1]=1 [3,N\2-1]=0 [3,N\2-1]=1 [3,N\2 ]=0 优化:

变形前/变形后 输入变形命令 变形后/变形前 输入变形命令 变形前/变形后

[1,N\2 ]=0 [1,N\2 ]=1 [2,N\2 ]=0 [1,N\2-1]=0 [2,N\2 ]=0 [2,N\2-1]=0 [2,N\2-1]=1 [1,N\2 ]=0 [3,N\2 ]=0 [3,N\2 ]=1 [2,N\2+1]=0 [2,N\2+1]=1 [2,N\2 ]=0 [3,N\2+1]=0 [3,N\2+1]=1 [3,N\2-1]=0 [3,N\2-1]=1 [3,N\2 ]=0

输入变形命令 变形前/变形后 输入变形命令 变形前/变形后 [1,N\2-1] =1 [2,N\2+1] =0 [2,N\2+1]=1 [1,N\2 ]=0 [1,N\2 ] =1 [3,N\2-1] =0 [3,N\2-1]=1 [2,N\2 ]=0 [2,N\2 ] =1 3,N\2 ] =0 [3,N\2 ]=1 [3,N\2 ]=0 [3,N\2 ] =1 [3,N\2+1] =0 [3,N\2+1]=1 [3,N\2+1]=0 优化:

输入变形命令 变形前/变形后 输入变形命令 变形前/变形后 [1,N\2-1] =1 [2,N\2+1] =0 [2,N\2+1]=1 [1,N\2 ]=0 [1,N\2 ] =1 [3,N\2-1] =0 [3,N\2-1]=1 [2,N\2 ]=0 [2,N\2 ] =1 [3,N\2 ] =0 [3,N\2 ]=0 [3,N\2+1] =0 [3,N\2+1]=0

D :

E :

F :

G :

移动规则:

[操作按键] B_1:左移动键

B_2:右移动键 B_3:下落键 [移动规则]

左平移: 积木延水平方向左移一个方块大小的位置

右平移:积木延水平方向右移一个方块大小的位置

垂直下落:积木延垂直方向迅速下落

[核心规则]

第一次平移:

移动后坐标构成积木的方块系统初始化坐标[X1,Y1]=0 [X1,Y1]=1 [X1,Y1-1]=0

[X2,Y2]=0 ->左平移命令->[X2,Y2]=1 [X2,Y2-1]=0

[X3,Y3]=0 碰撞检测失败[X3,Y3]=1 [X3,Y3-1]=0

[X4,Y4]=0 [X4,Y4]=1 , [X4,Y4-1]=0 平移后的坐标再默认赋给初始坐标

移动后坐标

构成积木的方块系统初始化坐标[X1,Y1]=0 [X1,Y1]=1 [X1,Y1+1]=0

[X2,Y2]=0 ->右平移命令->[X2,Y2]=1 [X2,Y2+1]=0

[X3,Y3]=0 碰撞检测失败[X3,Y3]=1 [X3,Y3+1]=0

[X4,Y4]=0 [X4,Y4]=1 ,[X4,Y4+1] =0 平移后的坐标再默认赋给初始坐标

第二次平移:

移动后坐标构成积木的方块默认初始坐标[X1,Y1]=0 [X1,Y1]=1 [X1,Y1-1]=0

[X2,Y2]=0 ->左平移命令-> [X2,Y2]=1 [X2,Y2-1]=0

[X3,Y3]=0 碰撞检测失败[X3,Y3]=1 [X3,Y3-1]=0

[X4,Y4]=0 [X4,Y4]=1 ,[X4,Y4-1]=0 平移后的坐标再默认赋给初始坐标

移动后坐标构成积木的方块默认初始坐标[X1,Y1]=0 [X1,Y1]=1 [X1,Y1+1]=0

[X2,Y2]=0 ->右平移命令->[X2,Y2]=1 [X2,Y2+1]=0

[X3,Y3]=0 碰撞检测失败[X3,Y3]=1 [X3,Y3+1]=0

[X4,Y4]=0 [X4,Y4]=1 ,[X4,Y4+1]=0 平移后的坐标再默认赋给初始坐标

移动后坐标

构成积木的方块默认初始坐标[X1,Y1]=0 [X1,Y1]=0

[X2,Y2]=0 ->左平移命令-> [X2,Y2]=0

[X3,Y3]=0 成功碰撞[X3,Y3]=0

[X4,Y4]=0 [X4,Y4]=0

平移后的坐标再默认赋给初始坐标

移动后坐标

构成积木的方块默认初始坐标[X1,Y1]=0 [X1,Y1]=0

[X2,Y2]=0 ->右平移命令->[X2,Y2]=0

[X3,Y3]=0 成功碰撞 [X3,Y3]=0 [X4,Y4]=0 [X4,Y4]=0 依次类推。

消除规则:

[操作按键] 无(系统自动完成) [消除规则]

(以X 轴来分层,一个方块大小为一层。) 条件:在同一层中被添满方块时触发

结果:该层方块被消除,在该层上方的方块下落一层。 [积分规则]

一次消除一层: 获得10积分 一次消除二层: 获得30积分 一次消除三层: 获得50积分 一次消除四层: 获得70积分 [核心规则]

条件: x ×y 大小场景,根据X=1++,X<=x 的方法检测方块坐标[X ,Y] ,检测[X,Y|(Y=1++,Y<=y)]=0是否成立,成立则触发

结果:[X,Y|(Y=1++,Y<=y)]=1,

再将[X-1,Y|(Y=1++,Y<=y)] 的值赋值给[X,Y|(Y=1++,Y<=y)], 再将[X-2,Y|(Y=1++,Y<=y)] 的值赋值给[X-1,Y|(Y=1++,Y<=y)] 依次类推。

积分:定义一个变量@=0

一个积木出现到下个积木出现的中间阶段,满足一次条件时变量@=@+1,然后根据@的值来判定积分获得的加值。

积木下落速度规则:

[操作按键] 无(系统自动完成) [速度规则]

条件: 碰撞检测失败 下落轨迹: 垂直下落,

速度设置: 系统默认的初始速度为:速度0= 2 秒1层

将下落后的坐标 再定为初始坐标,循环

(因为不知道具体的数据,所以以?代替)

依据关卡对应的速度:速度1= ?秒1层

速度2= ?秒1层

速度3= ?秒1层

速度4= ?秒1层

速度5= ?秒1层

速度6= ?秒1层

速度7= ?秒1层

速度8= ?秒1层

速度9= ?秒1层

[核心规则]

构成积木的方块坐标[X,Y]。

初始坐标下落后积木方块的坐标

[X1,Y1]=0 [X1,Y1]=1 [X1+1,Y1]=0 速度设定的时间间隔->[X2,Y2]=0 -> [X2,Y2]=1 [X2+1,Y2]=0

[X3,Y3]=0 [X3,Y3]=1 [X3+1,Y3]=0

[X4,Y4]=0 [X4,Y4]=1,[X4+1,Y4]=0

下落后的坐标再默认赋给初始坐标

胜利与失败:

[胜利条件]

通过所有关卡后还没有失败

关卡1 过关要求:达到1000积分

关卡2 过关要求:达到2000积分

关卡3 过关要求:达到3000积分

关卡4 过关要求:达到4000积分

关卡5 过关要求:达到5000积分

关卡6 过关要求:达到6000积分

关卡7 过关要求:达到7000积分

关卡8 过关要求;达到8000积分

关卡9 过关要求:达到9000积分

[失败条件]

(游戏规则)当积木堆积的最高处达到场景的最高处时,宣告游戏失败并结束游戏。

[失败流程] 满足失败条件

则清空场景黑色方块

显示出“OVER”字样。

回到游戏开始画面。

[核心规则]

失败条件:当数组ALL[X,Y]中[1,*]标记的方块中有一个方块的透明度=0

失败流程:满足失败条件

则所有方块透明度=1

特定坐标的方块透明度=0,显示出“OVER”字样。

回到游戏开始画面。

<俄罗斯方块源代码>

import java.awt.*;

import java.applet.Applet;

public class Blocks extends Applet implements Runnable {

Dimension d;

Font largefont= new Font("Helvetica", Font.BOLD, 28); Font smallfont= new Font("Helvetica", Font.BOLD, 10); Color textcolor1=new Color(96,128,255);

Color textcolor2=new Color(255,160,64);

FontMetrics fmsmall, fmlarge;

Graphics goff;

Image ii;

Threadthethread;

boolean ingame=false;

final short xblocks=10;

final short yblocks=20;

final int blocksize=16;

final int width=xblocks*blocksize;

final int height=yblocks*blocksize;

short[][] screendata;

final short maxcolors=6;

Color[] blocks;

final int barwidth=8;

final Color barcolor=new Color(128,255,64);

final Color background=new Color(0,0,0);

int score;

short emptyline;

int objectx, objecty;

int objectx;

short objecttype;

short objectcolor;

int objectrotation;

int objectrotationd=0;

short objectptr;

short checkptr;

final short itemcount=7;

final short itemrotlen=8;

final short itemlen=itemrotlen*4;

short count;

final short maxcount=5;

short curcount;

boolean fast=false;

final short screendelay=40;

short screencount=40;

boolean showtitle=true;

int items[]={

0,0, -1,0, 0,-1, -1,-1, //四方形,正常状态0,0, -1,0, 0,1, -1,1, //被旋转90度

0,0, 1,0, 0,1, 1,1,

0,0, 1,0, 0,-1, 1,-1,

0,0, 0,-1, 0,-2, 0,-3,

0,0, -1,0, -2,0, -3,0,

0,0, 0,1, 0,2, 0,3,

0,0, 1,0, 2,0, 3,0,

0,0, 1,0, 0,-1, -1,-1,

0,0, 0,-1, -1,0, -1,1,

0,0, -1,0, 0,1, 1,1,

0,0, 0,1, 1,0, 1,-1,

0,0, -1,0, 0,-1, 1,-1,

0,0, 0,1, -1,0, -1,-1,

0,0, 1,0, 0,1, -1,1,

0,0, 0,-1, 1,0, 1,1,

0,0, 1,0, -1,0, 0,-1,

0,0, 0,1, 0,-1, -1,0,

0,0, 0,1, -1,0, 1,0,

0,0, 1,0, 0,-1, 0,1,

0,0, 0,-1, 1,-1, 0,1,

0,0, -1,0, -1,-1, 1,0,

0,0, -1,1, 0,1, 0,-1,

0,0, -1,0, 1,0, 1,1,

0,0, 0,1, 0,-1, -1,-1,

0,0, 1,0, -1,0, -1,1,

0,0, 0,-1, 0,1, 1,1,

0,0, -1,0, 1,0, 1,-1,

};

int checks[]={

-1,1, 0,1, -1,1, 0,1,

-1,2, 0,2, -1,2, 0,2,

0,2, 1,2, 0,2, 1,2,

0,1, 1,1, 0,1, 1,1,

0,1, 0,1, 0,1, 0,1,

0,1, -1,1, -2,1, -3,1,

0,4, 0,4, 0,4, 0,4,

0,1, 1,1, 2,1, 3,1,

0,1, -1,0, 1,1, 0,1,

0,1, -1,2, 0,1, -1,2,

0,2, 1,2, -1,2, 0,2,

0,2, 1,1, 0,2, 1,1,

-1,1, 0,1, 1,0, 1,0,

-1,1, 0,2, 0,2, -1,1,

-1,2, 0,2, 1,1, 1,1,

0,1, 1,2, 0,1, 1,2,

-1,1, 0,1, 1,1, 1,1,

-1,1, 0,2, 0,2, -1,1,

-1,1, 0,2, 1,1, 1,1,

0,2, 1,1, 0,2, 1,1,

0,2, 1,0, 1,0, 0,2,

-1,1, 0,1, 1,1, 1,1,

-1,2, 0,2, 0,2, -1,2,

-1,1, 0,1, 1,2, 1,2,

-1,0, 0,2, 0,2, -1,0,

-1,2, 0,1, 1,1, 1,1,

0,2, 1,2, 1,2, 0,2,

-1,1, 0,1, 1,1, 1,1,

};

public string getAppletInfo()

{

return("Blocks - by Ali");

}

//初始化applet

public void init()

{

short i;

screendata=new short[xblocks][yblocks]; blocks=new Color[maxcolors+1];

//设置背景色

blocks[0]=background;

//设置方块颜色

blocks[1]=new Color(255,0,0);

blocks[2]=new Color(0,255,0);

blocks[3]=new Color(0,0,255);

blocks[4]=new Color(255,255,0);

blocks[5]=new Color(255,0,255);

blocks[6]=new Color(0,255,255); Graphics g;

resize(width+2*barwidth,height+30);

d=size();

setBackground(background);

g=getGraphics();

g.setFont(smallfont);

fmsmall=g.getFontMetrics();

g.setFont(largefont);

fmlarge=g.getFontMetrics();

gameInit();

}

//初始化游戏

public boid gameInit()

{

short i,j;

for(i=0;i

{

for(j=0;j

{

screendata[i][j]=0;

}

}

score=0;

emptyline=-1;

newObject();

fast=false;

curcount=maxcount;

}

public void newObject()

{

short i;

int y;

objectx=xblocks/2-1;

objectdx=0;

objecty=0;

objecttype=(short)(Math.random()*itemcount);

if (objecttype>=itemcount)

objecttype=itemcount-1;

objectptr=(short)(objecttype*itemlen);

checkptr=(short)(Mat.random()*maxcolors+1);

if (objectcolor>maxcolors)

objectcolor=maxcolors;

objectrotation=0;

count=maxcount;

//判断游戏是否结束

for(i=0;i<4;i++)

{

y=items[objectptr+i*2+1];

if(y>=0&&screendata[objectx+items[objectptr+i*2]][y]!=0) {

ingame=false;

showtitle=true;

}

}

}

//判断键盘是否被按下,并且处理事件

public boolean keyDown(Event e, int key) {

if(ingame)

{

if(Key==Event.LEFT)

{

objectdx=-1;

}

else if (Key==Event.RIGHT)

{

objectdx=1;

}

else if (Key==Event.UP)

{

objectrotationd=1;

}

else if (Key==Event.DOWN)

{

fast=true;

}

else if (Key==Event.ESCAPE)

{

ingame=false;

}

}

else

{

if(Key==′s′||Key==′S′)

{

ingame=true;

gameInit();

}

}

return true;

}

//处理键盘抬起事件

public boolean keyUp(Event e, int key) {

if(Key==Event.DOWN)

{

fast=false;

}

return true;

}

//paint()方法

public void paint(Graphics g)

{

Graphics gg;

if (goff==null&&d.width>0&&d.height>0) {

ii=createImage(d.width, d.height);

goff=ii.getGraphics();

}

if(goff==null||ii==null)

return;

//设置背景色

goff.setColor(background);

goff.fillRect(0, 0, d.width, d.height);

//如果游戏已经开始

if(ingame)

//调用playGame()方法

playGame();

else//否则,显示其他信息

//显示初始信息

showIntro();

// 显示得分

showScore();

g.drawImage(ii, 0, 0, this);

}

//实现游戏

public void playGame()

{

boolean bottomreached=false;

boolean stillscrolling=false;

if(emptyline<0)

{

bottomreached=drawObject();

}

else

{

scrollDown();

stillscrolling=true;

}

drawBars();

drawBlocks();

if(stillscrolling||bottomreached)

{

checkFull();

}

}

//显示初始信息

public void showIntro()

{

String s;

drawBars();

drawBlocks();

if (showtitle)

{

goff.setFont(largefont);

s="俄罗斯方块"

goff.setColor(textcolor1);

goff.drawString(s, barwidth+(width-fmlarge.stringWidth(s))/2-2,height/2-22); goff.setColor(Color.white);

goff.drawString(s, barwidth+(width-fmlarge.stringWidth(s))/2,height/2-20); }

else

{

goff.setFont(smallfont);

s="请按下′S′键开始游戏";

goff.setColor(textcolor1);

goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2-1,height/2-31); goff.setColor(Color.white);

goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2,height/2-30);

s="使用左右方向键控制运动";

goff.setColor(textcolor2);

goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2-1,height/2-11); goff.setColor(Color.white);

goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2,height/2-10);

s="使用向下的方向键实现旋转";

goff.setColor(textcolor2);

goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2-1,height/2+9); goff.setColor(Color.white);

goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2,height/2+10); s="使用向下的方向键实现下降";

goff.setColor(textcolor2);

goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2-1,height/2+29);

goff.setColor(Color.white);

goff.drawString(s,barwidth+(width-fmsmall.stringWidth(s))/2,height/2+30); }

screencount--;

if(screencount<=0)

{ screencount=screendelay; showtitle=!showtitle; }

}

public void drawBars()

{

goff.setColor(barcolor);

goff.fillRect(0,0,barwidth,blocksize*yblocks);

goff.fillRect(barwidth+blocksize*xblocks,0,barwidth,blocksize*yblocks); goff.fillRect(0,blocksize*yblocks,xblocks*blocksize+2*barwidth,barwidth); }

public boolean drawObject()

{

short i;

boolean bottomreached=false;

int x,y,checkx,checky;

//清除旧图形

for(i=0;i<4;i++)

{

x=objectx+items[objectptr+i*2+objectrotation*itemrotlen];

y=objecty+items[objectptr+i*2+objectrotation*itemrotlen+1];

checkx=objectx+checks[objectptr+i*2+objectrotation*itemrotlen];

checky=objecty+checks[objectptr+i*2+objectrotation*itemrotlen+1];

if(y>=0)

screendata[x][y]=0;

if(screendata[checks][checky]!=0)

bottomreached=true;

}

if(!bottomreached)

{

count--;

if(count<=0||fast)

{

objecty++;

count=curcount;

}

checkRotation();

objectdx=0;

objectrotationd=0;

}

//绘制新图形

for(i=0;i<4;i++)

{

x=objectx+items[objectptr+i*2+objectrotation*itemrotlen];

y=objecty+items[objectptr+i*2+objectrotation*itemrotlen+1]; if(y>=0)

screendata[x][y]=objectcolor;

if(y>=(yblocks-1))

bottomreached=true;

}

if (bottomreached)

{

score++;

newObject();

}

return bottomreached;

}

public void checkRotation()

{

int dummyx;

int dummyrot;

int x,y;

short i;

boolean cando=true;

dummyrot=(objectrotation+objectrotationd)%4;

dummyx=objectx+objectdx;

//确认该部分不会使屏幕旋转

for(i=0;i<4;i++)

{

x=dummyx+items[objectptr+i*2+dummyrot*itemrotlen];

if(x>=xblocks)

dummyx-=(x-xblocks+1);

else if(x<0)

dummyx-=x;

}

for(i=0;(i<4&&cando);i++)

{

x=dummyx+items[objectptr+i*2+dummyrot*itemrotlen];

y=objecty+items[objectptr+i*2+dummyrot*itemrotlen+1];

if(y>=0)

cando=cando&&(screendata[x][y]==0);

if(y>=yblocks||x<0||x>=xblocks)

cando=false;

}

if(cando)

{

objectrotation=dummyrot;

objectx=dummyx;

}

}

public void drawBlocks()

{

short x,y;

for(x=0;x

{

for(y=0;y

{

goff.setColor(blocks[screendata[x][y]]);

goff.drawRect(x*blocksize+barwidth,y*blocksize,blocksize-1,blocksize-1); goff.fillRect(x*blocksize+barwidth+3,y*blocksize+3,blocksize-6,blocksize-6); }

}

}

public void checkFull()

{

short x,y;

boolean found=false;

for(y=yblocks-1;(y>=0&&!found);y--)

{

found=true;

for(x=0;x

{

if(screendata[x][y]==0)

found=false;

}

if(found)

{

score+=10;

//当用户的得分很多时,增加游戏速度

if(score>800)

curcount=1;

else if(score>600)

curcount=2;

else if(score>400)

curcount=3;

else if(score>200)

curcount=4;

for(x=0;x

{

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

俄罗斯方块游戏的开发 组长: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的四周留空间。

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;

俄罗斯方块C语言代码

【转载】88行代码实现俄罗斯方块游戏(含讲解) 来源:https://www.doczj.com/doc/d94274002.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));

C++俄罗斯方块代码(北邮版)

#include #include #include #include #include #include "colorConsole.h" //老师的文件 void begin(); //开始游戏 void frame(); //边框设定 int * getblocks(); //方块产生 void move(int line); //移动 void drawblocks(int line); //方块显示 void clearsquare(int line); //方块擦出 void turn(int line); //方块旋转 bool isavailable(int line); //判断是否能下落 void remember(int line); //记忆方块位置 void deleteline(int line); //方块满一行消除 bool ifgameover(); //判断是否游戏结束 void end(); //游戏结束 #define up 72 #define down 80 #define left 75 #define right 77 #define esc 27 HANDLE handle; 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 row=0; //列数 int score=0; int level=0; int * block1=NULL; int * block2=NULL; int * block3=NULL; int coordinate[12][18]={0}; //坐标数组,边框12*18(最后一行,两边边框计算在内) int judge=0;

俄罗斯方块C语言程序设计报告

C语言课程设计报告 俄罗斯方块程序设计报告 一、问题描述 俄罗斯方块(Tetris,俄文:Тетрис)是一款电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。 在本次设计中,要求支持键盘操作和若干种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,为玩家提供了不同的选择。 二、功能分析 I、俄罗斯方块游戏需要解决的问题包括: ⑴、随机产生方块并自动下移 ⑵、用Esc键退出游戏 ⑶、用键变体 ⑷、用键和键左右移动方块 ⑸、用空格键使游戏暂停

⑹、能正确判断满行并消行、计分、定级别 ⑺、设定游戏为不同级别,级别越高难度越大 II、俄罗斯方块游戏需要设计的功能函数包括: ⑴、声明俄罗斯方块的结构体 ⑵、函数原型声明 ⑶、制作游戏窗口 ⑷、制作俄罗斯方块 ⑸、判断是否可动 ⑹、随机产生俄罗斯方块类型的序号 ⑺、打印俄罗斯方块 ⑻、清除俄罗斯方块的痕迹 ⑼、判断是否满行并删除满行的俄罗斯方块 三、程序设计 1、程序总体结构设计 (1)、游戏方块预览功能。在游戏过程中,游戏界面右侧会有预览区。由于在此游戏中存在多种不同的游戏方块,所以在游戏方块预览区域中显示随机生成的游戏方块有利于游戏玩家控制游戏的策略。 (2)、游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、自由下落、旋转功能,以及行满消除行的功能。 (3)、游戏数据显示功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。例如,消除一行加100分,游戏分数达到一定数量

用vb编写图形

来个房子的吧: Private Sub Command1_Click() Dim i As Integer, n As Integer Cls n = 5 For i = 1 To 3 Print String(4 - i, " ") & String(2 * i - 1, "*") & String(10, "*") Next For i = 1 To 4 Print " * *" & String(9, " ") & "*" Next Print " " & String(15, "*") End Sub VB 填充封闭区间 Private Declare Function FloodFill Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Sub Command1_Click() Dim hBrush As Long Dim OldhBrush As Long hBrush = CreateSolidBrush(RGB(0, 0, 255))'要填充的颜色 OldhBrush = SelectObject(Me.hdc, hBrush) Me.Line (10, 10)-(100, 100), RGB(255, 0, 0), B FloodFill Me.hdc, 20, 20, RGB(255, 0, 0)'区间边界颜色 SelectObject Me.hdc, OldhBrush DeleteObject hBrush End Sub

C语言课程设计俄罗斯方块源代码

1、新建“.h”头文件,将“头文件” 代码粘贴至其中, 2、新建“.c”源文件,将“源代码” 代码粘贴到其中。 3、新建空白工程,将头文件和源代码 添加进去,调试使用。 //头文件 //1.自定义枚举类型,定义7种形态的游戏方块 typedef enum tetris_shape { ZShape=0, SShape, LineShape, TShape, SquareShape, LShape, MirroredLShape }shape; //2.函数声明 //(1)操作方块函数 int maxX();//取得当前方块的最大x坐标 int minX();//取得当前方块的最小x坐标 void turn_left();//当前方块逆时针旋转90度 void turn_right(); int out_of_table(); void transform(); int leftable(); int rightable(); int downable(); void move_left(); void move_right(); //(2)操作游戏桌面的函数 int add_to_table();

void remove_full(); //(3)控制游戏函数 void new_game(); void run_game(); void next_shape(); int random(int seed); //(4)绘图函数 void paint(); void draw_table(); //(5)其他功能函数 void key_down(WPARAM wParam); void resize(); void initialize(); void finalize(); //(6)回调函数,用来处理Windows消息 LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM); //源代码 //1.文件包含 #include #include #include #include"tetris.h" //2.常量定义 #define APP_NAME "TETRIS" #define APP_TITLE "Tetris Game" #define GAMEOVER "GAME OVER" #define SHAPE_COUNT 7 #define BLOCK_COUNT 4 #define MAX_SPEED 5 #define COLUMS 10 #define ROWS 20 #define RED RGB(255,0,0)

俄罗斯方块完整源代码

//不多说,直接可以拷贝下面的东西,就可以运行。 package day04; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.applet.*; import https://www.doczj.com/doc/d94274002.html,ng.String.*; import https://www.doczj.com/doc/d94274002.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个方格的垂直位置

俄罗斯方块源代码

1. using System; using System.Collections.Generic; using System.Text; using System.Drawing;//add namespace俄罗斯方块 { public class Block { private short width; private short height; private short top; private short left; private int ID; //方块部件的ID public int[,] shape;//存储方块部件的形状,0为空白,1为有砖块 public Block()//构造函数 { Random randomGenerator = new Random(); int randomBlock = randomGenerator.Next(1, 6);//产生1—4的数 this.ID = randomBlock; switch (this.ID) { case 1: //横条形 this.Width = 4; this.Height = 1; this.Top = 0; this.Left = 3; shape = new int[this.Width, this.Height]; shape[0, 0] = 1; shape[1, 0] = 1; shape[2, 0] = 1; shape[3, 0] = 1; break; case 2://正方形 this.Width = 2; this.Height = 2; this.Top = 0; this.Left = 4; // Creates the new shape for this block. shape = new int[this.Width, this.Height]; shape[0, 0] = 1; shape[0, 1] = 1; shape[1, 0] = 1;shape[1, 1] = 1; break; case 3://T形 this.Width = 3; this.Height = 3; this.Top = 0; this.Left = 4; // Creates the new shape for this block. shape = new int[this.Width, this.Height]; shape[0, 0] = 1; shape[1, 0] = 1; shape[2, 0] = 1; shape[1, 1] = 1; shape[1, 2] = 1; break; case 4://L形 this.Width = 2; this.Height = 3; this.Top = 0; this.Left = 4;

VC++ 6.0 MFC 俄罗斯方块 自动求解 代码 源程序

#include #include #include #include #define tDown 1 //方块下落定时器的标识(编号) #define tPaint 2 //重绘定时器的标识(编号) #define tDownTime 500 //方块下落一行位置的时间间隔 #define tPaintTime 50 //窗口重绘的时间间隔 #define ROW 24 //地图的行数目(第23行不用) #define COL 14 //地图的列数目(第0列和第13列不用) #define MAX_CLASS 7 //方块形状数目 #define LEN 20 //每个方格大小为20×20像素 #define StartY -1 * LEN + 5 //-15,绘制俄罗斯方块地图时的边界起始位置#define StartX -1 * LEN + 5 //-15 int iDeleteRows = 0; //总共清除的行 int iTotalNum = 0; //总得分 char WindowTxt[100] = "俄罗斯方块游戏自动求解已关闭"; //窗口标题 char s1[] = "关闭", s2[] = "启动"; //用于启动/关闭自动求解功能时显示不同的标题

bool bAuto; //是否自动求解的标志 bool Pause; //是否暂停的标志 int Map[ROW][COL]; //俄罗斯方块的地图(被占据的方格为1,否则为0) int CurrentBox[4][4]; //当前落下的方块 int CurrentY, CurrentX; //当前落下方块的当前位置(指左上角位置) int NextBox[4][4]; //下一个将落下的方块 int Box[MAX_CLASS][4][4] = //7种方块形状 { { {0,0,0,0}, {1,1,1,1}, {0,0,0,0}, {0,0,0,0} }, { {0,0,0,0}, {0,1,0,0}, {1,1,1,0}, {0,0,0,0} }, { {0,0,0,0}, {1,1,0,0}, {0,1,1,0}, {0,0,0,0} }, { {0,0,0,0}, {0,1,1,0}, {1,1,0,0}, {0,0,0,0} }, { {0,1,1,0}, {0,0,1,0}, {0,0,1,0}, {0,0,0,0} }, { {0,1,1,0}, {0,1,0,0}, {0,1,0,0}, {0,0,0,0}

俄罗斯方块程序代码

//包含头文件 #include #include #include #include #include #include "Tetris.h" //int score=0; //int lever=1; //char scores[10]; //char levers[10]; /* enum cmd { round, //旋转方块 left, //左移方块 right, //右移方块 down, //下一方块 bottom, //方块沉底 quit //离开游戏 }; //定义绘制方块的状态的枚举类型 enum draw { show, //显示方块 hide //抹掉方块 }; //定义俄罗斯方块的结构体 struct block { int dir[4]; //方块的四个旋转的状态 int color; //方块的颜色 }*/ static T_TrsBlockStyle gz_tBlockStyleTab[7] = {/* 口口 口口口口口口口口口口 口口 口口*/ {0x0F00, 0x4444, 0x0F00, 0x4444, RED}, /*

口口口口口口口口 口口口口口口口口 */ {0x0660, 0x0660, 0x0660, 0x0660, BLUE}, /* 口 口口口口口口口 口口口口口口口 口*/ {0x4460, 0x02E0, 0x0622, 0x0740, MAGENTA}, /* 口 口口口口口口口 口口口口口口口 口*/ {0x2260, 0x0E20, 0x0644, 0x0470, YELLOW}, /* 口口 口口口口口口口口 口口口口口口 */ {0x0C60, 0x2640, 0x0C60, 0x2640, CYAN}, /* 口口 口口口口口口口口 口口口口口口 */ {0x0360, 0x4620, 0x0360, 0x4620, GREEN}, /* 口口口 口口口口口口口口口口 口口口 */ {0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN}}; /* //定义俄罗斯方块的信息的结构体 struct blockinfo { int id; //7中方块中的哪一种 byte dir:2; //1种方块中四个方向中的哪个 char x,y; //方块的坐标(不是屏幕中的而是自己设置的游戏区域中的)} curblock,nextblock; */ // 定义游戏区 //unsigned char area[width][high] = {0}; //函数声明

JAVA俄罗斯方块源代码

不多说,,直接可以拷贝下面的东西,然后记得把那个BLOCK的名字改成你自己的类名,这个很关键哦,不然是错的可别怪我,呵呵~~ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.applet.*; import https://www.doczj.com/doc/d94274002.html,ng.String.*; import https://www.doczj.com/doc/d94274002.html,ng.*; import java.io.*; public class Block 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个方格的垂直位置 static boolean downSign = false;//是否落下 static int blockNumber = 1;//砖块的编号 static int gameScore = 0;//游戏分数 static int speedMark = 1;

VB 俄罗斯方块的设计

一、课程设计的目的与要求 (2) 1.1、俄罗斯方块的要求 (2) 1.2、俄罗斯方块设计的目的 (3) 二、题目分析 (4) 2.1、概要设计 (4) 2.2、详细设计 (4) 游戏区模块的设计 (5) 控制区模块的设计 (5) 三、设计思路 (6) 3.1、系统流程的总设计 (6) 3.2、游戏区模块的设计 (7) 3.2.1、Bitblt函数参数的意义与用法 (7) 3.2.2、俄罗斯方块的旋转 (8) 3.2.3、如何实现方自动消除满行的方块 (9) 3.2.4、随机从 7 个方块中选择一个 (10) 3.2.5、设置每个模块的测试计 (11) 3.3、整体游戏程序的结构设计 (11) 3.4、程序设计 (13) 四、调试过程 (14) 4.1、设计游戏界面 (14) 4.2、完善与改善游戏界面 (15) 五、运行结果 (18) 六、课程设计总结 (20) 附录 (22)

一、课程设计的目的与要求 1.1、俄罗斯方块的要求 俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分,俄罗斯方块游戏是一款适合大众的游戏软件,它适合不同年龄的人玩。本软件要实现的功能如下: (1)游戏区:玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况。 (2)游戏控制:玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏。 (3)级别设置:玩家可以根据自己的需要自行设定游戏的开始级别,级别越高,游戏的速度越快,难度越大。 游戏规则如下: (1)电脑随机产生4个小方块组成的不同形状的游戏块,从上往下降落。 (2)游戏面板的宽度为12(以小方块的宽度为单位),高度为22,当一行被12个小方块填满时,此行便会被自动消除。 (3)利用键盘上的左右箭头键可以控制游戏块的左移与右移。 (4)利用键盘上的向上箭头键可以控制游戏块的旋转。

C语言程序设计-俄罗斯方块源程序

其中的主要逻辑有: (1)由于c的随机性函数不好,所以每次游戏开始根据bios时间设置种子。 (2)得分越高,方块下降速度越快(每200分为单位)。 (3)每下落一个方块加1分,每消除一行加10分,两行加30分,三行加70分,四行加150分。初试分数为100分。 游戏控制: up-旋转;空格-下落到底;左右下方向键-控制方向。P-开始或暂停游戏。ESC-退出。 特点: (1)由于tc不支持中文,所以基本都是英文注释。 (2)函数命名尽可能规范的表达其内部处理目的和过程。 (3)代码加上注释仅有577行。(我下载过的两个俄罗斯方块代码一个在1087行,一个在993行,我的比它们代码少)。 (4)除了消除空格时算法比较复杂,其他算法都比较简单易读。 (5)绘图效率和局部代码效率扔有待提高。 (6)FrameTime参数可能依据不同硬件环境进行具体设置,InitGame需要正确的TC路径。 俄罗斯方块源于大约9年前上大一时的一个梦,我们在学习c语言时,我的同寝室友邀请我合作一起完成俄罗斯方块(课外作业性质),但是当时限于我们的水平比较菜和学习状态比较懒散,我们没有完成。大一的时候我在机房里无意发现别人留下的俄罗斯方块程序,运行,老师发现后激动的问我是我写的吗,我惭愧的摇摇头。那时看到别人做c的大程序深感羡慕(自己只是写几十行的程序)。数年后我仍然看到有不同样式的实现,但是我一直没有实现它,知道今天忽然有这个想法去做,算是弥补多年前的遗憾和心愿吧。 --------------------------------------------- Q&A: ---------------------------------------------- Q:我编译时出现错误:fatal error C1083: Cannot open include file: 'bios.h': Nosuch file or directory,该如何解决? A:正文中的代码,是使用Borland公司的TC2.0编译的,编译结果运行在Windows的16位虚拟机上。bi os.h是属于TC的头文件,在VC或者其他编译器中可能没有这个头文件。因此会产生这个错误。 解决办法: (1)可以下载附件中的压缩包,是使用VC6.0进行编译的版本,编译结果是Windows程序,运行在wind ows 32系统上。两者之间的算法完全一致,区别仅仅是绘图时采用的接口不同,TC下采用BGI(进入图形模式),VC下采用的是GDI(使用DC进行绘图)。 (2)下载TC2.0进行编译。 Q:使用TC3.0进行编译时,提示未能初始化图形模式,请使用initgraph函数。 A:这是因为TC3.0的BGI文件的路径和TC2.0有所不同。TC2.0的BGI文件位于TC路径下。而TC3.0的BGI文件位于BGI文件夹中。请把initgame函数中的initgraph函数中的第三个参数设置为正确的路径。例如:initgraph(&..,&..,"C:\\TC\\BGI"); Q:编译后运行时,弹出错误对话框报告16位虚拟机遇到不可执行的指令,点击确定后退出。 A:该问题在某些环境中出现,可能是基于软件或者硬件环境造成,具体原因暂时未知。为避免该问题,请加载附件中的压缩包VC6.0版本。

C#俄罗斯方块(附代码)

C#俄罗斯方块程序设计 姓名: 学号: 专业:计算机科学与技术学院 班级:级班 时间:2009—2010年第一学期 该实验制作的是小游戏----俄罗斯方块 1.可实现以下基本功能: 用户可自定义添加或删除方块样式及颜色; 用户可自定义修改游戏背景颜色及按键设置。 2.另增加了几个功能: 按键设置改变后点击保存,会弹出对话框提示“保存成功”; 点击“开始”运行游戏,背景音乐自动播放,点击暂停后,背景音乐也随之停止;每消除一行,会有特效声音提示消除成功; 根据消行多少会自动加分并显示。

游戏界面效果图如下: 配置窗体效果图如下:

砖块样式配置效果图如下:

游戏设计分为如下九个部分: 一,新建窗体“配置窗体”(TrmConfig)添加TabControl控件

(1)砖块样式配置 I.abel控件(lblMode) 点击“事件”,选择“Paint” Graphics gp=e.Graphics; gp.Clear(Color.Black); Pen p=new Pen(Color.White); for (int i=31;i<155;i=i+31) gp.DrawLine(p,1,i,155,i); for (int i=31;i<155;i=i+31) gp.DrawLine(p,i,1,i,155); SolidBrush s=new SolidBrush(blockColor); for (int x=0;x<5;x++) { for(int y=0;y<5;y++) { if(struArr[x,y]) { gp.FillRectangle(s,31*x+1,31*y+1,30,30); } } } 点击“事件”,选择“MouseClick” private bool[,] struArr=new bool[5,5]; private Color blockColor=Color.Red; -------------------------------------------------------- if (e.Button!=MouseButtons.Left) return; int xPos,yPos; xPos=e.X/31; yPos=e.Y/31; struArr[xPos,yPos]=!struArr[xPos,yPos]; bool b=struArr[xPos,yPos]; Graphics gp=lblMode.CreateGraphics(); SolidBrush s=new SolidBrush(b ? blockColor:Color.Black); gp.FillRectangle(s,31*xPos+1,31*yPos+1,30,30); gp.Dispose(); II.添加ColorDialog控件 添加label(lblColor)控件 点击“事件”,选择“click” colorDialog1.ShowDialog(); blockColor=colorDialog1.Color; lblColor.BackColor=colorDialog1.Color;

《俄罗斯方块》程序编写超详细解释

Tc2.0 编写俄罗斯方块游戏 很多编程爱好者都编写过俄罗斯方块的游戏程序。很久以前,我用Tc2.0也做过一个;最近有好些朋友看见我以前的俄罗斯方块的程序后, 问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。正好现在放假了,而且离回家还有几天。于是我就把这个程序重新写了一遍,尽量使程序的结构比较清晰好懂一些。同时写了下面的这份东西。 俄罗斯方块游戏的程序中用到了一些方法。为了比较容易理解这些方法,我在讲述的同时写了些专门针对这些方法的示例程序。这些示例程序力求短小,目的是用最小的代码能够清楚的示例所用的方法。这些示例程序都经过tc2.0测试。最后还附了完整的俄罗斯方块游戏的源代码,和最终的可执行程序。如果你看了这份东东,有什么意见和想法,请发电子邮件告诉我。我将会继续更新这分东东,最新的版本可以在我的个人主页上下载。 下面的问题是有关俄罗斯方块程序的,其中有些是朋友问我的,有些是我认为可能会被问到的。我尽量按问题从易到难排列这些问题。关于俄罗斯方块程序的一些问题: ****************************************************** Tc2.0中怎么样设置图形显示? Tc2.0中常用图形函数的用法? 怎样获取鍵盘输入? 怎样控制方块的移动? 怎样控制时间间隔(用于游戏中控制形状的下落)? 游戏中的各种形状及整个游戏空间怎么用数据表示? 游戏中怎么判断左右及向下移动的可能性? 游戏中怎么判断某一形状旋转的可能性? 按向下方向键时加速某一形状下落速度的处理? 怎么判断某一形状已经到底? 怎么判断某一已经被填满? 怎么消去已经被填满的一行? 怎么消去某一形状落到底后能够消去的所有的行?(如长条最多可以消去四行) 怎样修改游戏板的状态? 怎样统计分数? 怎样处理升级后的加速问题? 怎样判断游戏结束? 关于计分板设计的问题。 关于“下一个”形状取法的问题。 剩下的问题。 ****************************************************** 新的问题: 我想有一个最高记录的显示,应该怎么做呀? 我想实现一个进度存储功能,应该怎么做呀?

相关主题
文本预览
相关文档 最新文档