📄 eluosi.java
字号:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.applet.AudioClip;
public class Eluosi extends java.applet.Applet
{
//创建一个游戏桌
private GameTable gTable;
//以下依次为窗体背景方格、第一种方格、第二种方格……第八种方格
private Image myImagebeijing,myImageone,myImagetwo,myImagethree,
myImagefour,myImagefive,myImagesix,myImageseven,myImageeight;
private Image image;//每次画方格的具体颜色图片
//创建背景音乐,如果想换掉背景音乐,把名为0.mid的音乐拷到sound中即可
private AudioClip myAudio1,myAudio2;
private JButton btStart,btRestart,btMusic;//两个按钮,Start,Restart
private int nTime=1000;
private int nWhich;//用于标志哪种要下落的方块,依次数字对应1……8种
private boolean canMove=false; //标志是否响应键盘,默认不响应
private boolean shutMusic=true;//标志是否关闭背景音乐,默认为关闭
private Root root;//要落下的方块的父类
private int tempnWhich;//标志下一个要下落的方块,即提前显示下落块
private Timer timer;//记时器,用于控制下落时间间隔
private long nScore=0;//每消一行加100分,用来记录总分数
private JComboBox speedcombobox;//选择速度的控件
private Label scorelabel;//显示成绩
private StartListener startlistener;//开始按钮事件监听器
//JComboBox的选项单
private String[] choices={"1","2","3","4","5","6","7","8","9"};
public void init()//初始化各个变量
{
setBackground(new Color(204,255,255));//设置窗体背景色
btStart=new JButton("开始");//创建Start按钮
btRestart=new JButton("重来");
btMusic=new JButton("Close");
btStart.setToolTipText("游戏开始!");//提示为Start a game.
btRestart.setToolTipText("重新开始游戏。");
btMusic.setToolTipText("关闭背景音乐。");
setLayout(null);//不用布局管理器,以便自己定义位置
btStart.setBounds(30,317,80,20);//定位按钮
btRestart.setBounds(30,344,80,20);
btMusic.setBounds(30, 371,80,20);
add(btStart);//添加按钮
add(btRestart);
add(btMusic);
startlistener=new StartListener();//为两个按钮添加监听器
btStart.addActionListener(startlistener);
btRestart.addActionListener(new RestartListener());
btRestart.setEnabled(false);//初始重开始按钮,禁用
btMusic.addActionListener(startlistener);
myImagebeijing=getImage(getCodeBase(),"image/beijing.jpg");
myImageone=getImage(getCodeBase(),"image/one.jpg");
myImagetwo=getImage(getCodeBase(),"image/two.jpg");
myImagethree=getImage(getCodeBase(),"image/three.jpg");
myImagefour=getImage(getCodeBase(),"image/four.jpg");
myImagefive=getImage(getCodeBase(),"image/five.jpg");
myImagesix=getImage(getCodeBase(),"image/six.jpg");
myImageseven=getImage(getCodeBase(),"image/seven.jpg");
myImageeight=getImage(getCodeBase(),"image/eight.jpg");
myAudio1=getAudioClip(getCodeBase(),"sound/0.mid");
myAudio2=getAudioClip(getCodeBase(),"sound/1.wav");
speedcombobox=new JComboBox(choices);//初始速度控件
speedcombobox.addItemListener(new SpeedListener());
speedcombobox.setEditable(false);
speedcombobox.setBounds(30,290,80,20);
add(speedcombobox);
scorelabel=new Label("0");//初始成绩控件
scorelabel.setBounds(30,70,80,20);
add(scorelabel);
gTable.x=15;//创建一个15*20的游戏桌,0代表无方块,非0代表有方块
gTable.y=20;
gTable.myTable=new int[gTable.x][gTable.y];
for(int i=0;i<gTable.x;i++)//初始化使之各个方格为0
for(int j=0;j<gTable.y;j++)
gTable.myTable[i][j]=0;
//产生随机方块
nWhich=(((int)Math.round(Math.random()*65535))%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()*65535))%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);
}
});
btMusic.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()
{
myAudio1.loop();//循环播放背景音乐
}
public void stop()
{
myAudio1.stop();//停止播放
}
public void paint(Graphics g)
{
g.setColor(new Color(102,204,255));//画背景框架,两个大长方形
for(int i=0;i<10;i++)
g.drawRect(10+i,10+i,515-2*i,400-2*i);
g.setColor(new Color(102,102,153));
for(int i=0;i<5;i++)
g.drawRect(127+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]!=0)//有,画方块
{ //调用具体的方格
if(gTable.myTable[i][j]==1){
image=myImageone;
}
else if(gTable.myTable[i][j]==2){
image=myImagetwo;
}
else if(gTable.myTable[i][j]==3){
image=myImagethree;
}
else if(gTable.myTable[i][j]==4){
image=myImagefour;
}
else if(gTable.myTable[i][j]==5){
image=myImagefive;
}
else if(gTable.myTable[i][j]==6){
image=myImagesix;
}
else if(gTable.myTable[i][j]==7){
image=myImageseven;
}
else if(gTable.myTable[i][j]==8){
image=myImageeight;
}
else{}
g.drawImage(image,132+i*(15+2)+2,45+j*(15+2)+2,this);
}
else if(gTable.myTable[i][j]==0)//无,画背景方块
{
g.drawImage(myImagebeijing,132+i*(15+2)+2,45+j*(15+2)+2,this);
}
}
btStart.repaint();//以下众行为画背景控件和字符串
btRestart.repaint();
btMusic.repaint();
speedcombobox.repaint();
scorelabel.setText(Long.toString(nScore));//更新成绩
scorelabel.setBackground(new Color(204,255,255));
scorelabel.repaint();
g.setColor(new Color(233,44,152));
g.drawString("速度(1...9)",31,280);
g.drawString("分数:",30,60);
g.drawString("下一个:",30,120);
g.drawString("游戏使用说明:", 410, 55);
g.setColor(new Color(153,0,204));//设置字体颜色
g.drawString("通过控制键盘上、", 410, 85);
g.drawString("下、左、右四个键", 410, 105);
g.drawString("来移动图中的俄罗", 410, 125);
g.drawString("斯方块,每消除一", 410, 145);
g.drawString("行可加100分。", 410, 165);
g.setColor(new Color(204,0,255));//设置字体颜色
g.drawString("您还可以在左边通", 410, 195);
g.drawString("过设置俄罗斯方块", 410, 215);
g.drawString("的下降速度,来使", 410, 235);
g.drawString("游戏更Happy ^_^", 410, 255);
g.setColor(new Color(233,44,152)); //设置字体颜色
g.drawString("按“开始”,游戏", 410, 285);
g.drawString("开始,再按一次游", 410, 305);
g.drawString("戏将暂停,按“重", 410, 325);
g.drawString("来”键游戏将重新", 410, 345);
g.drawString("开始。", 410, 365);
g.setColor(new Color(51,0,102)); //设置字体颜色
g.drawString("--计算机系黄浦江--", 409, 387);
nextTo(g);//画下一个提前显示的方块
}
public void update(Graphics g)
{
paint(g);
}
public void nextTo(Graphics g)//画下一个提前显示的方块
{
for(int i=0;i<3;i++)//3*4,先全部用背景色方块覆盖
for(int j=0;j<4;j++)
g.drawImage(myImagebeijing,45+i*(15+2),140+j*(15+2),this);
switch(tempnWhich)//根据标志决定画哪个方块,以及哪种颜色
{
case 1:g.drawImage(myImageone,62,140,this);
g.drawImage(myImageone,62,157,this);
g.drawImage(myImageone,62,174,this);
g.drawImage(myImageone,62,191,this);
break;
case 2:g.drawImage(myImagetwo,45,157,this);
g.drawImage(myImagetwo,45,174,this);
g.drawImage(myImagetwo,62,157,this);
g.drawImage(myImagetwo,62,174,this);
break;
case 3:g.drawImage(myImagethree,45,157,this);
g.drawImage(myImagethree,45,174,this);
g.drawImage(myImagethree,62,140,this);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -