天天看點

Java版吃豆遊戲及源碼

這是一個吃豆遊戲的Java實作,具體代碼較多請下載下傳檔案。

package org.loon.test;

import java.awt.Color;

import java.awt.Event;

import java.awt.Frame;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Insets;

import java.awt.MediaTracker;

import java.awt.Panel;

import java.awt.Toolkit;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.awt.image.BufferedImage;

import java.awt.image.VolatileImage;

/** 

* <p>

* Title: LoonFramework

* </p>

* Description:

* Copyright: Copyright (c) 2008

* Company: LoonFramework

* License: [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

* @author chenpeng

* @email:[email][email protected][/email]

* @version 0.1

*/

class Timer implements Runnable {

        Pacgame ap;

        int duration;

        private Thread myThread;

        private boolean loopf = true;

        private long tickCount;

        public Timer(Pacgame ap, int duration) {

                this.ap = ap;

                this.duration = duration;

        }

        public Timer(Pacgame ap) {

                this(ap, 16);

        public void on() {

                myThread = new Thread(this);

                myThread.start();

        public void off() {

                loopf = false;

        public void run() {

                loopf = true;

                tickCount = System.currentTimeMillis();

                while (loopf) {

                        try {

                                Thread.sleep(duration);

                        } catch (Exception e) {

                                e.printStackTrace();

                        }

                        ap.notifyFrame();

                }

        public int frames() {

                long nowTick = System.currentTimeMillis();

                int frame = (int) (nowTick - tickCount) / duration;

                if (frame <= 0) {

                        frame = 1;

                        tickCount = nowTick;

                } else if (frame > 5) {

                        frame = 5;

                } else {

                        tickCount += frame * duration;

                return frame;

}

public class Pacgame extends Panel implements Runnable {

        /** *//**

         * 

         */

        private static final long serialVersionUID = 1L;

        private static int WIDTH = 256;

        private static int HEIGHT = 224;

        Thread thread;

        //構造一個雙緩沖的、可變的image

        VolatileImage offImage;

        Image bg, bg0;

        CGloader loader;

        MazeManager mzmanager;

        MapManager emanager;

        SpriteManager spmanager, chipmanager;

        MonsterSprite redmon, ao, pink, monster;

        PacSprite pac;

        AttractManager atMng;

        Timer timer;

        int key = 0;

        int score;

        int number1;

        boolean loadOK = false;

        boolean isAttr = false;

        public void init() {

                ClassLoader cl = getClass().getClassLoader();

                Toolkit tk = Toolkit.getDefaultToolkit();

                bg0 = tk.createImage(cl.getResource("main.png"));

                bg = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB_PRE);

                MediaTracker mt = new MediaTracker(this);

                mt.addImage(bg0, 0);

                try {

                        mt.waitForID(0);

                } catch (Exception e) {

                        e.printStackTrace();

                loader = new CGloader("pacchr.png", this);

                loader.setAlpha(0, 8);

                mzmanager = new MazeManager();

                emanager = new MapManager();

                spmanager = new SpriteManager(4);

                chipmanager = new SpriteManager(5);

                pac = new PacSprite(10, 20, loader);

                redmon = new RedMonster(10, 10, mzmanager, loader);

                redmon.setTarget(pac);

                spmanager.add(redmon);

                ao = new BlueMonster(9, 13, mzmanager, loader);

                ao.setTarget(pac);

                spmanager.add(ao);

                pink = new PinkMonster(10, 13, mzmanager, loader);

                pink.setTarget(pac);

                spmanager.add(pink);

                monster = new Monster(11, 13, mzmanager, loader);

                monster.setTarget(pac);

                spmanager.add(monster);

                for (int i = 0; i < 5; i++) {

                        chipmanager.add(new ChipSprite(i * 16, 0, loader, i * 16, 130, 16,

                                        16));

                atMng = new AttractManager(loader);

                timer = new Timer(this, 16);

                setBackground(Color.black);

                setSize(WIDTH, HEIGHT);

                offImage = createVolatileImage(WIDTH, HEIGHT);

        public void paint(Graphics g) {

                if (!loadOK)

                        return;

                do {

                        int returnCode = offImage.validate(getGraphicsConfiguration());

                        if (returnCode == VolatileImage.IMAGE_INCOMPATIBLE){

                                offImage = createVolatileImage(WIDTH, HEIGHT);

                        Graphics volG = offImage.getGraphics();

                        volG.drawImage(bg, 0, 0, this);

                        spmanager.draw(volG, this);

                        pac.draw(volG, this);

                        chipmanager.draw(volG, this);

                        if (isAttr)

                                atMng.draw(volG, this);

                        volG.dispose();

                        g.drawImage(offImage, 0, 0, this);

                } while (offImage.contentsLost());

        public void update(Graphics g) {

                paint(g);

        public void start() {

                System.gc();

                if (thread == null) {

                        thread = new Thread(this);

                        thread.start();

        @SuppressWarnings("deprecation")

        public void stop() {

                if (thread != null) {

                        thread.stop();

                        thread = null;

                while (true) {

                        // MAIN LOOP

                        score = 0;

                        number1 = 3;

                        int stage = 1;

                        esaInit();

                        loadOK = true;

                        while (number1 > 0) {

                                while (gameMain(stage) == 2) {

                                        if (stage == 2)

                                                gameTheater();

                                        stage++;

                                        number1++;// 1:DEAD 2:CLEAR

                                        esaInit();

                                }

                        // GAME OVER

                        isAttr = true;

                        spmanager.setShow(false);

                        pac.setShow(false);

                        atMng.player = true;

                        atMng.ready = false;

                        atMng.gameover = true;

                        repaint();

                        timer.on();

                        key = 0;

                        while (true) {

                                if (key > 0)

                                        break;

                                waitFrame();

                        timer.off();

                        atMng.player = false;

                        atMng.gameover = false;

        public void esaInit() {

                Graphics g = bg.getGraphics();

                g.drawImage(bg0, 0, 0, null);

                g.dispose();

                emanager.init(bg);

        public int gameMain(int stage) {

                atMng.init(bg, score, number1);

                spmanager.init();

                pac.init();

                // 遊戲狀态 1:DEAD 2:CLEAR

                int gamestat = 0;

                int renzoku = 0;

                boolean ispower = false;

                boolean iseyesnd = false;

                Sprite chip;

                isAttr = true;

                int wait;

                if ((score == 0) && (number1 == 3)) {

                        wait = 2000;

                        wait = 1000;

                spmanager.setShow(false);

                pac.setShow(false);

                atMng.player = true;

                atMng.ready = true;

                repaint();

                sleep(wait);

                atMng.setBattle(--number1);

                spmanager.setShow(true);

                pac.setShow(true);

                atMng.player = false;

                isAttr = false;

                int time = 0;

                timer.on();

                int frame = 1;

                while (gamestat == 0) {

                        for (int l = 0; l < frame; l++) {

                                int score0 = score;

                                if (time == 60 * 55) {

                                        spmanager.setNawabari(false);

                                } else if (time == 60 * 50) {

                                        spmanager.setNawabari(true);

                                } else if (time == 60 * 30) {

                                } else if (time == 60 * 25) {

                                } else if (time == 60 * 5) {

                                spmanager.run();

                                MonsterSprite hitmon = spmanager.isMonsterHit(pac);

                                if (hitmon != null) {

                                        int state = hitmon.getState();

                                        if (state == 0)

                                                gamestat = 1;

                                        if (state == 1) {

                                                renzoku++;

                                                score = score + (1 << renzoku) * 100;

                                                chip = chipmanager.getSprite(renzoku);

                                                int x = hitmon.getX();

                                                int y = hitmon.getY();

                                                chip.setXY(x, y);

                                                chip.setShow(true);

                                                hitmon.setShow(false);

                                                pac.setShow(false);

                                                try {

                                                        Thread.sleep(50);

                                                } catch (Exception e) {

                                                }

                                                repaint();

                                                for (int i = 0; i < 50; i++) {

                                                        try {

                                                                Thread.sleep(10);

                                                        } catch (Exception e) {

                                                        }

                                                chip.setShow(false);

                                                hitmon.setShow(true);

                                                pac.setShow(true);

                                                hitmon.activity();

                                                iseyesnd = true;

                                                if (ispower) {

                                                        if (iseyesnd)

                                                                try {

                                                                        Thread.sleep(10);

                                                                } catch (Exception e) {

                                                                }

                                        }

                                pac.setKey(key);

                                int esa = pac.run(mzmanager, emanager);

                                if (esa > 0) {

                                        int remain = emanager.getRemain();

                                        score += 10;

                                        if (remain <= 0)

                                                gamestat = 2;

                                if (esa == 2) {

                                        redmon.state();

                                        ao.state();

                                        pink.state();

                                        monster.state();

                                        pac.powerup();

                                        renzoku = 0;

                                        score += 40;

                                        ispower = true;

                                if (ispower) {

                                        if (!pac.isPower()

                                                        || ((redmon.getState() != 1)

                                                                        && (ao.getState() != 1)

                                                                        && (pink.getState() != 1) && (monster

                                                                        .getState() != 1))) {

                                                ispower = false;

                                if (iseyesnd) {

                                        if ((redmon.getState() != 2) && (ao.getState() != 2)

                                                        && (pink.getState() != 2)

                                                        && (monster.getState() != 2)) {

                                                iseyesnd = false;

                                if (score != score0) {

                                        atMng.setScore(score);

                                time++;

                                score0 = score;

                                if (gamestat > 0)

                        } // FPS LOOP END

                        frame = waitFrame();

                        System.gc();

                timer.off();

                        Thread.sleep(2000);

                return gamestat;

        public void gameTheater() {

                g.setColor(Color.black);

                g.fillRect(0, 0, WIDTH, HEIGHT);

                int pacx = WIDTH;

                int p;

                int index = 288;

                redmon.init();

                redmon.setShow(true);

                int i = 0;

                while (i < 380) {

                        for (int j = 0; j < frame; j++) {

                                p = 2;

                                switch ((i >> 2) % 4) {

                                case 1:

                                        p += 4;

                                case 3:

                                        p = 8;

                                pac.setP(p);

                                pac.setXY(pacx--, 100);

                                redmon.setXY(index--, 100);

                                i++;

                                if (i >= 360)

                pacx = -32;

                redmon.state();

                index = 0;

                i = 0;

                                p = 0;

                                pac.setXY(pacx++, 100);

                                redmon.setXY(index++, 100);

        public void sleep(int tm) {

                        Thread.sleep(tm);

        public boolean handleEvent(Event e) {

                switch (e.id) {

                case Event.KEY_PRESS:

                case Event.KEY_ACTION:

                        switch (e.key) {

                        case Event.RIGHT:

                                key = 1;

                                break;

                        case Event.DOWN:

                                key = 2;

                        case Event.LEFT:

                                key = 4;

                        case Event.UP:

                                key = 8;

                        return true;

                case Event.KEY_RELEASE:

                case Event.KEY_ACTION_RELEASE:

                default:

                return false;

         * fps計算

         * @return

        private synchronized int waitFrame() {

                        wait();

                } catch (InterruptedException e) {

                // 傳回fps

                return timer.frames();

        public synchronized final void notifyFrame() {

                notifyAll();

        public static void main(String[] args) {

                final Pacgame ap = new Pacgame();

                ap.setSize(WIDTH, HEIGHT);

                Frame frm = new Frame("Java吃豆遊戲");

                frm.addWindowListener(new WindowAdapter() {

                        public void windowClosing(WindowEvent e) {

                                ap.stop();

                                System.exit(0);

                });

                frm.addNotify();

                Insets inset = frm.getInsets();

                int w0 = inset.left + inset.right;

                int h0 = inset.top + inset.bottom;

                frm.add(ap);

                frm.setSize(ap.getWidth() + w0, ap.getHeight() + h0);

                frm.setResizable(false);

                frm.setLocationRelativeTo(null);

                frm.setVisible(true);

                ap.requestFocus();

                ap.init();

                ap.start();

本文轉自 cping 51CTO部落格,原文連結:http://blog.51cto.com/cping1982/116833