⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamestart.java

📁 通过JAVA编写的一个小游戏,键盘打字练习
💻 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 + -