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

只提供参考源码

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<xblocks;i++)
{
for(j=0;j<yblocks;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<xblocks;x++)
{
for(y=0;y<yblocks;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<xblocks;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<xblocks;x++)
{
screendata[x][y]=0;
}
emptyline=y;
}
}
}
public void scrollDown()
{
short x,y;
for(y=emptyline;y>0;y--)
{
for(x=0;x<xblocks;x++)
{
screendata[x][y]=screendata[x][y-1];
}
}
for(x=0;x<xblocks;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;
}
}
}

  <ignore_js_op>


<ignore_js_op>


2.jpg (15.48 KB, 下载次数: 0)

详细说明:http://java.662p.com/thread-47-1-1.html

时间: 2024-12-21 12:51:26

java语言-俄罗斯方块Java源码案例的相关文章

JAVA上百实例源码以及开源项目

简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬.向往!此时此景,笔者只专注Android.Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能.编辑音乐软件的朋友,这款实例会对你有所帮助.Calendar万年历 1个目标文件EJ

死磕 java集合之DelayQueue源码分析

问题 (1)DelayQueue是阻塞队列吗? (2)DelayQueue的实现方式? (3)DelayQueue主要用于什么场景? 简介 DelayQueue是java并发包下的延时阻塞队列,常用于实现定时任务. 继承体系 从继承体系可以看到,DelayQueue实现了BlockingQueue,所以它是一个阻塞队列. 另外,DelayQueue还组合了一个叫做Delayed的接口,DelayQueue中存储的所有元素必须实现Delayed接口. 那么,Delayed是什么呢? public

《java.util.concurrent 包源码阅读》13 线程池系列之ThreadPoolExecutor 第三部分

这一部分来说说线程池如何进行状态控制,即线程池的开启和关闭. 先来说说线程池的开启,这部分来看ThreadPoolExecutor构造方法: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecut

Java集合类库 ArrayList 源码解析

集合类库是Java的一个重大突破,方便了我们对大数据的操作.其中 Arrays 和 Collections 工具类可以帮助我们快速操作集合类库.下面对Java集合类库的源码分析是基于jdk1.7的.今天我们来看看ArrayList的底层实现原理. ArrayList的继承结构图 继承自 AbstractList 抽象类,在上层是 AbstractCollection 抽象类,直接去 AbstractCollection 类去看看. AbstractCollection 类主要实现了 Collec

Java IO 之 OutputStream源码

Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter    :BYSocket 一.前言 上一篇<Java IO 之 InputStream源码>,说了InputStream.JDK1.0中就有了这传统的IO字节流,也就是 InputStream 和 OutputStream.梳理下两者的核心: InputStream中有几个 read() 方法和 O

《java.util.concurrent 包源码阅读》06 ArrayBlockingQueue

对于BlockingQueue的具体实现,主要关注的有两点:线程安全的实现和阻塞操作的实现.所以分析ArrayBlockingQueue也是基于这两点. 对于线程安全来说,所有的添加元素的方法和拿走元素的方法都会涉及到,我们通过分析offer方法和poll()方法就能看出线程安全是如何实现的. 首先来看offer方法 public boolean offer(E e) { checkNotNull(e); final ReentrantLock lock = this.lock; lock.lo

Java集合---Array类源码解析

Java集合---Array类源码解析              ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型:采用改进的归并排序. 1.对于基本类型源码分析如下(以int[]为例): Java对Primitive(int,float等原型数据)数组采用快速排序,对Object对象数组采用归并排序.对这一区别,sun在

《java.util.concurrent 包源码阅读》 结束语

<java.util.concurrent 包源码阅读>系列文章已经全部写完了.开始的几篇文章是根据自己的读书笔记整理出来的(当时只阅读了部分的源代码),后面的大部分都是一边读源代码代码,一边写文章. 由于水平有限,在阅读源代码的时候,分析得也比较浅显,也有很多地方自己也没有研究明白,文章有的地方显得语焉不详,只能请各位多多见谅了. 后面会继续写一些关于Java并发编程的文章,希望各位多多指教. 这里整理了一个简单的目录,包含了本系列所有文章的链接: <java.util.concurr

java线程池ThreadPoolExector源码分析

java线程池ThreadPoolExector源码分析 今天研究了下ThreadPoolExector源码,大致上总结了以下几点跟大家分享下: 一.ThreadPoolExector几个主要变量 先了解下ThreadPoolExector中比较重要的几个变量.  corePoolSize:核心线程数量     maximumPoolSize:最大线程数量 allowCoreThreadTimeOut:是否允许线程超时(设置为true时与keepAliveTime,TimeUnit一起起作用)