Java實(shí)現(xiàn)接月餅小游戲的示例代碼
前言
《接月餅小游戲》是一個(gè)基于java的自制游戲,不要被月亮砸到,盡可能地多接月餅。
此小項(xiàng)目可用來(lái)鞏固JAVA基礎(chǔ)語(yǔ)法,swing的技巧用法。
主要設(shè)計(jì)
- 設(shè)計(jì)游戲界面,用swing實(shí)現(xiàn)
- 設(shè)計(jì)背景
- 設(shè)計(jì)得分物體-月餅,碰到加一分
- 設(shè)計(jì)障礙物-月亮,碰到會(huì)死亡
- 監(jiān)聽(tīng)鼠標(biāo)的左右鍵,用來(lái)控制籃子左右移動(dòng)
- 設(shè)計(jì)積分系統(tǒng)
- 將resource文件夾設(shè)為resource(Project Manage中可以設(shè)置),因?yàn)橐美锩娴膱D片
功能截圖
游戲開(kāi)始界面:


代碼實(shí)現(xiàn)
游戲啟動(dòng)類(lèi)
public class Start {
public static void main(String[] args) throws URISyntaxException {
new EatGame();
}
}核心類(lèi)
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)
{
}
}畫(huà)面繪制
/**
* 畫(huà)面繪制
*/
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("祝你中秋快樂(lè),闔家歡樂(lè)!", 100, 300);
g.setColor(Color.BLUE);
g.drawString("您吃的到的月餅個(gè)數(shù)為:" + score, 100, 350);
g.setColor(Color.BLACK);
g.drawString("鼠標(biāo)點(diǎn)擊重玩", 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é)
通過(guò)此次的《接月餅小游戲》實(shí)現(xiàn),讓我對(duì)JAVA的相關(guān)知識(shí)有了進(jìn)一步的了解,對(duì)java這門(mén)語(yǔ)言也有了比以前更深刻的認(rèn)識(shí)。
java的一些基本語(yǔ)法,比如數(shù)據(jù)類(lèi)型、運(yùn)算符、程序流程控制和數(shù)組等,理解更加透徹。java最核心的核心就是面向?qū)ο笏枷?,?duì)于這一個(gè)概念,終于悟到了一些。
到此這篇關(guān)于Java實(shí)現(xiàn)接月餅小游戲的示例代碼的文章就介紹到這了,更多相關(guān)Java接月餅游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud實(shí)現(xiàn)微服務(wù)調(diào)用的負(fù)載均衡(詳解)
負(fù)載均衡就是將負(fù)載(工作任務(wù),訪問(wèn)請(qǐng)求)進(jìn)行分?jǐn)偟蕉鄠€(gè)操作單元(服務(wù)器,組件)上進(jìn)行執(zhí)行,根據(jù)負(fù)載均衡發(fā)生位置的不同,一般分為服務(wù)端負(fù)載均衡和客戶(hù)端負(fù)載均衡,本文給大家介紹Spring Cloud實(shí)現(xiàn)微服務(wù)調(diào)用的負(fù)載均衡的相關(guān)知識(shí),感興趣的朋友一起看看吧2024-03-03
Java中Caffeine本地緩存項(xiàng)目實(shí)例
這篇文章主要介紹了Java中Caffeine本地緩存項(xiàng)目實(shí)例,Caffeine是一個(gè)高性能Java 緩存庫(kù),使用Java8對(duì)Guava緩存重寫(xiě)版本,在Spring Boot 2.0中將取代Guava,使用spring.cache.cache-names屬性可以在啟動(dòng)時(shí)創(chuàng)建緩存,需要的朋友可以參考下2023-10-10
java中動(dòng)態(tài)代理的實(shí)現(xiàn)
本篇文章主要介紹了Java中兩種動(dòng)態(tài)代理的實(shí)現(xiàn):jdk動(dòng)態(tài)代理;cglib動(dòng)態(tài)代理。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01
利用Java工具類(lèi)Hutool實(shí)現(xiàn)驗(yàn)證碼校驗(yàn)功能
這篇文章主要介紹了利用Java工具類(lèi)Hutool實(shí)現(xiàn)驗(yàn)證碼校驗(yàn)功能,利用Hutool實(shí)現(xiàn)驗(yàn)證碼校驗(yàn),校驗(yàn)的Servlet與今天的第一篇是一樣的,唯一就是驗(yàn)證碼的生成是不一樣的,利用Hutool生成驗(yàn)證碼更快捷.需要的朋友可以參考下2022-10-10
java中使用Files.readLines()處理文本中行數(shù)據(jù)方式
這篇文章主要介紹了java中使用Files.readLines()處理文本中行數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring Boot 實(shí)例化bean如何選擇代理方式
這篇文章主要為大家介紹了Spring Boot實(shí)例化bean如何選擇代理方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
java實(shí)現(xiàn)滑動(dòng)驗(yàn)證解鎖
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)滑動(dòng)驗(yàn)證解鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
Struts2開(kāi)發(fā)環(huán)境搭建 附簡(jiǎn)單登錄功能實(shí)例
這篇文章主要介紹了Struts2開(kāi)發(fā)環(huán)境搭建,為大家分享一個(gè)簡(jiǎn)單登錄功能實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
SpringBoot整合screw實(shí)現(xiàn)自動(dòng)生成數(shù)據(jù)庫(kù)設(shè)計(jì)文檔
使用navicat工作的話,導(dǎo)出的格式是excel不符合格式,還得自己整理。所以本文將用screw工具包,整合到springboot的項(xiàng)目中便可以自動(dòng)生成數(shù)據(jù)庫(kù)設(shè)計(jì)文檔,非常方便,下面就分享一下教程2022-11-11

