利用java編寫的精靈吃豆的遊戲
學完執行緒的時候做了一個精靈吃豆的小遊戲。
窗體類:
package www.csdn.net.zuoye; //用窗體實現精靈吃豆子的小遊戲 import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random; import javax.swing.JFrame; import javax.swing.JOptionPane; public class GameJFrame extends JFrame implements KeyListener { // 定義起始位置 private int x = 30, y = 30; // 定義中間變數 private boolean flag = true; private static final int DIR_UP = 1; private static final int DIR_DOWN = 2; private static final int DIR_LEFT = 3; private static final int DIR_RIGHT = 4; // 定義初始化弧度 private int arc1 = 20; private int arc2 = 320; // 定義計數器(通過計數器讓上下兩張嘴都動起來) private int count = 0; // 定義豆的物件 private Bean bean; // 定義方向 private int dir = -1; // 生成隨機數 private Random random; //定義分數 private int score=0; //定義速度 private int k=100; public GameJFrame() { this.setBounds(300, 200, 200, 300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); this.setResizable(false); /* * 1.this.setBackground(Color.gray); * this.getContentPane().setVisible(false); */ this.getContentPane().setBackground(Color.pink); new Thread() { public void run() { while (flag) { try { boolean temp = checkHit(); if (temp) { initBean(); score++; if(score%10==0){ k-=5; } } Thread.sleep(k); count++; if (count % 2 == 0) {// 嘴張開以及閉住的情況 arc1 = 40; arc2 = 280; } else { arc1 = 20; arc2 = 320; } switch (dir) { case DIR_UP: y -= 5; break; case DIR_DOWN: y += 5; break; case DIR_LEFT: x -= 5; break; case DIR_RIGHT: x += 5; break; default: break; } repaint(); if (y > 275 || y < 30) { flag = false; JOptionPane.showMessageDialog(null, "遊戲結束,你的分數為:"+score); dispose(); }else if(x>176||x==0){ flag=false; JOptionPane.showMessageDialog(null, "遊戲結束,你的分數為:"+score); dispose(); } } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); // 新增監聽 this.addKeyListener(this); // 建立隨機的物件 random = new Random(); initBean(); } public void initBean() { // 隨機產生座標 int rx = random.nextInt(5)+10; int ry = random.nextInt(15)+7; // 產生豆 bean = new Bean(rx * Bean.r * 2, ry * Bean.r * 2);// 座標必須是隨機產生的 } @Override public void paint(Graphics g) { super.paint(g); g.setColor(Color.red);// 設定繪製的顏色 switch (dir) { case DIR_UP: g.fillArc(x, y, 20, 20, arc1 + 90, arc2); break; case DIR_DOWN: g.fillArc(x, y, 20, 20, arc1 + 270, arc2); break; case DIR_LEFT: g.fillArc(x, y, 20, 20, arc1 + 180, arc2); break; case DIR_RIGHT: g.fillArc(x, y, 20, 20, arc1, arc2); break; default:// 為了能夠顯示,需要有個顯示的狀態 g.fillArc(x, y, 20, 20, arc1, arc2); } // 繪製豆 g.setColor(Color.yellow); g.fillArc(bean.getX(), bean.getY(), Bean.r * 2, Bean.r * 2, 0, 360); // g.fillArc(x, y, 20, 20, arc1, arc2);//圓形 // g.fillRect(50, 30, 20, 20);//矩形 } public static void main(String[] args) { GameJFrame g = new GameJFrame(); g.setVisible(true); } /** * 輸入某個鍵的時候執行 */ @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub System.out.println("鍵入"); } /** * 按下的時候執行 */ @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub // System.out.println("按鍵"); // 獲取按鍵的值 int key = e.getKeyCode();// 查詢鍵值(用這個方法給上下左右鍵加事件) // 根據上下左右箭頭改變方法 switch (key) { case 38: dir = DIR_UP; break; case 40: dir = DIR_DOWN; break; case 37: dir = DIR_LEFT; break; case 39: dir = DIR_RIGHT; break; default: break; } } /** * 擡起的時候執行 */ @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub // System.out.println("擡起"); } // 定義碰撞檢測 public boolean checkHit() { if (bean != null) { if (bean.getX() == x) { if (Math.abs(bean.getY() - y) < 13) { return true;// 被碰到了 } } if (bean.getY() == y) { if (Math.abs(bean.getX() - x) < 13) { return true; } } } return false; } }
豆子類:
package www.csdn.net.zuoye;
//繪製豆
public class Bean {
// 座標
private int x, y;
// 豆的半徑
public static int r=5;
public int getX() {//獲取橫座標
return x;
}
public int getY() {//獲取縱座標
return y;
}
public Bean(int x, int y) {
this.x = x;
this.y = y;
}
}
效果: