Java實現(xiàn)接月餅小游戲的示例代碼
前言
《接月餅小游戲》是一個基于java的自制游戲,不要被月亮砸到,盡可能地多接月餅。
此小項目可用來鞏固JAVA基礎(chǔ)語法,swing的技巧用法。
主要設(shè)計
- 設(shè)計游戲界面,用swing實現(xiàn)
- 設(shè)計背景
- 設(shè)計得分物體-月餅,碰到加一分
- 設(shè)計障礙物-月亮,碰到會死亡
- 監(jiān)聽鼠標(biāo)的左右鍵,用來控制籃子左右移動
- 設(shè)計積分系統(tǒng)
- 將resource文件夾設(shè)為resource(Project Manage中可以設(shè)置),因為要用里面的圖片
功能截圖
游戲開始界面:
代碼實現(xiàn)
游戲啟動類
public class Start { public static void main(String[] args) throws URISyntaxException { new EatGame(); } }
核心類
public class EatGame extends JFrame implements ActionListener, MouseListener { private final int WIDTH = 400; private final int HEIGHT = 800; private int score; private int ticks; private boolean gameOver = false; private GameControl control; private List<Moon> moons; private List<Cake> cakes; private Timer timer; private ChangeE changeE; /** * Constructor for objects of class FallingGame */ public EatGame() throws URISyntaxException { changeE = new ChangeE(150, 650, "player.jpg", WIDTH); moons = new ArrayList<>(); cakes = new ArrayList<>(); addMoonAndCake(); control = new GameControl(changeE, moons, cakes); timer = new Timer(20, this); //add keybinds control.addAction("Left", -20, KeyEvent.VK_LEFT); control.addAction("Right", 20, KeyEvent.VK_RIGHT); //add components add(control); addMouseListener(this); control.addMouseListener(this); setTitle("吃月餅"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(WIDTH, HEIGHT); setResizable(false); setVisible(true); timer.start(); } /** * 添加月亮和月餅 */ public void addMoonAndCake() { Random r = new Random(); int x, y; x = 60 + (r.nextInt(35) * 2); y = r.nextInt(20) + moons.size() * 30; Moon moon1 = new Moon(x, y, "moon.png"); moons.add(moon1); x = 190 + r.nextInt(35) * 2; y = r.nextInt(20) + moons.size() * 30; Moon moon2 = new Moon(x, y, "moon.png"); moons.add(moon2); x = 80 + (r.nextInt(35) * 2); y = r.nextInt(20) + moons.size() * 50; Cake cake = new Cake(x, y, "cake.png"); cakes.add(cake); } /** * 更新窗口 */ private void updateFrame() { ticks++; for(int i = 0; i < moons.size(); i++) { Moon moon = moons.get(i); if(ticks % 25 == 0 && moon.getSpeed() < 10) { moon.setSpeed(moon.getSpeed() + 2); } } Iterator<Moon> moonIterator = moons.iterator(); while (moonIterator.hasNext()) { Moon moon = moonIterator.next(); // 超出屏幕 if(moon.getY() > HEIGHT) { moonIterator.remove(); } else moon.move(); } Iterator<Cake> cakeIterator = cakes.iterator(); while (cakeIterator.hasNext()) { Cake cake = cakeIterator.next(); // 超出屏幕 if(cake.getY() > HEIGHT) { cakeIterator.remove(); } else cake.move(); } if(moons.size() == 0) { addMoonAndCake(); } } private boolean checkCollision() { Rectangle rectangle = (Rectangle) changeE.getShape(); for(Moon moon : moons) { Ellipse2D circle = (Ellipse2D) moon.getShape(); // 判斷是否與圓形相撞 if (circle.intersects(rectangle)) { gameOver = true; } } Iterator<Cake> cakeIterator = cakes.iterator(); while (cakeIterator.hasNext()) { Cake cake = cakeIterator.next(); Ellipse2D circle = (Ellipse2D) cake.getShape(); if (circle.intersects(rectangle)) { score ++; // 得分 cakeIterator.remove(); } } return gameOver; } public void actionPerformed(ActionEvent e) { if(gameOver) { timer.stop(); control.drawEnd(control.getGraphics(), score); } else { //continue with game updateFrame(); checkCollision(); control.repaint(); } } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { if(gameOver) { //reset game moons.clear(); control.removeAll(); control.updateUI(); score = 0; changeE.setX(150); changeE.setY(650); addMoonAndCake(); timer.start(); repaint(); gameOver = false; } } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }
畫面繪制
/** * 畫面繪制 */ public class GameControl extends JPanel { private InputMap inputMap; private ChangeE myChangeE; private List<Moon> moons; private List<Cake> cakes; public GameControl(ChangeE changeE, List<Moon> moons, List<Cake> cakes) { this.myChangeE = changeE; this.moons = moons; this.cakes = cakes; setBackground(Color.white); inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 繪制背景 ImageIcon icon=new ImageIcon(Thread.currentThread().getContextClassLoader().getResource("background.png")); Image img=icon.getImage(); g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this); // 繪制玩家 g.drawImage(myChangeE.getImage(), myChangeE.getX(), myChangeE.getY(), this); // 繪制月亮 for(Moon moon : moons) { g.drawImage(moon.getImage(), moon.getX(), moon.getY(), this); } // 繪制月餅 for (Cake cake : cakes) { g.drawImage(cake.getImage(), cake.getX(), cake.getY(), this); } } public void drawEnd(Graphics g, int score) { g.setColor(Color.WHITE); g.fillRect(50, 200, 300, 300); g.setColor(Color.RED); g.drawString("祝你中秋快樂,闔家歡樂!", 100, 300); g.setColor(Color.BLUE); g.drawString("您吃的到的月餅個數(shù)為:" + score, 100, 350); g.setColor(Color.BLACK); g.drawString("鼠標(biāo)點擊重玩", 100, 400); } public void addAction(String name, int deltaX, int keyCode) { MoveAction moveAction = new MoveAction(name, deltaX); inputMap.put(KeyStroke.getKeyStroke(keyCode, 0), name); getActionMap().put(name, moveAction); } private class MoveAction extends AbstractAction implements ActionListener { private int myDeltaX; public MoveAction(String name, int deltaX) { super(name); myDeltaX = deltaX; } public void actionPerformed(ActionEvent e) { myChangeE.move(myDeltaX); } } }
總結(jié)
通過此次的《接月餅小游戲》實現(xiàn),讓我對JAVA的相關(guān)知識有了進一步的了解,對java這門語言也有了比以前更深刻的認(rèn)識。
java的一些基本語法,比如數(shù)據(jù)類型、運算符、程序流程控制和數(shù)組等,理解更加透徹。java最核心的核心就是面向?qū)ο笏枷?,對于這一個概念,終于悟到了一些。
到此這篇關(guān)于Java實現(xiàn)接月餅小游戲的示例代碼的文章就介紹到這了,更多相關(guān)Java接月餅游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
常用的Spring Boot調(diào)用外部接口方式實現(xiàn)數(shù)據(jù)交互
Spring Boot提供了多種調(diào)用外部接口的方式,可以方便地實現(xiàn)與其他系統(tǒng)的數(shù)據(jù)交互,提高系統(tǒng)的可擴展性和數(shù)據(jù)共享能力,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-04-04SpringBoot項目中使用Swagger2及注解解釋的詳細(xì)教程
Swagger2是一個開源項目,用于為RESTful Web服務(wù)生成REST API文檔,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項目中使用Swagger2及注解解釋的詳細(xì)教程,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04Windows編寫jar啟動腳本和關(guān)閉腳本的操作方法
腳本文件,通常放入/bin目錄下,編寫啟動腳本需要保證能夠識別到對應(yīng)的jar文件,其次需要保證能夠識別到/config中的配置文件信息,這篇文章主要介紹了Windows編寫jar啟動腳本和關(guān)閉腳本的操作方法,需要的朋友可以參考下2022-12-12jquery uploadify和apache Fileupload實現(xiàn)異步上傳文件示例
這篇文章主要介紹了jquery uploadify和apache Fileupload實現(xiàn)異步上傳文件示例,需要的朋友可以參考下2014-05-05