Java版吃豆游戏及源码

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

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




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: [url]http://www.apache.org/licenses/LICENSE-2.0[/url]
* </p>
* 
* @author chenpeng
* @email:[email]ceponline@yahoo.com.cn[/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;
                        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;
                         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;
                }  else {
                        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;
                atMng.ready =  true;
                repaint();
                sleep(wait);
                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) {
                                        spmanager.setNawabari( false);
                                }  else  if (time == 60 * 25) {
                                        spmanager.setNawabari( true);
                                }  else  if (time == 60 * 5) {
                                        spmanager.setNawabari( false);
                                }
                                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)
                                         break;
                        }  // FPS LOOP END

                        repaint();
                        frame = waitFrame();
                        System.gc();
                }
                timer.off();

                 try {
                        Thread.sleep(2000);
                }  catch (Exception e) {
                }

                 return gamestat;
        }

         public  void gameTheater() {
                Graphics g = bg.getGraphics();
                g.setColor(Color.black);
                g.fillRect(0, 0, WIDTH, HEIGHT);
                g.dispose();

                 int pacx = WIDTH;
                 int p;
                 int index = 288;
                spmanager.setShow( false);
                pac.init();
                pac.setShow( true);
                redmon.init();
                redmon.setShow( true);

                timer.on();
                 int frame = 1;
                 int i = 0;
                 while (i < 380) {
                         for ( int j = 0; j < frame; j++) {
                                p = 2;
                                 switch ((i >> 2) % 4) {
                                 case 1:
                                        p += 4;
                                         break;
                                 case 3:
                                        p = 8;
                                         break;
                                }
                                pac.setP(p);
                                pac.setXY(pacx--, 100);
                                redmon.setXY(index--, 100);
                                i++;
                                 if (i >= 360)
                                         break;
                        }
                        repaint();
                        frame = waitFrame();
                }

                pacx = -32;
                redmon.state();
                index = 0;

                i = 0;
                 while (i < 380) {
                         for ( int j = 0; j < frame; j++) {
                                p = 0;
                                 switch ((i >> 2) % 4) {
                                 case 1:
                                        p += 4;
                                         break;
                                 case 3:
                                        p = 8;
                                         break;
                                }
                                pac.setP(p);
                                pac.setXY(pacx++, 100);
                                redmon.setXY(index++, 100);
                                i++;
                                 if (i >= 360)
                                         break;
                        }
                        repaint();
                        frame = waitFrame();
                }

                timer.off();
        }

         public  void sleep( int tm) {
                 try {
                        Thread.sleep(tm);
                }  catch (Exception e) {
                        e.printStackTrace();
                }
        }

         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;
                                 break;
                         case Event.LEFT:
                                key = 4;
                                 break;
                         case Event.UP:
                                key = 8;
                                 break;
                        }
                         return  true;
                 case Event.KEY_RELEASE:
                 case Event.KEY_ACTION_RELEASE:
                 default:
                }
                 return  false;
        }

         /** *//**
         * fps计算
         * 
         * @return
         */

         private  synchronized  int waitFrame() {
                 try {
                        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



相关文章
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
988 7
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
564 5
|
消息中间件 算法 安全
JUC并发—1.Java集合包底层源码剖析
本文主要对JDK中的集合包源码进行了剖析。
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
JavaScript Java 关系型数据库
家政系统源码,java版本
这是一款基于SpringBoot后端框架、MySQL数据库及Uniapp移动端开发的家政预约上门服务系统。
542 6
家政系统源码,java版本
|
供应链 JavaScript 前端开发
Java基于SaaS模式多租户ERP系统源码
ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平,它是一种先进的企业管理理念和信息化管理系统。 适用于小微企业的 SaaS模式多租户ERP管理系统, 采用最新的技术栈开发, 让企业简单上云。专注于小微企业的应用需求,如企业基本的进销存、询价,报价, 采购、销售、MRP生产制造、品质管理、仓库库存管理、财务应收付款, OA办公单据、CRM等。
1144 23
|
Java
【源码】【Java并发】【ConcurrentHashMap】适合中学体质的ConcurrentHashMap
本文深入解析了ConcurrentHashMap的实现原理,涵盖JDK 7与JDK 8的区别、静态代码块、构造方法、put/get/remove核心方法等。JDK 8通过Node数组+链表/红黑树结构优化并发性能,采用CAS和synchronized实现高效锁机制。文章还详细讲解了hash计算、表初始化、扩容协助及计数更新等关键环节,帮助读者全面掌握ConcurrentHashMap的工作机制。
478 6
【源码】【Java并发】【ConcurrentHashMap】适合中学体质的ConcurrentHashMap
|
设计模式 人工智能 前端开发
现代 Java 实现数字华容道与石头迷阵游戏的项目实战及项目开发指南
本项目基于Java 17+,采用JavaFX与MVC架构,实战开发数字华容道/石头迷阵游戏。内容涵盖技术选型、核心逻辑、现代GUI设计、动画实现及项目打包发布,结合sealed class、record等新特性,打造简洁可维护的游戏代码结构。
474 0
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
738 3
|
机器学习/深度学习 存储 Java
Java 大视界 -- Java 大数据机器学习模型在游戏用户行为分析与游戏平衡优化中的应用(190)
本文探讨了Java大数据与机器学习模型在游戏用户行为分析及游戏平衡优化中的应用。通过数据采集、预处理与聚类分析,开发者可深入洞察玩家行为特征,构建个性化运营策略。同时,利用回归模型优化游戏数值与付费机制,提升游戏公平性与用户体验。