?? game.java
字號:
//Game.java
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//************************************游戲主程序*****************************
public class Game extends Applet
{
private GameTable gTable;//創建一個游戲桌
private Image myImage0,myImage1;//加載兩個圖片,用來覆蓋背景和組成方塊
private AudioClip myAudio;//加載背景音樂
private JButton btStart,btRestart;//創建兩個按鈕,一個開始,一個重新開始
private int nTime=1000;//速度,創建記時器時使用
private int nWhich;//標志創建哪一個要下落的方塊
private boolean canMove=false; //標志是否響應鍵盤
private Root root;//要落下的方塊的引用,即根類
private int tempnWhich;//標志下一個要創建的方塊,即提前顯示下落塊
private Timer timer;//計時器,用于控制下落時間間隔
private int nScore=0;//每消掉一行加10分,用來記錄總分數
private JComboBox speedcombobox;//選擇速度的控件
private Label scorelabel;//顯示成績的控件
private StartListener startlistener;//開始按鈕事件監聽器
private String[] choices={"1","2","3","4","5","6","7","8","9"};//JComboBox的選項單
//***********************Initialize**********************
public void init()//初始化各個變量
{
btStart=new JButton("開始");
btRestart=new JButton("重來");
btStart.setToolTipText("開始游戲");//加提示
btRestart.setToolTipText("重新游戲");
setLayout(null);//自己定義布局
btStart.setBounds(320,270,90,25);//定位按鈕
btRestart.setBounds(320,330,90,25);
add(btStart);//添加按鈕
add(btRestart);
startlistener=new StartListener();//為兩個按鈕添加事件監聽
btStart.addActionListener(startlistener);
btRestart.addActionListener(new RestartListener());
btRestart.setEnabled(false);//開始時候禁用"重來"按鈕
myImage0=getImage(getCodeBase(),"b0.jpg");//加載圖片和聲音
myImage1=getImage(getCodeBase(),"b1.jpg");
myAudio=getAudioClip(getCodeBase(),"001.wav");
speedcombobox=new JComboBox(choices);//初始速度選擇控件
speedcombobox.addItemListener(new SpeedListener());
speedcombobox.setEditable(false);
speedcombobox.setBounds(320,70,90,20);
add(speedcombobox);
scorelabel=new Label("0");//初始化成績標簽控件
scorelabel.setBounds(320,125,90,20);
add(scorelabel);
gTable.x=15;//初始化游戲框架,創建一個15*20的游戲框架,0代表無方塊,1代表有方塊
gTable.y=20;
gTable.myTable=new int[gTable.x][gTable.y];
for(int i=0;i<gTable.x;i++)
for(int j=0;j<gTable.y;j++)
gTable.myTable[i][j]=0;
nWhich=(((int)Math.round(Math.random()*12345))%8)+1;//產生隨機方塊
switch(nWhich)//初始化產生的方塊
{
case 1:root=new One();break;
case 2:root=new Two();break;
case 3:root=new Three();break;
case 4:root=new Four();break;
case 5:root=new Five();break;
case 6:root=new Six();break;
case 7:root=new Seven();break;
case 8:root=new Eight();break;
default:break;
}
root.begin();//占據桌子,詳見root類
tempnWhich=(((int)Math.round(Math.random()*12345))%8)+1;//產生下一個提前顯示的方塊
nWhich=tempnWhich;
timer=new Timer(nTime,new MyRun());//創建記時器,調用MyRun
addKeyListener(new KeyAdapter()//主窗口添加鍵盤監聽器
{
public void keyPressed(KeyEvent e)
{
if(canMove)//如果滿足記時器開始
judgement(e);//響應輸入
}
});
btStart.addKeyListener(new KeyAdapter()//兩個按鈕添加鍵盤監聽器,前面添的是鼠標點擊監聽器
{
public void keyPressed(KeyEvent e)
{
if(canMove)
judgement(e);
}
});
btRestart.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if(canMove)
judgement(e);
}
});
}
//***********************Start**************************
public void start()
{
myAudio.loop();//循環播放背景音樂
}
public void stop()
{
myAudio.stop();//停止播放
}
public void paint(Graphics g)
{
g.setColor(new Color(131,20,62));//畫背景框架,兩個大長方形
for(int i=0;i<10;i++)
g.drawRect(10+i,10+i,420-2*i,400-2*i);
g.setColor(new Color(238,45,233));
for(int i=0;i<5;i++)
g.drawRect(40+i,40+i,267-2*i,352-2*i);
for(int i=0;i<gTable.x;i++)//根據桌子上的標記決定是否畫方塊
for(int j=0;j<gTable.y;j++)
{
if(gTable.myTable[i][j]==1)//有,畫藍方塊
{
g.drawImage(myImage1,45+i*(15+2)+2,45+j*(15+2)+2,this);
}
else if(gTable.myTable[i][j]==0)//無,畫白方塊
{
g.drawImage(myImage0,45+i*(15+2)+2,45+j*(15+2)+2,this);
}
}
btStart.repaint();//添加背景,按鈕控件和標簽
btRestart.repaint();
speedcombobox.repaint();
scorelabel.setText(Integer.toString(nScore));//更新成績
scorelabel.setBackground(new Color(55,240,40));
scorelabel.repaint();
g.drawString("級別",320,60);
g.drawString("成績:",320,110);
g.drawString("下一個:",325,165);
g.setColor(new Color(233,44,152));
nextTo(g);//畫下一個提前顯示的方塊
}
public void update(Graphics g)
{
paint(g);//防止閃爍
}
public void nextTo(Graphics g)//畫下一個提前顯示的方塊
{
for(int i=0;i<3;i++)//先全部用白方塊覆蓋
for(int j=0;j<4;j++)
g.drawImage(myImage0,330+i*(15+2),180+j*(15+2),this);
switch(tempnWhich)//根據標志決定畫哪個方塊,畫藍方塊
{//中間的參數根據各個方塊的不同形狀決定方塊的原點,
//使得有總是在標簽下固定位置顯示的效果
case 1:g.drawImage(myImage1,347,180,this);
g.drawImage(myImage1,347,197,this);
g.drawImage(myImage1,347,214,this);
g.drawImage(myImage1,347,231,this);
break;
case 2:g.drawImage(myImage1,330,197,this);
g.drawImage(myImage1,330,214,this);
g.drawImage(myImage1,347,197,this);
g.drawImage(myImage1,347,214,this);
break;
case 3:g.drawImage(myImage1,330,197,this);
g.drawImage(myImage1,330,214,this);
g.drawImage(myImage1,347,180,this);
g.drawImage(myImage1,347,197,this);
break;
case 4:g.drawImage(myImage1,330,180,this);
g.drawImage(myImage1,330,197,this);
g.drawImage(myImage1,347,197,this);
g.drawImage(myImage1,347,214,this);
break;
case 5:g.drawImage(myImage1,330,180,this);
g.drawImage(myImage1,330,197,this);
g.drawImage(myImage1,330,214,this);
g.drawImage(myImage1,347,180,this);
break;
case 6:g.drawImage(myImage1,330,180,this);
g.drawImage(myImage1,347,180,this);
g.drawImage(myImage1,347,197,this);
g.drawImage(myImage1,347,214,this);
break;
case 7:g.drawImage(myImage1,347,197,this);
g.drawImage(myImage1,347,214,this);
g.drawImage(myImage1,330,214,this);
g.drawImage(myImage1,364,214,this);
break;
case 8:g.drawImage(myImage1,347,197,this);
break;
default:break;
}
}
public void judgement(KeyEvent e)//判斷輸入的是哪個鍵,并做出響應
{
switch(e.getKeyCode())
{
case KeyEvent.VK_DOWN://如果是向下鍵,就一下到底,并產生一個新的方塊
root.downTo();
lineOver();//消去添滿的一行,并加10分
switch(nWhich)//產生新的方塊
{
case 1:root=new One();break;
case 2:root=new Two();break;
case 3:root=new Three();break;
case 4:root=new Four();break;
case 5:root=new Five();break;
case 6:root=new Six();break;
case 7:root=new Seven();break;
case 8:root=new Eight();break;
default:break;
}
tempnWhich=(((int)Math.round(Math.random()*12345))%8)+1;
nWhich=tempnWhich;
if(!root.begin())//如果新的方塊產生失敗,則游戲結束
{
repaint();
gameover();
}
else
{
repaint();
}
break;
case KeyEvent.VK_LEFT:root.left();repaint();break; //左移
case KeyEvent.VK_RIGHT:root.right();repaint();break;//右移
case KeyEvent.VK_UP:root.change();repaint();break; //轉動
default:break;
}
}
public void lineOver()//消去添滿的一行,成績加10分
{
boolean isCan;//標志是否消去某一行
boolean isContinue=true;//標志是否還有待消的行
int k=gTable.y-1;
while(isContinue)
{
isCan=true;
while(isCan)
{
for(int i=0;i<gTable.x;i++)
{
if(gTable.myTable[i][k]!=1)
isCan=false;
}
if(isCan)//滿足條件,開始消行
{
for(int i=0;i<gTable.x;i++)
gTable.myTable[i][k]=0;
for(int j=k-1;j>=0;j--)
for(int i=0;i<gTable.x;i++)
{
if(gTable.myTable[i][j]==1)
{
gTable.myTable[i][j+1]=1;
gTable.myTable[i][j]=0;
}
}
repaint();
nScore+=10;//加成績
}
}
k--;
if(k<1)
isContinue=false;
}
}
public void gameover()//游戲結束
{
timer.stop();
JOptionPane anOptionPane=new JOptionPane();//彈出對話框
anOptionPane.showMessageDialog(this,"游戲結束!","^_^",JOptionPane.WARNING_MESSAGE);
over();//處理各個變量,以便重新開始
}
public void over()//游戲結束后,處理各個變量,以便重新開始
{
timer.stop();
for(int i=0;i<gTable.x;i++)//重新給游戲圖框設置0標志
for(int j=0;j<gTable.y;j++)
{
gTable.myTable[i][j]=0;
}
repaint();
nScore=0;
switch(nWhich)//產生新的方塊
{
case 1:root=new One();break;
case 2:root=new Two();break;
case 3:root=new Three();break;
case 4:root=new Four();break;
case 5:root=new Five();break;
case 6:root=new Six();break;
case 7:root=new Seven();break;
case 8:root=new Eight();break;
default:break;
}
tempnWhich=(((int)Math.round(Math.random()*12345))%8)+1;
nWhich=tempnWhich;
root.begin();
repaint();
btStart.setLabel("開始");
btStart.setToolTipText("開始游戲");
btStart.setEnabled(true);
speedcombobox.setEnabled(true);
btRestart.setEnabled(false);
btStart.setLabel("開始");
startlistener.setisRun(true);
canMove=false;
}
public class MyRun implements ActionListener//記時器調用的監聽器
{
public void actionPerformed(ActionEvent e)
{
if(!root.down())//將方塊下落一行,如果不能再下降了,就調用下面語句
{
lineOver();//消行
switch(nWhich)//產生新的方塊
{
case 1:root=new One();break;
case 2:root=new Two();break;
case 3:root=new Three();break;
case 4:root=new Four();break;
case 5:root=new Five();break;
case 6:root=new Six();break;
case 7:root=new Seven();break;
case 8:root=new Eight();break;
default:break;
}
tempnWhich=(((int)Math.round(Math.random()*12345))%8)+1;
nWhich=tempnWhich;
if(!root.begin())//如果失敗,游戲結束
{
repaint();
gameover();
}
else
repaint();
}
else
{
repaint();
}
}
}
public class StartListener implements ActionListener//開始按鈕監聽器
{
private boolean isRun=true;//標志是開始還是暫停,一鈕兩用
public void setisRun(boolean run)
{
isRun=run;
}
public void actionPerformed(ActionEvent e)
{
speedcombobox.setEnabled(false);
btRestart.setEnabled(true);
if(isRun)//開始,運行狀態
{
btStart.setLabel("暫停");
btStart.setToolTipText("游戲暫停!");
timer.start();
isRun=!isRun;
canMove=true;//可以響應鍵盤
}
else//暫停狀態
{
btStart.setLabel("開始");
btStart.setToolTipText("開始游戲!");
timer.stop();
isRun=!isRun;
canMove=false;//不可以響應鍵盤
}
}
}
public class RestartListener implements ActionListener//重新開始按鈕監聽器
{
public void actionPerformed(ActionEvent e)
{
over();//重新初始化各個變量
}
}
public class SpeedListener implements ItemListener//速度控件監聽器
{
public void itemStateChanged(ItemEvent e)
{
nTime=1000-(new Integer(speedcombobox.getSelectedItem().toString()).intValue())*110;
timer=new Timer(nTime,new MyRun());//根據選擇的nTime間隔重新設置記時器,以變換速度
}
}
}//主程序結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -