俄罗斯方块java源代码_java语言-俄罗斯方块Java源码案例

这是一个使用Java编写的俄罗斯方块游戏源码,包括游戏逻辑、图形绘制和键盘事件处理。源码中定义了游戏区域、方块颜色、方块形状等核心元素,并实现了游戏初始化、方块旋转、游戏结束条件检查等功能。
摘要由CSDN通过智能技术生成

只提供参考源码

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

{

screendata[x][y]=0;

}

emptyline=y;

}

}

}

public void scrollDown()

{

short x,y;

for(y=emptyline;y>0;y--)

{

for(x=0;x

{

screendata[x][y]=screendata[x][y-1];

}

}

for(x=0;x

{

screendata[x][0]=0;

}

emptyline=-1;

}

public void showScore()

{

String s;

goff.setFont(smallfont);

goff.setColor(Color.white);

s="得分: "+score;

goff.drawString(s,width/2-40,(yblocks+1)*blocksize+10);

}

public void run()

{

long starttime;

Graphics g;

Thread.currentThread().setPriorit(Thread.MAX_PRIORITY);

g=getGraphics();

while(true)

{

starttime=System.currentTimeMillis();

try

{

paint(g);

starttime+=60;

Thread.sleep(Math.max(0,starttime-System.currentTimeMillis()));

}

catch(InterruptedException e)

{

break;}

}

}

public void start()

{

if(thethread==null) {

thethread=new Thread(this);

thethread.start();

}

}

public void stop()

{

if (thethread!=null) {

thethread.stop();

thethread=null;

}

}

}

3a9cae3d9a66bef58fd36eb12433cf28.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值