📄 game.java
字号:
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.Timer;
public class Game extends Frame{
private Choice speedControl;//游戏速度选择控件
private DrawTable drawTable;//控制游戏桌显示
private DrawNextShape drawNextShape;//显示下一个游戏块
private int delayTime;//块下落的时间间隔,也就是游戏速度
private final int speedTime = 800;//
private Button startButton ;//开始按钮
private boolean isKeyEnable = false;//标识键盘输入是否可用
private Shape firstShape = randomShape();//产生第一个游戏块
private Shape nextShape = randomShape();//产生下第二个游戏块
private Timer timer;//计时器,让游戏块自动下落
private int score = 0;//分数
private Label scoreLabel;//显示分数的标签
private Label speedControlLabel;//提示速度选择的标签
private Label nextShapeLabel;//提示下一个游戏块的标签
private Label myInformation;//显示游戏制作者信息
private Label noticeLabel;//提示标签
private Label noticContentLabel;//提示内容1
private Label noticContentLabel2;//提示内容2
//对游戏进行初始化
public void inint(){
this.setTitle("俄罗斯方块");
this.setLayout(null);
this.setLocation(300, 200);
this.setSize(500,500);
this.setBackground(new Color(500555));
this.addWindowListener(new WinClose());
startButton = new Button("开始");
startButton.setBounds(370, 400, 90, 30);
startButton.setBackground(new Color(5555555));
startButton.setFont(new Font("1",1,16));
startButton.addActionListener(new StartButtonListener());
startButton.setEnabled(true);
startButton.addKeyListener(new MyKeyListener());
this.add(startButton);
scoreLabel = new Label("分数: "+score);
scoreLabel.setBounds(370, 125, 90, 30);
scoreLabel.setFont(new Font("1",1,16));
scoreLabel.setBackground(new Color(55550255));
this.add(scoreLabel);
drawTable = new DrawTable();
drawTable.setLocation(40, 50);
drawTable.addKeyListener(new MyKeyListener());
this.add(drawTable);
drawNextShape = new DrawNextShape();
drawNextShape.setLocation(370, 200);
drawNextShape.addKeyListener(new MyKeyListener());
this.add(drawNextShape);
speedControlLabel = new Label("请选择速度:");
speedControlLabel.setFont(new Font("1",1,16));
speedControlLabel.setBounds(370, 60, 100, 20);
this.add(speedControlLabel);
nextShapeLabel = new Label("下一个块:");
nextShapeLabel.setFont(new Font("1",1,16));
nextShapeLabel.setBounds(370, 170, 100, 20);
this.add(nextShapeLabel);
noticeLabel = new Label("提示:");
noticeLabel.setFont(new Font("1",1,16));
noticeLabel.setBounds(370, 325, 100, 20);
this.add(noticeLabel);
noticContentLabel2 = new Label("请用方向键");
noticContentLabel2.setFont(new Font("1",1,16));
noticContentLabel2.setBounds(370, 345, 100, 20);
this.add(noticContentLabel2);
noticContentLabel = new Label("等待开始...");
noticContentLabel.setFont(new Font("1",1,16));
noticContentLabel.setBounds(370, 375, 100, 20);
this.add(noticContentLabel);
myInformation = new Label("版权所有:丁小伟 QQ:284983884 邮箱:dingxw92@yahoo.com.cn");
myInformation.setFont(new Font("1",1,16));
myInformation.setBounds(5, 460, 490, 30);
this.add(myInformation);
speedControl = new Choice();
speedControl.setBounds(370,90,90,30);
speedControl.setBackground(new Color(500500));
speedControl.setFont(new Font(" ",1,16));
speedControl.add("1");
speedControl.add("2");
speedControl.add("3");
speedControl.add("4");
speedControl.add("5");
speedControl.add("6");
speedControl.add("7");
speedControl.add("8");
speedControl.addItemListener(new SpeedControlListener());
speedControl.setEnabled(true);
this.add(speedControl);
delayTime = speedTime;
timer = new Timer(delayTime,new TimeListener());
this.addKeyListener(new MyKeyListener());
firstShape.begin();
nextShape.beforeBegin();
}
//产生随机游戏块
private Shape randomShape(){
Random randomNumCreater =new Random();
int randomNum = randomNumCreater.nextInt(7);
Shape shape = null;
switch(randomNum){
case 0:shape = new Shape0();break;
case 1:shape = new Shape1();break;
case 2:shape = new Shape2();break;
case 3:shape = new Shape3();break;
case 4:shape = new Shape4();break;
case 5:shape = new Shape5();break;
case 6:shape = new Shape6();break;
case 7:shape = new Shape7();break;
default:break;
}
return shape;
}
//游戏结束的一些处理
public void gameOver(){
isKeyEnable = false;
timer.stop();
drawTable.setEnabled(false);
speedControl.setEnabled(true);
noticContentLabel.setText("游戏结束");
startButton.setLabel("我还要玩");
}
//当游戏块不能下落时,调用此方法处理
public void afterDownFalse(){
addScore(firstShape.addPoint());
scoreLabel.setText("分数: "+score);
firstShape = nextShape;
nextShape = randomShape();
nextShape.beforeBegin();
if(isKeyEnable == true){
isKeyEnable = false;
if(firstShape.begin() == false){
gameOver();
}
else
isKeyEnable = true;
}
else{
if(firstShape.begin() == false)
gameOver();
}
}
public void addScore(int rows){
if(rows!=0){
switch(delayTime*1000/speedTime){
case 1000 : score = (rows*2-1)*10 + score;break;
case 875 : score = (rows*2-1)*20 + score;break;
case 750 : score = (rows*2-1)*30 + score;break;
case 625 : score = (rows*2-1)*40 + score;break;
case 500 : score = (rows*2-1)*50 + score;break;
case 375 : score = (rows*2-1)*60 + score;break;
case 250 : score = (rows*2-1)*70 + score;break;
case 125 : score = (rows*2-1)*80 + score;break;
default : break;
}
}
}
//游戏重新开始时进行的一些处理
public void gameRestart() {
timer.stop();
Table.init();
firstShape = randomShape();
nextShape = randomShape();
drawNextShape.repaint();
nextShape.beforeBegin();
firstShape.begin();
drawTable.repaint();
isKeyEnable = true;
score = 0;
scoreLabel.setText("分数: "+new Integer(score).toString());
timer.start();
}
//时间监听器
public class TimeListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
boolean b = firstShape.down();
if(b == false)
afterDownFalse();
drawTable.repaint();
drawNextShape.repaint();
}
}
//开始按钮监听器
public class StartButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
if(startButton.getLabel().equals("开始")){
noticContentLabel.setText("游戏进行中...");
startButton.setLabel("暂停");
timer.start();
isKeyEnable = true;
speedControl.setEnabled(false);
}
else if(startButton.getLabel().equals("暂停")){
noticContentLabel.setText("游戏暂停...");
startButton.setLabel("继续");
timer.stop();
isKeyEnable = false;
speedControl.setEnabled(false);
}
else if(startButton.getLabel().equals("继续")){
noticContentLabel.setText("游戏进行中...");
startButton.setLabel("暂停");
timer.start();
isKeyEnable = true;
speedControl.setEnabled(false);
}
else if(startButton.getLabel().equals("我还要玩")){
noticContentLabel.setText("游戏进行中...");
startButton.setLabel("暂停");
speedControl.setEnabled(false);
gameRestart();
}
}
}
//键盘监听器 ,利用isKeyEnable标识是否响应键盘事件
public class MyKeyListener implements KeyListener{
public void keyPressed(KeyEvent e) {
if(isKeyEnable){
switch( e.getKeyCode()){
case KeyEvent.VK_UP: firstShape.change();break;
case KeyEvent.VK_DOWN:
{
if(firstShape.down() == false)
afterDownFalse();
};break;
case KeyEvent.VK_LEFT: firstShape.left();break;
case KeyEvent.VK_RIGHT: firstShape.right();break;
}
drawTable.repaint();
drawNextShape.repaint();
}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}
//速度选择监听器
public class SpeedControlListener implements ItemListener{
public void itemStateChanged(ItemEvent e) {
if(e.getItem().equals("1")){
delayTime = speedTime;
timer.setDelay(delayTime);
}
else if(e.getItem().equals("2")){
delayTime = speedTime*7/8;
timer.setDelay(delayTime);
}
else if(e.getItem().equals("3")){
delayTime = speedTime*6/8;
timer.setDelay(delayTime);
}
else if(e.getItem().equals("4")){
delayTime = speedTime*5/8;
timer.setDelay(delayTime);
}
else if(e.getItem().equals("5")){
delayTime = speedTime*4/8;
timer.setDelay(delayTime);
}
else if(e.getItem().equals("6")){
delayTime = speedTime*3/8;
timer.setDelay(delayTime);
}
else if(e.getItem().equals("7")){
delayTime = speedTime*2/8;
timer.setDelay(delayTime);
}
else if(e.getItem().equals("8")){
delayTime = speedTime*1/8;
timer.setDelay(delayTime);
}
}
}
//关闭主窗口
public class WinClose extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
//主函数
public static void main(String args[]){
Game g = new Game();
g.inint();
g.setVisible(true);//这句必须要,要不看不见游戏桌!
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -