📄 gamestart.java
字号:
package letterGame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
/**
* 游戏主程序
*
* @author 吴诗阳
*
*/
public class GameStart extends JFrame implements ActionListener ,KeyListener{
DecimalFormat df=new DecimalFormat(".00");
//控件
Timer timer=new Timer(GameParams.timeDelay,this),
timer1=new Timer(1000,new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
GameParams.countTime();
resetState();
}
}
),
timer2=new Timer(5,new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//射出子弹并判断何时子弹与字母相撞使字母消失
shootBullet();
judgeDisappear();
}
}
),
timer3=new Timer(100,new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//设置背景颜色变化
changeRGB();
gameAreaPanel.setBackground(new Color(red,green,blue));
}
}
);
JPanel statePanel=new JPanel(),
gameAreaPanel=new JPanel();
JLabel letterLabel=new JLabel("字母: "+GameParams.letterCount,JLabel.LEFT),
timeLabel=new JLabel("用时: "+GameParams.hour+":"+GameParams.minute+":"+GameParams.second,JLabel.LEFT),
sendLabel=new JLabel("发出: "+0,JLabel.LEFT),
shootLabel=new JLabel("命中: "+GameParams.shootCount,JLabel.LEFT),
scoreLabel=new JLabel("得分: "+GameParams.score,JLabel.LEFT),
shouldScoreLabel=new JLabel("应得: "+0,JLabel.LEFT),
speedLabel=new JLabel("速度: "+(float)GameParams.keyPressed/GameParams.score+" 键/分",JLabel.LEFT),
shootRateLabel=new JLabel("命中率: "+(float)GameParams.shootCount/GameParams.allCount*100+"%",JLabel.LEFT),
scoreRateLabel=new JLabel("得分率: "+(float)GameParams.score/GameParams.shouldScore*100+"%",JLabel.LEFT);
JLabel gunLabel =new JLabel(),
bullet=new JLabel();
JButton startButton=new JButton("开始");
boolean isFirstStart=true;
Icon guzhang=new ImageIcon("D:/Lab9/Lab9/bin/letterGame/guzhang.gif");
JLabel levelLabel=new JLabel("等级: "+GameParams.level,JLabel.LEFT),
levelUp=new JLabel("Level Up",guzhang,JLabel.RIGHT);
int currentLevel=1;
public static boolean isUp=true;
LetterLabel[] label=new LetterLabel[20];
LetterLabel shootedLetter=new LetterLabel();//当前被射中的字母
//弹出式菜单
JPopupMenu changeGameParams=new JPopupMenu();
JMenuItem[] items=new JMenuItem[8];
String[] itemString={"增加字母数目","加快下落速度","加快变化速度","加快时间间隔",
"减少字母数目","减慢下落速度","降低变化速度","减缓时间间隔"};
boolean isAdd=false;
boolean isSub=false;
//颜色渐变中用到的RGB
float red=(float)Math.random(),green=(float)Math.random(),blue=(float)Math.random();
boolean redTooMuch=true,greenTooMuch=true,blueTooMuch=true;
int bulletY=490,bulletX=318; //子弹的位置
int blockX=300; //枪的X位置
String[] direcStr={"从上到下","从下到上","随机"};
JComboBox direcBox=new JComboBox(direcStr);
//构造函数
public GameStart()
{
super("盲打遊戲");
Container cp=getContentPane();
cp.setLayout(null);
cp.add(statePanel);
cp.add(gameAreaPanel);
//初始化界面
for(int i=0;i<items.length;i++)
{
items[i]=new JMenuItem(itemString[i]);
items[i].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String action=e.getActionCommand();
for(int j=0;j<items.length;j++)
{
if(action.equals(itemString[j]))
{
doChange(j);
break;
}
}
}
});
}
for(int i=0;i<label.length;i++)
{
label[i]=new LetterLabel();
gameAreaPanel.add(label[i]);
}
addKeyListener(this);
initGUI();
timer3.start();
setSize(800,550);
setVisible(true);
}
//游戏开始
private void startGame()
{
if(isAdd)
{
label[GameParams.letterCount-1].startAgain();
}
else
if(isSub)
{
gameAreaPanel.remove(label[GameParams.letterCount]);
}
else
for(int i=0;i<GameParams.letterCount;i++)
{
label[i].setLocation(label[i].locationX,label[i].locationY);
}
timer.start();
timer1.start();
isAdd=false;
isSub=false;
}
private void restartGame()
{
timer.start();
timer1.start();
}
private void stopGame()
{
timer.stop();
timer1.stop();
}
//事件处理
//time:使LetterLabel按时间间隔移位置
/**
* 重新设置字母位置,到达屏幕下方后重新产生随机locationX值回到屏幕上方
* 并使屏幕颜色渐变
*/
public void actionPerformed(ActionEvent e)
{
for(int i=0;i<GameParams.letterCount;i++)
{
if(label[i].direction==0)
{
if(label[i].locationY>550)
label[i].startAgain();
}
else
if(label[i].locationY<=0)
label[i].startAgain();
label[i].changeLocationY();
label[i].setLocation(label[i].locationX,label[i].locationY);
}
}
/**
* 屏幕上如有字母被射中,则将该字母的LetterLabel对象赋予shootedLetter(被射中的LetterLabel)
*/
public void keyPressed(KeyEvent e)
{
for(int i=0;i<GameParams.letterCount;i++)
{
if(e.getKeyCode()==label[i].getCode())
{
timer2.start();
//射击
resetBlockX(label[i].getLocationX());
resetBulletX(label[i].getLocationX());
resetBlock();
setShootedLetter(label[i]);
GameParams.countShoot();
break;//防止屏幕上有多个字母相同,而按一下就把多个同时消去
}
}
}
public void keyReleased(KeyEvent e)
{
GameParams.keyPressed++;
}
public void keyTyped(KeyEvent e)
{
}
//执行弹出式菜单的动作
private void doChange(int i)
{
switch(i)
{
case 0:
isAdd=true;
GameParams.addLetterCount();
break;
case 1:
GameParams.addFallLines();
break;
case 2:
GameParams.addTimeDelay();
break;
case 3:
GameParams.addTimeDelay();
break;
case 4:
isSub=true;
GameParams.subLetterCount();
break;
case 5:
GameParams.subFallLines();
break;
case 6:
GameParams.subTimeDelay();
break;
case 7:
GameParams.subTimeDelay();
break;
default:
break;
}
startGame();
}
//子弹bullet及gunLabel的设置
//当前被射中的LetterLabel赋予shootedLetter
private void setShootedLetter(LetterLabel label)
{
shootedLetter=label;
}
//当前被射中的LetterLabel与子弹(bullet)位置重叠时消失,子弹重新设置位置会到gunLabel
private void judgeDisappear()
{
if(shootedLetter.getLocationY()>=bulletY)
{
shootedLetter.startAgain();
bullet.setBounds(blockX+15,490,10,10);
timer2.stop();
}
}
//重新设置gunLabel位置
private void resetBlock()
{
gunLabel.setBounds(blockX,500,40,10);
bullet.setBounds(blockX+18,490,10,10);
bulletY=790;
}
//发射子弹bullet
private void shootBullet()
{
bulletY-=70;
bullet.setBounds(bulletX,bulletY,10,10);
}
private void resetBulletX(int x)
{
bulletX=x;
}
private void resetBlockX(int x)
{
blockX=x;
}
//初始化界面
private void initGUI()
{
statePanel.setBounds(0,0,200,550);
gameAreaPanel.setBounds(200,0,600,550);
statePanel.setBackground(Color.YELLOW);
gameAreaPanel.setBackground(Color.BLACK);
statePanel.setLayout(null);
gameAreaPanel.setLayout(null);
//游戏状态label
statePanel.add(letterLabel);
statePanel.add(timeLabel);
statePanel.add(sendLabel);
statePanel.add(shootLabel);
statePanel.add(scoreLabel);
statePanel.add(shouldScoreLabel);
statePanel.add(speedLabel);
statePanel.add(shootRateLabel);
statePanel.add(scoreRateLabel);
statePanel.add(levelLabel);
statePanel.add(direcBox);
statePanel.add(startButton);
startButton.setBackground(Color.CYAN);
direcBox.setBackground(Color.CYAN);
gameAreaPanel.add(gunLabel);
gameAreaPanel.add(bullet);
//位置
letterLabel.setBounds(0,10,200,25);
timeLabel.setBounds(0,50,200,25);
sendLabel.setBounds(0,90,200,25);
shootLabel.setBounds(0,130,200,25);
scoreLabel.setBounds(0,170,200,25);
shouldScoreLabel.setBounds(0,210,200,25);
speedLabel.setBounds(0,250,200,25);
shootRateLabel.setBounds(0,290,200,25);
scoreRateLabel.setBounds(0,330,200,25);
levelLabel.setBounds(0,370,200,25);
direcBox.setBounds(10,410,100,30);
startButton.setBounds(10,450,100,30);
//字体,颜色
letterLabel.setFont(new Font("",Font.BOLD,20));
letterLabel.setForeground(Color.RED);
timeLabel.setFont(new Font("",Font.BOLD,20));
timeLabel.setForeground(Color.RED);
sendLabel.setFont(new Font("",Font.BOLD,20));
sendLabel.setForeground(Color.RED);
shootLabel.setFont(new Font("",Font.BOLD,20));
shootLabel.setForeground(Color.RED);
scoreLabel.setFont(new Font("",Font.BOLD,20));
scoreLabel.setForeground(Color.RED);
shouldScoreLabel.setFont(new Font("",Font.BOLD,20));
shouldScoreLabel.setForeground(Color.RED);
speedLabel.setFont(new Font("",Font.BOLD,20));
speedLabel.setForeground(Color.RED);
shootRateLabel.setFont(new Font("",Font.BOLD,20));
shootRateLabel.setForeground(Color.RED);
scoreRateLabel.setFont(new Font("",Font.BOLD,20));
scoreRateLabel.setForeground(Color.RED);
levelLabel.setFont(new Font("",Font.BOLD,20));
levelLabel.setForeground(Color.RED);
//弹出式菜单
for(int i=0;i<items.length;i++)
changeGameParams.add(items[i]);
gameAreaPanel.addMouseListener(new MouseAdapter()
{
public void mousePressed( MouseEvent e )
{
if(e.isMetaDown())
{
stopGame();
changeGameParams.show(e.getComponent(), e.getX(), e.getY() );
}
else
if(!e.isAltDown())
restartGame();
}
}
);
//射击控件
gunLabel.setOpaque(true);
gunLabel.setBounds(300,500,40,10);
gunLabel.setBackground(Color.GREEN);
bullet.setOpaque(true);
bullet.setBackground(Color.RED);
bullet.setBounds(318,bulletY,10,10);
//LevelUp
levelUp.setFont(new Font("",Font.BOLD,50));
levelUp.setForeground(Color.GREEN);
//为开始按钮添加响应事件(按纽不可获得焦点)
startButton.setFocusable(false);
startButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(e.getActionCommand()=="开始")
{
if(isFirstStart)
{
startGame();
startButton.setText("暂停");
}
else
{
restartGame();
startButton.setText("暂停");
}
}
else
{
stopGame();
startButton.setText("开始");
}
isFirstStart=false;
}
});
//JComboBox
direcBox.setFocusable(false);
direcBox.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
GameParams.direction=direcBox.getSelectedIndex();
}
});
}
//更新当前游戏状态
/**
* 更新当前的游戏状态,包括字母数,得分,得分率,命中率,等级等等
*
*/
public void resetState()
{
letterLabel.setText("字母: "+GameParams.letterCount);
timeLabel.setText("用时: "+GameParams.hour+":"+GameParams.minute+":"+GameParams.second);
sendLabel.setText("发出: "+GameParams.allCount);
shootLabel.setText("命中: "+GameParams.shootCount);
scoreLabel.setText("得分: "+GameParams.score);
shouldScoreLabel.setText("应得: "+GameParams.shouldScore);
speedLabel.setText("速度: "+df.format((float)GameParams.keyPressed/GameParams.score)+" 键/分");
shootRateLabel.setText("命中率: "+df.format((float)GameParams.shootCount/GameParams.allCount*100)+"%");
scoreRateLabel.setText("得分率: "+df.format((float)GameParams.score/GameParams.shouldScore*100)+"%");
levelLabel.setText("等级: "+GameParams.level);
timer.setDelay(GameParams.timeDelay);
if(isUp)
{
if(GameParams.level>currentLevel)
{
gameAreaPanel.add(levelUp);
levelUp.setBounds(100,150,400,200);
isUp=false;
}
}
else
{
gameAreaPanel.remove(levelUp);
}
}
//颜色渐变
private void changeRGB()
{
if(red<0.1)
redTooMuch=false;
if(red>0.45)
redTooMuch=true;
if(redTooMuch==true)
red-=0.02;
else
red+=0.02;
if(green<0.15)
greenTooMuch=false;
if(green>0.4)
greenTooMuch=true;
if(greenTooMuch==true)
green-=0.015;
else
green+=0.01;
if(blue<0.2)
blueTooMuch=false;
if(blue>0.5)
blueTooMuch=true;
if(blueTooMuch==true)
blue-=0.01;
else
blue+=0.015;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
GameStart start=new GameStart();
start.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -