?? 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的選項單
public void init()//初始化各個變量
{
btStart=new JButton("Start");
btRestart=new JButton("Restart");
btStart.setToolTipText("Start a game.");//加提示
btRestart.setToolTipText("Restart a game.");
setLayout(null);//不用布局管理器,以便自己定義位置
btStart.setBounds(320,275,80,20);//定位按鈕
btRestart.setBounds(320,320,80,20);
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(),"0.wav");
speedcombobox=new JComboBox(choices);//初始速度控件
speedcombobox.addItemListener(new SpeedListener());
speedcombobox.setEditable(false);
speedcombobox.setBounds(320,70,80,20);
add(speedcombobox);
scorelabel=new Label("0");//初始成績控件
scorelabel.setBounds(320,125,80,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);
}
});
}
public void start()
{
myAudio.loop();//循環播放背景音樂,很好聽^0^
}
public void stop()
{
myAudio.stop();//停止播放
}
public void paint(Graphics g)
{
g.setColor(new Color(231,20,131));//畫背景框架,兩個大長方形
for(int i=0;i<10;i++)
g.drawRect(10+i,10+i,420-2*i,400-2*i);
g.setColor(new Color(255,0,0));
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(191,186,220));
scorelabel.repaint();
g.drawString("Speed(1..9)",320,60);
g.drawString("Score:",320,110);
g.drawString("Next:",325,165);
g.setColor(new Color(233,44,152));
g.drawString("WangXin2010",322,380);//作者 王欣
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;//詳見root類
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,"Game Over! Thank You!","HHr",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("Start");
btStart.setToolTipText("Start a game.");
btStart.setEnabled(true);
speedcombobox.setEnabled(true);
btRestart.setEnabled(false);
btStart.setLabel("Start");
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("Pause");
btStart.setToolTipText("Pause a game.");
timer.start();
isRun=!isRun;
canMove=true;//可以響應鍵盤
}
else//是暫停
{
btStart.setLabel("Start");
btStart.setToolTipText("Start a game.");
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 + -