Java實(shí)現(xiàn)的打地鼠小游戲完整示例【附源碼下載】
本文實(shí)例講述了Java實(shí)現(xiàn)的打地鼠小游戲。分享給大家供大家參考,具體如下:
這里涉及到j(luò)ava線程和GUI的相關(guān)知識(shí),一個(gè)簡(jiǎn)單的java小游戲打地鼠,有興趣的朋友可以優(yōu)化一下。先來(lái)看看運(yùn)行效果:

具體代碼:
Mouse.java:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Mouse {
private int x, y;
private int tab;
private int data;
Random rd = new Random();
private boolean live = true;
private int mouseTime = 10;
private MouseClient mc;
private static Toolkit tk = Toolkit.getDefaultToolkit();
private static Image[] imgs = null;
private static Map<Image, String> imgKV = new HashMap<Image, String>();
static {
imgs = new Image[] {
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/A.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/B.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/C.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/D.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/E.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/F.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/G.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/H.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/I.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/J.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/K.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/L.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/M.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/N.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/O.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/P.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/Q.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/R.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/S.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/T.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/U.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/V.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/W.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/X.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/Y.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/Z.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/0.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/1.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/2.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/3.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/4.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/5.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/6.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/7.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/8.png")),
tk.getImage(Mouse.class.getClassLoader().getResource(
"images/9.png"))
};
imgKV.put(imgs[0], "A");
imgKV.put(imgs[1], "B");
imgKV.put(imgs[2], "C");
imgKV.put(imgs[3], "D");
imgKV.put(imgs[4], "E");
imgKV.put(imgs[5], "F");
imgKV.put(imgs[6], "G");
imgKV.put(imgs[7], "H");
imgKV.put(imgs[8], "I");
imgKV.put(imgs[9], "J");
imgKV.put(imgs[10], "K");
imgKV.put(imgs[11], "L");
imgKV.put(imgs[12], "M");
imgKV.put(imgs[13], "N");
imgKV.put(imgs[14], "O");
imgKV.put(imgs[15], "P");
imgKV.put(imgs[16], "Q");
imgKV.put(imgs[17], "R");
imgKV.put(imgs[18], "S");
imgKV.put(imgs[19], "T");
imgKV.put(imgs[20], "U");
imgKV.put(imgs[21], "V");
imgKV.put(imgs[22], "W");
imgKV.put(imgs[23], "X");
imgKV.put(imgs[24], "Y");
imgKV.put(imgs[25], "Z");
imgKV.put(imgs[26], "0");
imgKV.put(imgs[27], "1");
imgKV.put(imgs[28], "2");
imgKV.put(imgs[29], "3");
imgKV.put(imgs[30], "4");
imgKV.put(imgs[31], "5");
imgKV.put(imgs[32], "6");
imgKV.put(imgs[33], "7");
imgKV.put(imgs[34], "8");
imgKV.put(imgs[35], "9");
}
public Mouse(int x, int y, int tab, MouseClient mc) {
this.x = x;
this.y = y;
this.tab = tab;
this.mc = mc;
data = rd.nextInt(36);
new Thread(new MouseTime()).start();
}
public void draw(Graphics g) {
if (!live) {
mc.mouses.remove(this);
mc.tab[tab] = 0;
return;
}
g.drawImage(imgs[data], x, y, null);
Color c = g.getColor();
g.setColor(Color.gray);
g.setFont(new Font(null, 1, 40));
g.drawString("" + mouseTime, x + 50, y + 10);
if (mouseTime <= 0) {
this.live = false;
mc.eclipseTime++;
}
}
public boolean keyReleased(KeyEvent e) {
int key = imgKV.get(imgs[data]).charAt(0);
if (e.getKeyCode() == key) {
System.out.println(key);
mc.mouseCount++;
this.live = false;
return true;
}
return false;
}
private class MouseTime implements Runnable {
public void run() {
while (true) {
mouseTime--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
MouseClient.java:
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class MouseClient extends Frame {
/*
* 整個(gè)游戲界面的規(guī)格
*/
public static final int GAME_WIDTH = 1000;
public static final int GAME_HEIGHT = 700;
public static int mouseCount;
public static int count;
public static int gameTime;
public static int eclipseTime;
List<Mouse> mouses = new ArrayList<Mouse>();
Random rd = new Random();
public int initMouseCount = 2;// 同時(shí)顯示的地鼠數(shù)
public int[] tab = new int[10];// 標(biāo)記坑里是否有地鼠
Image offScreenImage = null;
/*
* 本方法顯示主窗口
*/
public void launchFrame() {
this.setLocation(200, 10);
this.setSize(GAME_WIDTH, GAME_HEIGHT);
this.setTitle("MouseClient");
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setVisible(true);
this.setBackground(Color.GREEN);
this.setResizable(false);
this.addKeyListener(new KeyMonitor());
new Thread(new PaintThread()).start();
new Thread(new GameTime()).start();
}
private class GameTime implements Runnable {
public void run() {
while (true) {
gameTime++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private class PaintThread implements Runnable {
public void run() {
while (true) {
repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
public void paint(Graphics g) {
Color c = g.getColor();
g.setColor(Color.gray);
for (int i = 1; i <= 3; i++)
for (int j = 1; j <= 3; j++)
g.fillOval(GAME_WIDTH / 4 * i - 60, GAME_HEIGHT / 4 * j - 25,
120, 50);
g.setColor(c);
g.drawString("擊打數(shù):" + count, 20, 40);
g.drawString("擊中數(shù):" + mouseCount, 20, 60);
g.drawString("逃跑數(shù):" + eclipseTime + "", 20, 80);
g.drawString("時(shí)間:" + gameTime + "s", 20, 100);
if (mouseCount >= 80)
initMouseCount = 8;
else if (mouseCount >= 50)
initMouseCount = 6;
else if (mouseCount >= 20)
initMouseCount = 4;
int temp;
while (mouses.size() < initMouseCount) {
temp = rd.nextInt(9);
while (tab[temp] == 1) {
temp++;
if (temp == 9)
temp = 0;
}
tab[temp] = 1;
mouses.add(new Mouse(GAME_WIDTH / 4 * (temp % 3 + 1) - 70,
GAME_HEIGHT / 4 * (temp / 3 + 1) - 100, temp, this));
}
for (int i = 0; i < mouses.size(); i++) {
Mouse m = mouses.get(i);
m.draw(g);
}
}
public static void main(String[] args) {
MouseClient km = new MouseClient();
km.launchFrame();
}
private class KeyMonitor extends KeyAdapter {
public void keyReleased(KeyEvent e) {
System.out.println(e.getKeyCode());
count++;
for (int i = 0; i < mouses.size(); i++) {
if (mouses.get(i).keyReleased(e))
break;
}
}
}
}
附:完整實(shí)例代碼點(diǎn)擊此處本站下載。
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Springboot連接數(shù)據(jù)庫(kù)及查詢數(shù)據(jù)完整流程
今天給大家?guī)?lái)的是關(guān)于Springboot的相關(guān)知識(shí),文章圍繞著Springboot連接數(shù)據(jù)庫(kù)及查詢數(shù)據(jù)完整流程展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
jetty運(yùn)行時(shí)無(wú)法保存文件的解決方法
這篇文章主要為大家詳細(xì)介紹了jetty運(yùn)行時(shí)無(wú)法保存文件的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
深入了解SpringBoot中@ControllerAdvice的介紹及三種用法
這篇文章主要為大家詳細(xì)介紹了SpringBoot中@ControllerAdvice的介紹及三種用法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02
SpringBoot開發(fā)實(shí)戰(zhàn)系列之動(dòng)態(tài)定時(shí)任務(wù)
在我們?nèi)粘5拈_發(fā)中,很多時(shí)候,定時(shí)任務(wù)都不是寫死的,而是寫到數(shù)據(jù)庫(kù)中,從而實(shí)現(xiàn)定時(shí)任務(wù)的動(dòng)態(tài)配置,下面這篇文章主要給大家介紹了關(guān)于SpringBoot開發(fā)實(shí)戰(zhàn)系列之動(dòng)態(tài)定時(shí)任務(wù)的相關(guān)資料,需要的朋友可以參考下2021-08-08
深度解析Java中volatile的內(nèi)存語(yǔ)義實(shí)現(xiàn)以及運(yùn)用場(chǎng)景
這篇文章主要介紹了Java中volatile的內(nèi)存語(yǔ)義實(shí)現(xiàn)以及運(yùn)用場(chǎng)景,通過(guò)JVM的機(jī)制來(lái)分析volatile關(guān)鍵字在線程編程中的作用,需要的朋友可以參考下2015-12-12

