1. 程式人生 > >Java小遊戲——是男人就堅持20秒

Java小遊戲——是男人就堅持20秒

/*
 * 程式的主窗體
 */
public class FrmMain extends JFrame {

	/*
	 * 初始的一些全域性變數 1是否存活 2方向 3子彈數量 4飛機
	 */
	// 1是否存活
	public static boolean isRun = true;
	// 2方向
	public static boolean right, left, up, down;
	// 3子彈數量
	public static int num = 30;
	// 4飛機
	private JLabel plane;

	public FrmMain() {
		isRun=true;
		// 設定大小
		setSize(400, 600);
		// 設定居中
		setLocationRelativeTo(null);
		// 設定點關閉時,程式退出
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 得到內容面板
		final Container c = getContentPane();
		c.setBackground(Color.BLACK);
		// 設定標題
		setTitle("是男人就堅持20秒");
		// 設定絕對定位
		c.setLayout(null);

		// 新增標籤
		final JLabel lblDesc = new JLabel("是男人就堅持20秒");
		lblDesc.setBounds(133, 175, 113, 31);
		lblDesc.setForeground(Color.WHITE);
		c.add(lblDesc);

		// 新增按鈕
		final JButton btnStart = new JButton("開始");
		btnStart.setBounds(133, 210, 113, 31);
		c.add(btnStart);

		// 設定可見
		setVisible(true);
		//設定內容面板獲取焦點
		c.setFocusable(true);

		/*
		 * 增加鍵盤事件
		 */
		c.addKeyListener(new KeyAdapter() {
			// 按下,具體實現,即為按鈕把對應的方向設定為true
			@Override
			public void keyPressed(KeyEvent e) {
				switch (e.getKeyCode()) {
				case KeyEvent.VK_LEFT:
					left=true;
					break;
				case KeyEvent.VK_RIGHT:
					right=true;	
					break;
				case KeyEvent.VK_UP:
					up=true;
					break;
				case KeyEvent.VK_DOWN:
					down=true;
					break;
				}
			}

			// 釋放,把當前方向再設定成false
			@Override
			public void keyReleased(KeyEvent e) {
				switch (e.getKeyCode()) {
				case KeyEvent.VK_LEFT:
					left=false;
					break;
				case KeyEvent.VK_RIGHT:
					right=false;	
					break;
				case KeyEvent.VK_UP:
					up=false;
					break;
				case KeyEvent.VK_DOWN:
					down=false;
					break;
				}
			}
		});
		/*
		 * 增加滑鼠的點選事件
		 */
		btnStart.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				//把當前標籤和按鈕隱藏
				btnStart.setVisible(false);
				lblDesc.setVisible(false);
				//飛機
				plane = new JLabel(new ImageIcon("img/plane.png"));
				plane.setBounds(150, 400, 33, 33);
				c.add(plane);
				//重新整理頁面
				plane.updateUI();
				//飛機實現 移動
				new MoveThread(plane,c).start();
				
				//計時器
				new TimerThread(c).start();
				
				//子彈
				for(int i=0;i<num;i++){
					new BulletThread(c,plane,FrmMain.this).start();
				}
				
			}
		});

	}

	/*
	 * 程式的入口
	 */
	public static void main(String[] args) {
		// new 就是一個物件
		new FrmMain();
	}
}
/*
 * 飛機移動的執行緒類
 */
public class MoveThread extends Thread {

	//飛行速度
	private int speed=5;
	//飛機
	private JLabel plane;
	//內容面板
	private Container c;
	
	public MoveThread(JLabel plane, Container c) {
		this.plane=plane;
		this.c=c;
	}
	
