📄 russiarect.java
字号:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RussiaRect extends Applet
{
private GameTable myGameTable; //创建一个游戏桌
private Image rectImageOne,rectImageTwo; //加载两个图片,用来覆盖背景和组成方块
private JButton btStart,btRestart; //创建两个按钮,一个开始,一个重新开始
private int speed=800; //速度,创建记时器是使用
private int currentRect; //标志创建哪一个要下落的方块
private boolean canMove=false; //标志是否响应键盘
private Root root; //要落下的方块的引用,即根类
private int nextRect; //标志下一个要创建的方块,即提前显示下落块
private Timer timer; //记时器,用于控制下落时间间隔
private int nScore=0; //用来记录总分数
private JComboBox speedContorller; //选择速度的控件
private Label scorelabel; //显示成绩的控件
private StartListener startlistener; //开始按钮事件监听器
private String[] choices={"1","2","3","4","5"};//JComboBox的选项单
public void init()//初始化各个变量
{
btStart=new JButton("开始");
btRestart=new JButton("重新开始");
btStart.setToolTipText("开始新游戏");
btRestart.setToolTipText("重新开始游戏");
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); //禁用初始重开始按钮
rectImageOne=getImage(getCodeBase(),"rect0.jpg");//加载图片
rectImageTwo=getImage(getCodeBase(),"rect1.jpg");
speedContorller=new JComboBox(choices);//初始速度控件
speedContorller.addItemListener(new SpeedListener());
speedContorller.setEditable(false);
speedContorller.setBounds(320,70,80,20);
add(speedContorller);
scorelabel=new Label("0");//初始成绩控件
scorelabel.setBounds(320,125,80,20);
add(scorelabel);
myGameTable.x=15;//初始化游戏桌
myGameTable.y=20;
myGameTable.myTable=new int[myGameTable.x][myGameTable.y];
for(int i=0;i<myGameTable.x;i++)
for(int j=0;j<myGameTable.y;j++)
myGameTable.myTable[i][j]=0;
currentRect=(((int)Math.round(Math.random()*12345))%8)+1;//产生随机方块
switch(currentRect)//初始化产生的方块
{
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类
nextRect=(((int)Math.round(Math.random()*12345))%8)+1;//产生下一个提前显示的方块
currentRect=nextRect;
timer=new Timer(speed,new 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()
{
}
public void stop()
{
}
public void paint(Graphics g)
{
g.setColor(Color.cyan); //画背景框架,两个大长方形
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<myGameTable.x;i++)//决定是否画方块
for(int j=0;j<myGameTable.y;j++)
{
if(myGameTable.myTable[i][j]==1)//有,画蓝方块
{
g.drawImage(rectImageTwo,45+i*(15+2)+2,45+j*(15+2)+2,this);
}
else if(myGameTable.myTable[i][j]==0)//无,画白方块
{
g.drawImage(rectImageOne,45+i*(15+2)+2,45+j*(15+2)+2,this);
}
}
btStart.repaint();
btRestart.repaint();
speedContorller.repaint();
scorelabel.setText(Integer.toString(nScore));//更新成绩
scorelabel.setBackground(new Color(191,186,220));
scorelabel.repaint();
g.drawString("速度(1..5)",320,60);
g.drawString("分数:",320,110);
g.drawString("下一个:",325,165);
g.setColor(Color.red);
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(rectImageOne,330+i*(15+2),180+j*(15+2),this);
switch(nextRect) //根据标志决定画哪个方块,画蓝方块
{
case 1:g.drawImage(rectImageTwo,347,180,this);
g.drawImage(rectImageTwo,347,197,this);
g.drawImage(rectImageTwo,347,214,this);
g.drawImage(rectImageTwo,347,231,this);
break;
case 2:g.drawImage(rectImageTwo,330,197,this);
g.drawImage(rectImageTwo,330,214,this);
g.drawImage(rectImageTwo,347,197,this);
g.drawImage(rectImageTwo,347,214,this);
break;
case 3:g.drawImage(rectImageTwo,330,197,this);
g.drawImage(rectImageTwo,330,214,this);
g.drawImage(rectImageTwo,347,180,this);
g.drawImage(rectImageTwo,347,197,this);
break;
case 4:g.drawImage(rectImageTwo,330,180,this);
g.drawImage(rectImageTwo,330,197,this);
g.drawImage(rectImageTwo,347,197,this);
g.drawImage(rectImageTwo,347,214,this);
break;
case 5:g.drawImage(rectImageTwo,330,180,this);
g.drawImage(rectImageTwo,330,197,this);
g.drawImage(rectImageTwo,330,214,this);
g.drawImage(rectImageTwo,347,180,this);
break;
case 6:g.drawImage(rectImageTwo,330,180,this);
g.drawImage(rectImageTwo,347,180,this);
g.drawImage(rectImageTwo,347,197,this);
g.drawImage(rectImageTwo,347,214,this);
break;
case 7:g.drawImage(rectImageTwo,347,197,this);
g.drawImage(rectImageTwo,347,214,this);
g.drawImage(rectImageTwo,330,214,this);
g.drawImage(rectImageTwo,364,214,this);
break;
case 8:g.drawImage(rectImageTwo,347,197,this);
break;
default:break;
}
}
public void judgement(KeyEvent e)//判断输入的是哪个键,并做出响应
{
switch(e.getKeyCode())
{
case KeyEvent.VK_DOWN://如果是向下键,就一下到底,并产生一个新的方块
root.downTo();
lineOver();//消去添满的一行,并加10分
switch(currentRect)//产生新的方块
{
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;
}
nextRect=(((int)Math.round(Math.random()*12345))%8)+1;
currentRect=nextRect;
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=myGameTable.y-1;
while(isContinue)
{
isCan=true;
while(isCan)
{
for(int i=0;i<myGameTable.x;i++)
{
if(myGameTable.myTable[i][k]!=1)
isCan=false;
}
if(isCan)//满足条件,开始消行
{
for(int i=0;i<myGameTable.x;i++)
myGameTable.myTable[i][k]=0;
for(int j=k-1;j>=0;j--)
for(int i=0;i<myGameTable.x;i++)
{
if(myGameTable.myTable[i][j]==1)
{
myGameTable.myTable[i][j+1]=1;
myGameTable.myTable[i][j]=0;
}
}
repaint();
nScore+=35;//加成绩
}
}
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<myGameTable.x;i++)//重新给游戏桌置0标志
for(int j=0;j<myGameTable.y;j++)
{
myGameTable.myTable[i][j]=0;
}
repaint();
nScore=0;
switch(currentRect)//产生新的方块
{
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;
}
nextRect=(((int)Math.round(Math.random()*12345))%8)+1;
currentRect=nextRect;
root.begin();
repaint();
btStart.setLabel("Start");
btStart.setToolTipText("Start a game.");
btStart.setEnabled(true);
speedContorller.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(currentRect)//产生新的方块
{
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;
}
nextRect=(((int)Math.round(Math.random()*12345))%8)+1;
currentRect=nextRect;
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)
{
speedContorller.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)
{
speed=1000-(new Integer(speedContorller.getSelectedItem().toString()).intValue())*110;
timer=new Timer(speed,new MyRun());//根据选择的speed间隔重新设置记时器,以变换速度
}
}
}//主体结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -