Java版吃豆游戏

                这是一个吃豆游戏的Java实现,具体代码较多请下载文件。

下载地址: http://download.csdn.net/source/396925



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>
 * <p>
 * Description:
 * </p>
 * <p>
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * <p>
 * License: http://www.apache.org/licenses/LICENSE-2.0
 * </p>
 * 
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @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;
            tickCount = nowTick;
        }
 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;
        }

    }


    public void run() ...{

        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;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
一、 背景描述 在完成面向对象、Swing、线程的课程后,可以开始练习本项目的部署安排。安排本练习的主要目的理解面向对象、能够用面向对象的思路去思考问题,结合Swing和现成的知识完成本项目。 二、 实现要求 使用面向对象的方式,完成本项目。 三、 实现技术 a) 熟练使用if、for等语句进行逻辑操作。 b) 分析数据的属性和方法,能够熟练地写出该数据表示的类。 c) 使用JFrame创建一个窗体。 d) 掌握ActionListener等事件的注册、添加、操作等。 e) 使用Grahpics能够绘制一般的图形、根据需要定制自己需要的复杂图形。 四、 类图 a) 类图 b) 类图说明 类名称 BigMouthFishFrame 类描述 大嘴鱼界面类。完成大嘴鱼的界面的绘制。该类继承JFrame。 包描述 main 函数描述 public static void main(String[] args) 程序的主函数。 BigMouthFishFrame() 构造函数。构造大嘴鱼界面。 类名称 BigMouthFish 类描述 大嘴鱼类。此类继承AcitonListener,实现AcitonPerformed方法,练习ActionListener的另一种实现方法。此类还练习定时器Timer的使用。此类还练习图形类Graphics的使用。 包描述 fish 函数描述 public BigMouthFish() 大嘴鱼缺省构造函数.创建一个位置为(200,200),大小为50,方向为右,颜色为Color.CYAN,速度为10的大嘴鱼 public BigMouthFish(int posx,int posy,int size,int direction,Color color,int speed) 根据位置、大小、方向、颜色、速度构造一个大嘴鱼。 public void move() 大嘴鱼移动。根据鱼的方向移动鱼。 public void changeColor(Color color) 改变大嘴鱼身体的颜色。 public void changeDir(int direction) 改变大嘴鱼的方向 public void paint(Graphics g) 使用画笔绘画大嘴鱼.大嘴鱼的头像:一个扇形的是鱼脸,上面有一个小圆是眼睛1.保存画笔颜色、2.绘制大嘴鱼的脸、3.绘制大嘴鱼的眼睛、4.恢复画笔颜色 类名称 FishPool 类描述 鱼池类。大鱼和小鱼放到此鱼池中,当大嘴鱼每10条小鱼的时候,鱼的size加1,速度加2。每条小鱼默认存在的时间是15秒钟。10秒后自动消失。此类练习if、for、Timer、内部类等的使用。更重要的是,希望学员做这个的游戏时候能做好严谨的逻辑考虑后,再动手。难点:大嘴鱼在鱼池边界的处理、大嘴鱼升级时的相关问题的处理。 包描述 fish 函数描述 FishPool() 鱼池的缺省构造函数。此处需要完成上下左右键的注册功能。 private void initFishBean() 初始化小鱼。保证小鱼生成的位置与大嘴鱼的位置不重叠。 private void beanNewPos() 小鱼重新生成新位置。保证小鱼生成的位置与大嘴鱼的位置不重叠。 public void paint(Graphics g) 覆盖JLabel的paint事件。 private void bigFishMove(int direction) 大嘴鱼的移动。根据大嘴鱼嘴的方向,判断其是否到了鱼池边界(此处为难点)。 private boolean isTouched() 检测大嘴鱼是否到了小鱼。 内部类 private class RightListenerImpl extends AbstractAction 内部类 - 向右按键事件。 private class DownListenerImpl extends AbstractAction 内部类 - 向下按键事件。 private class DownListenerImpl extends AbstractAction 内部类 - 向下按键事件。 private class LeftListenerImpl extends AbstractAction 内部类 - 向左按键事件。 private class TimerListenerImpl implements ActionListener 内部类 - 图形重回事件。 类名称 FishBean 类描述 类 包描述 fish 函数描述 public FishBean() 缺省构造函数。按位置(190,190),大小10,颜色Color.MAGENTA构造一
以下是一个简单的 Java 代码实现游戏的示例: ``` import java.util.Scanner; public class PacManGame { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("欢迎来到游戏!"); System.out.print("请输入地图宽度:"); int width = sc.nextInt(); System.out.print("请输入地图高度:"); int height = sc.nextInt(); char[][] map = new char[height][width]; int pacManX = 0, pacManY = 0; int dotCount = 0; // 初始化地图 for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { map[i][j] = '.'; } } // 随机生成豆子 int dotNum = (int) (0.2 * width * height); for (int i = 0; i < dotNum; i++) { int x = (int) (Math.random() * height); int y = (int) (Math.random() * width); if (map[x][y] == '.') { map[x][y] = '*'; dotCount++; } } // 初始化 Pac-Man 的位置 pacManX = height / 2; pacManY = width / 2; map[pacManX][pacManY] = 'C'; // 开始游戏循环 while (dotCount > 0) { System.out.println("当前地图:"); printMap(map); // 获取用户输入 System.out.print("请输入移动方向(w/a/s/d):"); char direction = sc.next().charAt(0); // 移动 Pac-Man int newPacManX = pacManX, newPacManY = pacManY; switch (direction) { case 'w': newPacManX--; break; case 'a': newPacManY--; break; case 's': newPacManX++; break; case 'd': newPacManY++; break; default: System.out.println("无效的移动方向!"); continue; } // 判断是否越界 if (newPacManX < 0 || newPacManX >= height || newPacManY < 0 || newPacManY >= width) { System.out.println("Pac-Man 不能走出地图!"); continue; } // 判断是否遇到墙 if (map[newPacManX][newPacManY] == '#') { System.out.println("Pac-Man 不能穿过墙!"); continue; } // 更新 Pac-Man 的位置 map[pacManX][pacManY] = '.'; pacManX = newPacManX; pacManY = newPacManY; map[pacManX][pacManY] = 'C'; // 判断是否豆子 if (map[pacManX][pacManY] == '*') { map[pacManX][pacManY] = 'C'; dotCount--; System.out.println("到了一个豆子!"); } } System.out.println("恭喜您通关了游戏!"); } // 打印地图 public static void printMap(char[][] map) { for (int i = 0; i < map.length; i++) { for (int j = 0; j < map[0].length; j++) { System.out.print(map[i][j] + " "); } System.out.println(); } } } ``` 这个程序实现了以下功能: 1. 根据用户输入的地图宽度和高度,随机生成一定数量的豆子,并初始化 Pac-Man 的位置。 2. 在游戏循环中,打印当前地图,接受用户输入移动方向,并根据输入更新 Pac-Man 的位置。 3. 在更新 Pac-Man 的位置后,判断是否豆子,如果是,则更新豆子数量,并打印提示信息。 4. 当所有豆子都被掉时,结束游戏循环。 这只是一个简单的示例,你可以根据自己的需求扩展它,比如增加难度、添加墙壁、改变豆子的分布规律等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值