	/*
	 * 飛機運算的執行緒實現
	 * @see java.lang.Thread#run()
	 */
	@Override
	public void run() {
		while(FrmMain.isRun){
			if(FrmMain.left){
				//設定左飛機
				plane.setIcon(new ImageIcon("img/planeLeft.png"));
				//如果是超過左邊邊緣,x軸則設定為零
				if(plane.getX()-speed<0){
					plane.setLocation(0, plane.getY());
				}else{
					plane.setLocation(plane.getX()-speed, plane.getY());
				}
			}else if(FrmMain.right){
				//設定成右飛機	
				plane.setIcon(new ImageIcon("img/planeRight.png"));
				//如果x軸+飛寬+移動大小超過內容面板,則設定最靠右(內容面板-飛機寬的x軸大小)
				if(plane.getX()+plane.getWidth()+speed>c.getWidth()){
					plane.setLocation(c.getWidth()-plane.getWidth(), plane.getY());
				}
				else{
					plane.setLocation(plane.getX()+speed, plane.getY());
				}
			}else if(FrmMain.up){
				//正飛機
				plane.setIcon(new ImageIcon("img/plane.png"));
				//如果飛最上面,超過邊界後,作的處理
				if(plane.getY()-speed<0){
					plane.setLocation(plane.getX(), 0);
				}
				else{
					plane.setLocation(plane.getX(), plane.getY()-speed);
				}
			}else if(FrmMain.down){
				//正飛機
				plane.setIcon(new ImageIcon("img/plane.png"));
				//如果飛最下面,超過邊界後,作的處理
				if(plane.getY()+speed+plane.getHeight()>c.getHeight()){
					plane.setLocation(plane.getX(), c.getHeight()-plane.getHeight());
				}else{
					plane.setLocation(plane.getX(), plane.getY()+speed);
				}
			}
			//線上程時,間隔50毫秒執行一回
			try {
				sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}
}
/*
 * 子彈執行緒
 */
public class BulletThread extends Thread {

	// 內容面板
	private Container c;
	// 飛機
	private JLabel plane;

	// 子彈
	private JLabel lblBullet;
	// x軸速度
	private int xSpeed;
	// y軸速度
	private int ySpeed;
	
	private FrmMain frmMain;
	public BulletThread(Container c, JLabel plane, FrmMain frmMain) {
		this.c = c;
		this.plane = plane;
		this.frmMain=frmMain;

		// 隨機類
		Random random = new Random();
		// 建立 子彈
		lblBullet = new JLabel(new ImageIcon("img/bullet.png"));
		lblBullet.setLocation(random.nextInt(c.getWidth()), random.nextInt(c.getHeight()/2));
		// 隨機x軸速度
		xSpeed = random.nextInt(5) + 1;
		// 隨機y軸速度
		ySpeed = random.nextInt(5) + 1;
		c.add(lblBullet);
	}

	// 張程實現
	@Override
	public void run() {
		while (FrmMain.isRun) {

			//子彈超過上下左右邊緣的處理
			if (lblBullet.getX() < 0 || lblBullet.getX() > c.getWidth()) {
				xSpeed = -xSpeed;
			}
			if (lblBullet.getY() < 0 || lblBullet.getY() > c.getHeight()) {
				ySpeed=-ySpeed;
			}
			lblBullet.setBounds(lblBullet.getX()+xSpeed, lblBullet.getY()+ySpeed, 12, 12);
			//判斷子彈與飛機的交集
			if(lblBullet.getBounds().intersects(plane.getBounds())){
				//結束 
				FrmMain.isRun=false;
				//爆炸
				int x = plane.getX()-plane.getWidth();
				int y=  plane.getY()-plane.getHeight();
				//啟動爆炸執行緒
				new ExplosionThread(x,y,c,plane,frmMain).start();
			}
			
			try {
				sleep(40);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
/*
 * 計時執行緒
 */
public class TimerThread extends Thread {

	//內容面板 
	private Container  c;
	public TimerThread(Container c) {
		this.c=c;
	}
	
	//執行緒實現 
	@Override
	public void run() {
		//1新增JLabel 00:
		JLabel lblTime = new JLabel("00:00");
		lblTime.setBounds(350, 0, 50, 20);
		lblTime.setForeground(Color.YELLOW);
		c.add(lblTime);
		lblTime.updateUI();
		//2獲取當前時間
		long start = System.currentTimeMillis();
		//3重新整理
		DecimalFormat df = new DecimalFormat("00");
		while(FrmMain.isRun){
			long x = System.currentTimeMillis()-start;
			int second= (int)(x/1000);
			int mSecond=(int)(x%1000/10); 
			lblTime.setText(df.format(second)+":"+df.format(mSecond));
			
			//休眠50毫秒
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
/*
 * 爆炸執行緒
 */
public class ExplosionThread extends Thread {
	private int x;
	private int y;
	private Container c;
	private JLabel plane;

	//最先的窗體
	private FrmMain frmMain;
	public ExplosionThread(int x, int y, Container c, JLabel plane, FrmMain frmMain) {
		this.x=x;
		this.y=y;
		this.c=c;
		this.plane=plane;
		this.frmMain=frmMain;
	}
	
	//執行緒實現
	@Override
	public void run() {
		//爆炸的起始圖片
		JLabel lblExplosion =new JLabel(new ImageIcon("img/explosion2-1.png"));
		lblExplosion.setBounds(x, y, 128, 128);
		c.add(lblExplosion);
		plane.setVisible(false);
		//爆炸的動畫圖片
		for(int i=1;i<72;i++){
			lblExplosion.setIcon(new ImageIcon("img/explosion2-"+i+".png"));
			try {
				sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		//提示訊息
		JLabel lblEnd = new JLabel("Game Over");
		lblEnd.setForeground(Color.RED);
		lblEnd.setBounds(160, 200, 100, 50);
		c.add(lblEnd);
		//再來一局
		JButton btnAgain = new JButton("再來一局");
		btnAgain.setBounds(150, 250, 100, 50);
		c.add(btnAgain);
		
		lblEnd.updateUI();
		btnAgain.updateUI();
		
		//再來一局的事件
		btnAgain.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				new FrmMain();
				frmMain.setVisible(false);
			}
		});
		
	}

}

以上就是這個小遊戲的所有程式碼實現部分,總共不到400行程式碼,快寫一個試試吧。