Java小遊戲——是男人就堅持20秒
阿新 • • 發佈:2018-12-30
/* * 程式的主窗體 */ 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行程式碼,快寫一個試試吧。