?? 源代碼.java
字號(hào):
package zh;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class rrt extends Applet implements Runnable {
Font font = new Font("Dialog", Font.BOLD,18);//定義字體
Thread thread;//定義線程
public java.awt.Graphics gg;//定義圖形變量
public boolean[][] screen;//控制游戲地圖
public int[] x;//記錄方塊的行坐標(biāo)
public int[] y;//記錄方塊的列坐標(biāo)
public int[] x1;//記錄方塊活動(dòng)之前的行坐標(biāo)
public int[] y1;//記錄方塊活動(dòng)之前的列坐標(biāo)
public int rand;//隨機(jī)數(shù)
public int[] row;//記錄每一行的方塊數(shù)
public int mark;//記錄每一關(guān)的分?jǐn)?shù)
public boolean open;//游戲清屏開關(guān)
public int pass;//游戲關(guān)數(shù)
public boolean game;//控制游戲開始開關(guān)
/**
* 繪制七種圖形并調(diào)用隨機(jī)函數(shù)令它隨機(jī)出現(xiàn)
* 創(chuàng)建日期:(2005-5-15 13:30:51)
*/
public void begin() {
int i;
rand=(int)(Math.random()*7)+1;
switch(rand)
{
case 1:
x[0]=4+0;y[0]=0;
x[1]=4+1;y[1]=0;
x[2]=4+2;y[2]=0;
x[3]=4+3;y[3]=0; //一字型
x[4]=4;y[4]=-1;
break;
case 2:x[0]=4+0;y[0]=0;
x[1]=4+1;y[1]=0;
x[2]=4+1;y[2]=1;
x[3]=4+2;y[3]=1; //Z字型
x[4]=4;y[4]=0;
break;
case 3:x[0]=4+1;y[0]=0;
x[1]=4+2;y[1]=0;
x[2]=4+0;y[2]=1;
x[3]=4+1;y[3]=1; //反Z型
x[4]=4;y[4]=0;
break;
case 4:x[0]=4+0;y[0]=0;
x[1]=4+1;y[1]=0;
x[2]=4+1;y[2]=1;
x[3]=4+1;y[3]=2; //7字型
x[4]=4;y[4]=0;
break;
case 5:x[0]=4+1;y[0]=0;
x[1]=4+2;y[1]=0;
x[2]=4+1;y[2]=1;
x[3]=4+1;y[3]=2; //反7字型
x[4]=4;y[4]=0;
break;
case 6:x[0]=4+1;y[0]=0;
x[1]=4+0;y[1]=1;
x[2]=4+1;y[2]=1;
x[3]=4+2;y[3]=1; //反T型
x[4]=4;y[4]=0;
break;
case 7:x[0]=4+0;y[0]=0;
x[1]=4+1;y[1]=0;
x[2]=4+0;y[2]=1;
x[3]=4+1;y[3]=1; //田字型
x[4]=4;y[4]=0;
}
for(i=0;i<4;i++)
if (screen[x[i]][y[i]+1] ) //判斷在抽取一種圖形后,在該圖形的下一行是否有障礙物
destroy();
save();
xian();
}
/**
* 控制方塊的變形
*/
public void change() {
int i,j=0;
int m[]=new int [4];
int n[]=new int [4];
if (rand!=7) //當(dāng)不為田字型時(shí),變形
{for(i=0;i<4;i++)
{
m[i]=y[i]-y[4]+x[4];
n[i]=2-x[i]+x[4]+y[4];//用兩個(gè)數(shù)組把變形后的圖形存起來
if (m[i]<0||m[i]>11||n[i]>18) j=1;
}
if (j!=1)
{
for(i=0;i<4;i++)
{
if (screen[m[i]][n[i]] )//判斷變形后的坐標(biāo)在沒變形之前該坐標(biāo)在游戲地圖中是否已有點(diǎn)存在
break;
}
if(i==4) //證明變形后的點(diǎn)不存在障礙
for(i=0;i<4;i++)
{
x[i]=m[i];
y[i]=n[i]; //把游戲地圖中變形后的圖形賦給活動(dòng)中的圖形
}
}
}
}
/**
* 清理掛起的資源。
* 如果 applet 是活動(dòng)的,它將被停止。
*/
public void destroy() {
game=false;
pass=1; //關(guān)數(shù)初始化
repaint(); //調(diào)用屏幕初始化
}
/**
*游戲初始化
*/
public void gameinit()
{
int i,j;
for (i=0;i<12;i++)
for (j=0;j<19;j++)
screen[i][j]=false;//把游戲地圖中所有點(diǎn)都清空
for (i=0;i<19;i++)
row[i]=0; //把每一行的方塊總數(shù)都清空
open=true; //打開游戲地圖清屏開關(guān)
mark=0;
begin();
}
/**
* 初始化整個(gè)程序
*/
public void init()
{
screen=new boolean[12][19];
x=new int [5];
y=new int [5];
x1=new int [4];
y1=new int [4];
row=new int [19];
pass=1;
game=false; //控制游戲開關(guān)
}
/**
*處理按鍵信息
*在處理方向(上下左右)控制時(shí),
*首先判斷它們的新位置是否可用,
*可用則執(zhí)行按鍵操作,否則不理會(huì)這次操作。
*/
public boolean keyDown(Event e, int key)
{int i;
if (key=='s'&& !game)
{
game=true;//游戲開始
repaint();
}
if(game)
{
save();
switch(key)
{case Event.LEFT:
for(i=0;i<4;i++)
if (x[i]<1 || screen[x[i]-1][y[i]])//判斷是否到達(dá)屏幕最左邊或活動(dòng)中方塊的左邊一格有沒有靜止的方塊
break;
if(i==4) // 當(dāng)還未到達(dá)最左邊,則方塊向左移動(dòng)
for(i=0;i<5;i++)
x[i]-=1;
break;
case Event.RIGHT:
for(i=0;i<4;i++)
if (x[i]>10 || screen[x[i]+1][y[i]])//判斷是否到達(dá)屏幕最右邊或活動(dòng)中方塊的右邊一格有沒有靜止的方塊
break;
if(i==4) //當(dāng)還未到達(dá)最右邊,則方塊向右移動(dòng)
for(i=0;i<5;i++)
x[i]+=1;
break;
case Event.DOWN:
for(i=0;i<4;i++)
if ( y[i]== 18)//判斷是否到達(dá)游戲地圖最底端
reach();
for(i=0;i<4;i++)
if (screen[x[i]][y[i]+1] )//判斷活動(dòng)中的方塊在向下一格是否有障礙物
reach();
for(i=0;i<5;i++)
y[i] += 1;//活動(dòng)方塊向下移動(dòng)一格
break;
case Event.UP:
change();
}
xian();
}
return true;
}
/**
* 繪制游戲界面
*/
public void paint(Graphics g) {
g.setFont(font);
g.setColor(Color.red);
g.fillRect(50,70,320,450);
g.setColor(Color.black);
g.fillRect(60,80,300,430);
if (game)
gameinit();//調(diào)用游戲初始化
else
{
g.setColor(Color.green);
g.drawString("按下S鍵游戲開始",130,200);
}
}
/**
* 到達(dá)事件
* 判斷滿行及消行
*/
public void reach() {
int i,j=18,k=0;
for (i=0;i<4;i++)
{
screen[x[i]][y[i]]=true;
row[y[i]]++;
}
//處理消行
while (row[j]!=0)
{
while (row[j-k]==12) k++;//幾行連續(xù)在一起,統(tǒng)計(jì)消行數(shù)
if (k>0)//使屏幕方塊向下移動(dòng)
{ if (row[j-k]!=0)
{ for(i=0;i<12;i++)
screen[i][j]=screen[i][j-k];
row[j]=row[j-k];
}
else
{ for(i=0;i<12;i++)
screen[i][j]=false;
row[j]=0;
}
}
j--;
}
if (k>0) open=true;
mark+=k*10;//統(tǒng)行分?jǐn)?shù)
if (mark>=200)
{
pass++;
gameinit();
}
begin();
}
/**
* 方塊的向下移動(dòng)
*/
public void run()
{
int i,j;
while (true) {
if (game) {
save();
for(i=0;i<4;i++)
if ( y[i]== 18 )//判斷活動(dòng)方塊是否到達(dá)游戲界面最底端
reach();
for(i=0;i<4;i++)
if (screen[x[i]][y[i]+1] )//判斷活動(dòng)方塊在向下的一行是否有障礙物
reach();
for(i=0;i<5;i++)
y[i] += 1;//活動(dòng)方塊向下移動(dòng)一行
xian();
}
try {Thread.sleep(1200-pass*300); }//根據(jù)關(guān)數(shù)的增加而加快游戲速度
catch (InterruptedException e) { break;}
}
}
/**
* 保存原有的數(shù)據(jù)
*/
public void save()
{
int i;
for(i=0;i<4;i++)
{x1[i]=x[i];
y1[i]=y[i];
}
}
/**
* 啟動(dòng)線程。
*/
public void start() {
if (thread == null){
thread = new Thread(this);
thread.start();
}
}
/**
* 終止線程,并將之歸入無用單元收集。
*/
public void stop() {
if (thread != null){
thread.stop();
thread = null;
}
}
/**
* 繪制方塊
*/
public void xian()
{
int i=0,j=0;
gg = getGraphics();
if (open)
{
open=false;
gg.setColor(Color.white);
gg.fillRect(400,150,100,350);
gg.setFont(font);
gg.setColor(Color.black);
gg.drawString("分?jǐn)?shù): "+mark,400,200);
gg.drawString("第 "+pass+" 關(guān)",400,300);
gg.setColor(Color.black);
gg.fillRect(60,80,300,430);
for (i=18;i>0;i--)
for (j=0;j<12;j++)
if (screen[j][i])
{
gg.setColor(Color.green);
gg.fillRect(60+j*25+1,30+i*25+1,23,23);
gg.setColor(Color.blue);
gg.fillRect(60+j*25+5,30+i*25+5,15,15);
}
}
gg.setColor(Color.black);
for(i=0;i<4;i++)
if (y1[i]>1)
gg.fillRect(60+x1[i]*25,30+y1[i]*25,25,25);
for (i=0;i<4;i++)
if (y[i]>1)
{
gg.setColor(Color.green);
gg.fillRect(60+x[i]*25+1,30+y[i]*25+1,23,23);
gg.setColor(Color.blue);
gg.fillRect(60+x[i]*25+5,30+y[i]*25+5,15,15);
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -