是男人就下100层(小游戏)

来源:互联网 发布:职位表数据库字段 编辑:程序博客网 时间:2024/04/30 00:11
复制代码 1 package com.tarena.downwell; 2  3 import java.awt.image.BufferedImage; 4 /** 5  * 所有台阶的父类(包括顶部的刺) 6  * @author Misaki 7  * 8  */ 9 public class Board {10     protected int x;//横坐标11     protected int y;//纵坐标12     protected BufferedImage image;//图片13     protected int width;//图片宽度14     protected int height;//图片高度15     /*16      * 下面都是用elipse生成的get/set方法17      */18     public int getX() {19         return x;20     }21     public void setX(int x) {22         this.x = x;23     }24     public int getY() {25         return y;26     }27     public void setY(int y) {28         this.y = y;29     }30     public BufferedImage getImage() {31         return image;32     }33     public void setImage(BufferedImage image) {34         this.image = image;35     }36     public int getWidth() {37         return width;38     }39     public void setWidth(int width) {40         this.width = width;41     }42     public int getHeight() {43         return height;44     }45     public void setHeight(int height) {46         this.height = height;47     }48     49 }复制代码 复制代码package com.tarena.downwell;import java.util.Random;/** * 弹簧台阶 * @author Misaki * */public class BoardFlip extends Board implements MoveObject,Function{    private int index = 0;//播放动画时用来控制图片数组下标    private boolean flag = true;//true就是没被踩过,踩过就false        public boolean isFlag() {        return flag;    }    public void setFlag(boolean flag) {        this.flag = flag;    }    public BoardFlip(){//构造        Random rnd = new Random();        this.image = Game.board_e[0];//图片设为图片数组中第一个图        this.width = this.image.getWidth();//图片宽度        this.height = this.image.getHeight();//图片高度        this.x = rnd.nextInt(Game.WIDTH-this.width-10);//横坐标在游戏框范围类随机        this.y = Game.HEIGHT;//纵坐标为窗体的高度(正好在窗体之外)    }    @Override    public void move() {        this.y -= ySpeed;    }    /**     * 这个方法每个功能性方块都差不多,只解释一次     */    public void flash(){        if(this.index==6){//如果图片播放到最后一个            this.image = Game.board_e[0];//重新把图片设为开始的图片            this.index = 0;//重置index            this.flag = true;//台阶改为正常(没被踩过,总不能踩一次鬼畜一天吧)        }else{//如果图片还没播放完            this.image = Game.board_e[++this.index];//播放下一个图片        }    }    /**     * 执行功能     */    @Override    public void function(Javaman man) {        man.flipSpeed = -5;//给个向上的速度        this.flag = false;//说明这个方块被踩了,执行动画,动画完了再改回true    }}复制代码 复制代码 1 package com.tarena.downwell; 2  3 import java.util.Random; 4 /** 5  * 传送带(往左) 6  * @author Misaki 7  * 8  */ 9 public class BoardMoveL extends Board implements MoveObject,Function{10     private int index = 0;11     12     public BoardMoveL(){//见BoradFlip13         Random rnd = new Random();14         this.image = Game.board_b[0];15         this.width = this.image.getWidth();16         this.height = this.image.getHeight();17         this.x = rnd.nextInt(Game.WIDTH-this.width-10);18         this.y = Game.HEIGHT;19     }20     @Override21     public void move() {//传送带的动画是从头播放到尾的,就让它随着台阶向上移动一起动吧22         if(this.index==3){//这个跟BoradFlip里flash结构一样23             this.image = Game.board_b[0];24             this.index = 0;25         }else{26             this.image = Game.board_b[++this.index];27         }28         this.y -= ySpeed;29     }30     /**31      * 给个往左的速度,区分与按键盘给的速度,最后叠加32      */33     @Override34     public void function(Javaman man) {35         man.moveSpeed = -1;36     }37     //下面的都用不到,只是实现接口必须重写。(好吧我设计也有点问题)38     @Override39     public void flash() {40         41     }42     @Override43     public boolean isFlag() {44         return false;45     }46     @Override47     public void setFlag(boolean flag) {48         49     }50     51 }复制代码 复制代码 1 package com.tarena.downwell; 2  3 import java.util.Random; 4 /** 5  * 传送带(往右) 6  * @author Misaki 7  * 8  */ 9 public class BoardMoveR extends Board implements MoveObject,Function{10     private int index = 0;11     12     public BoardMoveR(){//见BoradFlip13         Random rnd = new Random();14         this.image = Game.board_c[0];15         this.width = this.image.getWidth();16         this.height = this.image.getHeight();17         this.x = rnd.nextInt(Game.WIDTH-this.width-10);18         this.y = Game.HEIGHT;19     }20     @Override21     public void move() {//见BoardMoveL22         if(this.index==3){23             this.image = Game.board_c[0];24             this.index = 0;25         }else{26             this.image = Game.board_c[++this.index];27         }28         this.y -= ySpeed;29     }30     @Override31     public void function(Javaman man) {//见BoardMoveL32         man.moveSpeed = 1;33     }34     @Override35     public void flash() {36         // TODO Auto-generated method stub37         38     }39     @Override40     public boolean isFlag() {41         // TODO Auto-generated method stub42         return false;43     }44     @Override45     public void setFlag(boolean flag) {46         // TODO Auto-generated method stub47         48     }49 }复制代码 复制代码 1 package com.tarena.downwell; 2  3 import java.util.Random; 4 /** 5  * 钉子台阶 6  * @author Misaki 7  * 8  */ 9 public class BoardNail extends Board implements MoveObject,Function{10     private boolean flag = true;11     public BoardNail(){//见BoradFlip12         Random rnd = new Random();13         this.image = Game.board_f;14         this.width = this.image.getWidth();15         this.height = this.image.getHeight();16         this.x = rnd.nextInt(Game.WIDTH-this.width-10);17         this.y = Game.HEIGHT;18     }19     20     @Override21     public void move() {22         this.y -= ySpeed;23     }24 25     @Override26     public void function(Javaman man) {27         if(flag){//如果没被踩过28             man.subLife();//减命29             flag = false;//改为踩过30         }31     }32 33     @Override34     public void flash() {35         // TODO Auto-generated method stub36         37     }38 39     @Override40     public boolean isFlag() {41         // TODO Auto-generated method stub42         return false;43     }44 45     @Override46     public void setFlag(boolean flag) {47         // TODO Auto-generated method stub48         49     }50 }复制代码 复制代码package com.tarena.downwell;import java.util.Random;/** * 普通台阶 * @author Misaki * */public class BoardNormal extends Board implements MoveObject{        public BoardNormal(){//见BoradFlip        Random rnd = new Random();        this.image = Game.board_a;        this.width = this.image.getWidth();        this.height = this.image.getHeight();        this.x = rnd.nextInt(Game.WIDTH-this.width-10);        this.y = Game.HEIGHT;    }    /**     * 随机产生一个普通方块,只是为了init()     * @return     */    public static BoardNormal randomOne(){        BoardNormal b = new BoardNormal();        Random rnd = new Random();        b.y -= rnd.nextInt(800);//设为800是让它一开始就在游戏框里        return b;    }        @Override    public void move() {        this.y -= ySpeed;    }}复制代码 复制代码 1 package com.tarena.downwell; 2  3 import java.util.Random; 4 import java.util.Timer; 5 import java.util.TimerTask; 6 /** 7  * 易碎台阶(踩上去过一会就掉下去) 8  * @author Misaki 9  * @version 1.110  */11 public class BoardOnce extends Board implements MoveObject,Function{12     private int index = 0;13     private boolean flag = true;14     15 16     public boolean isFlag() {17         return flag;18     }19     public void setFlag(boolean flag) {20         this.flag = flag;21     }22     public BoardOnce(){//见BoradFlip23         Random rnd = new Random();24         this.image = Game.board_d[0];25         this.width = this.image.getWidth();26         this.height = this.image.getHeight();27         this.x = rnd.nextInt(Game.WIDTH-this.width-10);28         this.y = Game.HEIGHT;29     }30     @Override31     public void move() {32         this.y -= ySpeed;33     }34     public void flash(){35         if(this.index==5){36             this.image = Game.board_d[0];37             this.index = 0;38             this.flag = true;39         }else{40             this.image = Game.board_d[++this.index];41         }42     }43     @Override44     public void function(Javaman man) {45         Timer timer = new Timer();46         timer.schedule(new TimerTask(){47 48             @Override49             public void run() {50                 man.setY(y+height);//200ms后让小人穿过去51                 flag = false;//台阶改为没被踩过52             }53             54         }, 200);//只有两个参数的重载。200毫秒后执行run(),只执行一次哦!55     }56 }复制代码 复制代码 1 package com.tarena.downwell; 2 /** 3  * 功能性台阶接口(弹起来,传送带转起来,刺死你,穿过去) 4  * @author Misaki 5  * 6  */ 7 public interface Function { 8     void function(Javaman man);//执行功能 9     void flash();//播放专属动画10     /*11      * 关于Flag的get/set12      * Flag判断这个方块功能被没被执行,或者能不能执行13      */14     boolean isFlag();15     void setFlag(boolean flag);16 }复制代码 复制代码  1 package com.tarena.downwell;  2   3 import java.awt.image.BufferedImage;  4 /**  5  * 小人类  6  * @author Misaki  7  *  8  */  9 public class Javaman { 10     private int x;//横坐标 11     private int y;//纵坐标 12     private BufferedImage image;//图片 13     private int index = 0;//用于切换图片,形成动画 14     private int width;//图片宽 15     private int height;//图片高 16     private int ySpeed;//纵向速度 17     private int xSpeed;//横向速度 18     public int flipSpeed = 0;//弹簧台阶提供的向上速度 19     public int moveSpeed = 0;//传送带提供的横向速度 20     private boolean isManOnFloor;//是否在台阶上 21     private int life = 12;//生命 22      23     public Javaman(int x, int y) { 24         super(); 25         this.x = x; 26         this.y = y; 27         this.image = Game.javaman_s; 28         this.width = this.image.getWidth(); 29         this.height = this.image.getHeight(); 30         this.xSpeed = 0; 31         this.ySpeed = 2; 32     } 33  34     public void subLife(){//生命减一 35         life--; 36     } 37      38     public void die(){//死亡 39         life = 0; 40     } 41      42     public void addLife(){ 43         this.life++; 44     } 45      46     public int getLife(){ 47         return life; 48     } 49      50     public void move(){//横向移动 51         this.image = Game.javaman_s;//默认情况设为没有移动的图片 52         if(this.x>10 && this.x+this.width<Game.WIDTH-20){//如果在游戏框中间 53             if(xSpeed>0){//如果往右移 54                 if(isManOnFloor){//如果在台阶上往右移 55                     /* 56                      * 播放台阶上右移的动画 57                      */ 58                     this.image = Game.javaman_r[index++]; 59                     if(index>2){ 60                         index = 0; 61                     } 62                 }else{//在空中 63                     /* 64                      * 播放空中右移的动画 65                      */ 66                     this.image = Game.javaman_rd[index++]; 67                     if(index>2){ 68                         index = 0; 69                     } 70                 } 71             }else if(xSpeed<0){//如果往左移 72                 if(isManOnFloor){//如果在台阶上往左移 73                     /* 74                      * 播放台阶上左移的动画 75                      */ 76                     this.image = Game.javaman_l[index++]; 77                     if(index>2){ 78                         index = 0; 79                     } 80                 }else{//在空中 81                     /* 82                      * 播放空中左移的动画 83                      */ 84                     this.image = Game.javaman_ld[index++]; 85                     if(index>2){ 86                         index = 0; 87                     } 88                 } 89             } 90             this.x += xSpeed+moveSpeed;//键盘监听提供速度+传送带提供速度 91         }else if(this.x<=10){//在画面最左端 92             this.x++;//弹回来! 93         }else {//画面最右端 94             this.x--;//弹回来! 95         } 96     } 97     int flipFlag = 0;//控制被弹起来的情况下,向上速度减小的频率,快了弹得太低,慢了弹到顶了 98     public void drop(){ 99         if(flipSpeed!=0){//如果被弹起来100             flipFlag++;101             if(this.y>45){//如果没到顶102                 this.y += flipSpeed;//那就勇敢的上!103             }else{//到顶了。。104                 flipSpeed = 0;//别上了,乖乖下去105 //                life--;//到顶了难道不减血?(注释原因为后来游戏主类写了判断减血的方法)106             }107             if(flipFlag%15==0){//到时间减速了,你想上天啊?108                 flipSpeed++;//负的数加加不就是减速吗?109             }110         }else{//没被弹起来111             this.y += ySpeed;//正常下落吧。112         }113     }114     115     public boolean isManOnFloor() {116         return isManOnFloor;117     }118 119     public void setManOnFloor(boolean isManOnFloor) {120         this.isManOnFloor = isManOnFloor;121     }122 123     public BufferedImage getImage() {124         return image;125     }126 127     public void setImage(BufferedImage image) {128         this.image = image;129     }130 131     public int getX() {132         return x;133     }134 135     public void setX(int x) {136         this.x = x;137     }138 139     public int getY() {140         return y;141     }142 143     public void setY(int y) {144         this.y = y;145     }146 147     public int getWidth() {148         return width;149     }150 151     public void setWidth(int width) {152         this.width = width;153     }154 155     public int getHeight() {156         return height;157     }158 159     public void setHeight(int height) {160         this.height = height;161     }162 163     public int getySpeed() {164         return ySpeed;165     }166 167     public void setySpeed(int ySpeed) {168         this.ySpeed = ySpeed;169     }170 171     public int getxSpeed() {172         return xSpeed;173     }174 175     public void setxSpeed(int xSpeed) {176         this.xSpeed = xSpeed;177     }178     179     180 }复制代码  复制代码  1 package com.tarena.downwell;  2   3 import java.awt.Color;  4 import java.awt.Font;  5 import java.awt.Graphics;  6 import java.awt.event.KeyAdapter;  7 import java.awt.event.KeyEvent;  8 import java.awt.image.BufferedImage;  9 import java.io.IOException; 10 import java.util.ArrayList; 11 import java.util.Iterator; 12 import java.util.List; 13 import java.util.Random; 14 import java.util.Timer; 15 import java.util.TimerTask; 16  17 import javax.imageio.ImageIO; 18 import javax.swing.JFrame; 19 import javax.swing.JPanel; 20  21 /** 22  * 游戏的主类 23  * @author Misaki 24  * @version 3.2 25  * 1.将MoveObject里的常量改为负数。 26  * 2.火箭速度增大,且现在火箭根据当时小人的横坐标来生成 27  * 3.弹簧台阶现在不会连续弹起小人,即小人只有掉下来踩到台阶才会触发弹簧 28  * 4.加入游戏结束画面,游戏结束时会用图片显示下了多少层。 29  */ 30 public class Game extends JPanel{ 31     public static final int WIDTH = 500;//窗体宽度 32     public static final int HEIGHT = 900;//窗体高度 33     public static final int RUNNING = 0;//游戏运行 34     public static final int PAUSE = 1;//游戏暂停 35     public static final int START = 2;//游戏开始 36     public static final int GAME_OVER = 3;//游戏结束 37      38     private Timer timer;//定时器 39     private int intervel = 10;//定时器间隔 40     private Random rnd = new Random();//产生随机数 41     private int score = 0;//分数,即下了多少层,由于台阶上升速度一定,可以按时间增长 42     private int state = START;//游戏状态,默认为运行 43     private int level = 0; 44      45     private BoardTop boardtop = new BoardTop();//顶部尖刺 46     private Javaman man;//小人 47     private List<Board> boards = new ArrayList<Board>();//台阶集合 48     private List<Apple> apples = new ArrayList<Apple>();//苹果集合 49     private List<Monster> monsters = new ArrayList<Monster>();//怪物集合 50     private List<Rocket> rockets = new ArrayList<Rocket>();//火箭集合 51     /** 静态图片 */ 52     public static BufferedImage background; 53     public static BufferedImage pause; 54     public static BufferedImage start; 55     public static BufferedImage gameover; 56      57     public static BufferedImage[] num = new BufferedImage[10]; 58      59     public static BufferedImage apple; 60     public static BufferedImage monster; 61     public static BufferedImage rocket; 62      63     public static BufferedImage board_top; 64     public static BufferedImage board_a; 65     public static BufferedImage[] board_b = new BufferedImage[4]; 66     public static BufferedImage[] board_c = new BufferedImage[4]; 67     public static BufferedImage[] board_d = new BufferedImage[6]; 68     public static BufferedImage[] board_e = new BufferedImage[7]; 69     public static BufferedImage board_f; 70      71     public static BufferedImage[] javaman_c = new BufferedImage[3]; 72     public static BufferedImage[] javaman_l = new BufferedImage[3]; 73     public static BufferedImage[] javaman_ld = new BufferedImage[3]; 74     public static BufferedImage[] javaman_r = new BufferedImage[3]; 75     public static BufferedImage[] javaman_rd = new BufferedImage[3]; 76     public static BufferedImage javaman_s; 77     /** 静态块,加载所有图片 */ 78     static{ 79         try { 80             background = ImageIO.read(Game.class.getResource("background.gif")); 81             start = ImageIO.read(Game.class.getResource("start.gif")); 82             pause = ImageIO.read(Game.class.getResource("pause.png")); 83             gameover = ImageIO.read(Game.class.getResource("gameover.gif")); 84              85             board_top = ImageIO.read(Game.class.getResource("board/board_top.gif")); 86             board_a = ImageIO.read(Game.class.getResource("board/board_a.gif")); 87             apple = ImageIO.read(Game.class.getResource("apple.png")); 88             monster = ImageIO.read(Game.class.getResource("monster.png")); 89             rocket = ImageIO.read(Game.class.getResource("rocket.png")); 90              91             num[0] = ImageIO.read(Game.class.getResource("num/number_0.gif")); 92             num[1] = ImageIO.read(Game.class.getResource("num/number_1.gif")); 93             num[2] = ImageIO.read(Game.class.getResource("num/number_2.gif")); 94             num[3] = ImageIO.read(Game.class.getResource("num/number_3.gif")); 95             num[4] = ImageIO.read(Game.class.getResource("num/number_4.gif")); 96             num[5] = ImageIO.read(Game.class.getResource("num/number_5.gif")); 97             num[6] = ImageIO.read(Game.class.getResource("num/number_6.gif")); 98             num[7] = ImageIO.read(Game.class.getResource("num/number_7.gif")); 99             num[8] = ImageIO.read(Game.class.getResource("num/number_8.gif"));100             num[9] = ImageIO.read(Game.class.getResource("num/number_9.gif"));101             102             103             board_b[0] = ImageIO.read(Game.class.getResource("board/board_b1.gif"));104             board_b[1] = ImageIO.read(Game.class.getResource("board/board_b2.gif"));105             board_b[2] = ImageIO.read(Game.class.getResource("board/board_b3.gif"));106             board_b[3] = ImageIO.read(Game.class.getResource("board/board_b4.gif"));107             108             board_c[0] = ImageIO.read(Game.class.getResource("board/board_c1.gif"));109             board_c[1] = ImageIO.read(Game.class.getResource("board/board_c2.gif"));110             board_c[2] = ImageIO.read(Game.class.getResource("board/board_c3.gif"));111             board_c[3] = ImageIO.read(Game.class.getResource("board/board_c4.gif"));112             113             board_d[0] = ImageIO.read(Game.class.getResource("board/board_d1.gif"));114             board_d[1] = ImageIO.read(Game.class.getResource("board/board_d2.gif"));115             board_d[2] = ImageIO.read(Game.class.getResource("board/board_d3.gif"));116             board_d[3] = ImageIO.read(Game.class.getResource("board/board_d4.gif"));117             board_d[4] = ImageIO.read(Game.class.getResource("board/board_d5.gif"));118             board_d[5] = ImageIO.read(Game.class.getResource("board/board_d6.gif"));119             120             board_e[0] = ImageIO.read(Game.class.getResource("board/board_e1.gif"));121             board_e[1] = ImageIO.read(Game.class.getResource("board/board_e2.gif"));122             board_e[2] = ImageIO.read(Game.class.getResource("board/board_e3.gif"));123             board_e[3] = ImageIO.read(Game.class.getResource("board/board_e4.gif"));124             board_e[4] = ImageIO.read(Game.class.getResource("board/board_e5.gif"));125             board_e[5] = ImageIO.read(Game.class.getResource("board/board_e6.gif"));126             board_e[6] = ImageIO.read(Game.class.getResource("board/board_e7.gif"));127             128             board_f = ImageIO.read(Game.class.getResource("board/board_f.gif"));129             130             javaman_c[0] = ImageIO.read(Game.class.getResource("man/javaman_c1.gif"));131             javaman_c[1] = ImageIO.read(Game.class.getResource("man/javaman_c2.gif"));132             javaman_c[2] = ImageIO.read(Game.class.getResource("man/javaman_c3.gif"));133             134             javaman_l[0] = ImageIO.read(Game.class.getResource("man/javaman_l1.gif"));135             javaman_l[1] = ImageIO.read(Game.class.getResource("man/javaman_l2.gif"));136             javaman_l[2] = ImageIO.read(Game.class.getResource("man/javaman_l3.gif"));137             138             javaman_ld[0] = ImageIO.read(Game.class.getResource("man/javaman_ld1.gif"));139             javaman_ld[1] = ImageIO.read(Game.class.getResource("man/javaman_ld2.gif"));140             javaman_ld[2] = ImageIO.read(Game.class.getResource("man/javaman_ld3.gif"));141             142             javaman_r[0] = ImageIO.read(Game.class.getResource("man/javaman_r1.gif"));143             javaman_r[1] = ImageIO.read(Game.class.getResource("man/javaman_r2.gif"));144             javaman_r[2] = ImageIO.read(Game.class.getResource("man/javaman_r3.gif"));145             146             javaman_rd[0] = ImageIO.read(Game.class.getResource("man/javaman_rd1.gif"));147             javaman_rd[1] = ImageIO.read(Game.class.getResource("man/javaman_rd2.gif"));148             javaman_rd[2] = ImageIO.read(Game.class.getResource("man/javaman_rd3.gif"));149             150             javaman_s = ImageIO.read(Game.class.getResource("man/javaman_s.gif"));151             152         } catch (IOException e) {153             e.printStackTrace();154         }155     }156     /**157      * 游戏初始化158      */159     public void init(){160         boards.clear();//清空所有台阶161         apples.clear();162         monsters.clear();163         rockets.clear();164         enterFlag = isDieFlag = scoreFlag =0;165         man = null;//重置小人166         score = 0;//重置分数167         level = 0;168         state = START;169         for(int i=0;i<5;i++){//随机产生5个台阶170             boards.add(BoardNormal.randomOne((i+1)*100));171         }172         Board b = boards.get(rnd.nextInt(5));//随便从这5个台阶中挑出一个173         /*174          * 创建一个小人,坐标为上边随机选取台阶的正上方175          */176         man = new Javaman(b.getX()+b.getWidth()/2-javaman_s.getWidth()/2,b.getY()-javaman_s.getHeight());177     }178     179     int enterFlag = 0;//控制台阶入场的频率180     /**181      * 台阶入场182      */183     public void enterAction(){184         enterFlag++;185         if(enterFlag%100==0){186             int index = rnd.nextInt(6);187             /*188              * 随机创建6个台阶中的一个189              */190             switch(index){191             case 0 :192             boards.add(new BoardFlip());193             break;194             case 1:195             boards.add(new BoardMoveL());196             break;197             case 2:198             boards.add(new BoardMoveR());199             break;200             case 3:201             boards.add(new BoardNail());202             break;203             case 4:204             boards.add(new BoardNormal());205             break;206             case 5:207             boards.add(new BoardOnce());208             break;209             }210         }211         if(enterFlag%(3000+level*500)==0){//每半分钟出一个苹果奖励212             apples.add(new Apple());//往数组里加一个新的苹果213         }214         215         if(enterFlag%(1000-level*100)==0){216             Board b = boards.get(rnd.nextInt(boards.size()));217             int x = b.getX()+b.getWidth()/2-15;218             int y = b.getY()-30;219             int ox1 = b.getX();220             int ox2 = b.getX()+b.getWidth();221             monsters.add(new Monster(x,y,ox1,ox2));222         }223         224         if(enterFlag%(1500-level*100)==0){225             rockets.add(new Rocket(man.getX()));226         }227     }228     /**229      * 判断小人是不是站在台阶上230      */231     public void isManOnFloor(){232         man.setManOnFloor(false);//默认为小人不在台阶上233         man.moveSpeed = 0;//将小人的横向速度重置为0234         for(Iterator<Board> it = boards.iterator();it.hasNext();){//遍历集合235             Board b = it.next();//取出集合元素236             int manx = man.getX();237             int many = man.getY()+man.getHeight();238             int bx = b.getX();239             int by = b.getY();240             /*241              * 判断小人坐标和当前取出的台阶坐标是否重合,重合则把小人改成”站在台阶上“242              */243             if(manx>bx-man.getWidth() && manx<bx+b.getWidth() && many>by && many<by+b.getHeight()){244                 man.setManOnFloor(true);245                 if(b instanceof Function){//如果这个方块是功能性台阶246                     Function f = (Function)b;//强转为功能台阶247                     f.function(man);//对小人执行台阶功能248                 }249             }250         }251     }252     /**253      * 更新画面(小人,台阶动起来)254      */255     public void update(){256         if(man.isManOnFloor()){//如果小人在台阶上257             man.setySpeed(-1);//小人跟着台阶一起向上258         }else{//不在台阶上259             man.setySpeed(2);//小人往下掉260         }261         for(Board b:boards){//遍历所有台阶262             if(b instanceof MoveObject){//如果台阶是会动的(除了顶部刺的所有台阶,顶部刺为了节省代码,继承了台阶类(board))263                 MoveObject o = (MoveObject)b;//强转一下咯264                 o.move();//给我动!265             }266             if(b instanceof Function){//如果这个方块正好是功能性方块(它有一些附带的动画)267                 Function f = (Function)b;//再转!268                 if(!f.isFlag()){//如果这个方块的功能被调用过269                     f.flash();//动画!270                 }271             }272         }273         for(Apple a:apples){274             a.move();275         }276         for(Monster m:monsters){277             m.move();278         }279         for(Rocket r:rockets){280             r.move();281         }282         man.drop();//小人纵向移动(实际速度根据上面设置的纵向速度)283         man.move();//小人横向移动(实际速度根据键盘监听和传送带提供的横向速度)284     }285     /**286      * 删除出界台阶287      */288     public void outOfBoundsAction(){289         for(Iterator<Board> it = boards.iterator();it.hasNext();){//遍历!!290             Board b = it.next();//取!291             int by = b.getY();292             int ty = boardtop.getY();293             /*294              * 如果台阶高度到了顶部刺的高度295              */296             if(by<ty){297                 it.remove();//出去了还不给我滚出集合!298             }299         }300         for(Iterator<Monster> it = monsters.iterator();it.hasNext();){301             Monster m = it.next();302             int my = m.getY();303             int ty = boardtop.getY();304             if(my<ty){305                 it.remove();306             }307         }308         for(Iterator<Rocket> it = rockets.iterator();it.hasNext();){309             Rocket r = it.next();310             int ry = r.getY();311             int ty = boardtop.getY();312             if(ry<ty){313                 it.remove();314             }315         }316     }317     int isDieFlag = 0;//控制下小人被顶部刺刺中时血量下降速度,总不能一秒降到-40吧?318     /**319      * 对小人血量的操作320      */321     public void isDie(){322         int my = man.getY();//小人的纵坐标,横坐标又不会让小人死(呵呵)323         if(my>HEIGHT){//如果掉下去了,当然是指掉到头了!324             man.die();//死吧死吧!325         }else if(my<=boardtop.getY()+boardtop.getHeight()){//如果碰到刺了326             if(isDieFlag%50==0){//控制下血量下降频率,50*10ms降低一次327                 man.subLife();//小人生命减一。328             }329             isDieFlag++;//这个不懂???好吧直接问我330         }else{331             isDieFlag = 0;//如果小人不在上面的地方,那么重置下,不然下次撞到刺可能就又要等500ms才掉血。332         }333         for(Iterator<Monster> it = monsters.iterator();it.hasNext();){334             Monster a = it.next();335             int ax1 = a.getX();336             int ax2 = a.getX()+a.getWidth();337             int ay1 = a.getY();338             int ay2 = a.getY()+a.getHeight();339             int mx1 = man.getX();340             int mx2 = man.getX()+man.getWidth();341             int my1 = man.getY();342             int my2 = man.getY()+man.getHeight();343             if(((mx1>=ax1 && mx1<=ax2)||(mx2>=ax1 && mx2<=ax2))344              &&((my1>=ay1 && my1<=ay2)||(my2>=ay1 && my2<=ay2))345             ){346                 man.subLife();347                 it.remove();348             }349         }350         for(Iterator<Rocket> it = rockets.iterator();it.hasNext();){351             Rocket r = it.next();352             int rx1 = r.getX();353             int rx2 = r.getX()+r.getWidth();354             int ry1 = r.getY();355             int ry2 = r.getY()+r.getHeight();356             int mx1 = man.getX();357             int mx2 = man.getX()+man.getWidth();358             int my1 = man.getY();359             int my2 = man.getY()+man.getHeight();360             if(((mx1>=rx1 && mx1<=rx2)||(mx2>=rx1 && mx2<=rx2))361                     &&((my1>=ry1 && my1<=ry2)||(my2>=ry1 && my2<=ry2))362                     ){363                 man.subLife();364                 it.remove();365             }366         }367     }368     /**369      * 判断游戏结束了没370      */371     public void gameover(){372         if(man.getLife()<=0){//如果生命值为0了373             state=GAME_OVER;374         }375     }376     int scoreFlag = 0;//用于计时377     /**378      * 得分,2秒加一层379      */380     public void getScore(){381         scoreFlag++;382         if(scoreFlag%200==0){//200*10ms加一层383             score++;384             if(score%20==0 && level<9){385                 level++;386             }387         }388     }389     390     public void getLife(){391         boolean getlife = false;392         for(Iterator<Apple> it = apples.iterator();it.hasNext();){393             Apple a = it.next();394             /*395              * 苹果和小人的四个界点坐标396              */397             int ax1 = a.getX();398             int ax2 = a.getX()+a.getWidth();399             int ay1 = a.getY();400             int ay2 = a.getY()+a.getHeight();401             int mx1 = man.getX();402             int mx2 = man.getX()+man.getWidth();403             int my1 = man.getY();404             int my2 = man.getY()+man.getHeight();405             if(((mx1>=ax1 && mx1<=ax2)||(mx2>=ax1 && mx2<=ax2))406              &&((my1>=ay1 && my1<=ay2)||(my2>=ay1 && my2<=ay2))){407                 getlife = true;408                 it.remove();409             }410         }411         412         if(getlife){413             man.addLife();414         }415     416     }417     418     public void action(){419         this.addKeyListener(new KeyAdapter(){//键盘监听420             /**421              * 键盘被按下时给小人速度422              */423             @Override424             public void keyPressed(KeyEvent e) {425                 int key = e.getKeyCode();//获取按下的键是个啥426                 switch(key){427                 case KeyEvent.VK_LEFT://按的是方向左:428                     man.setxSpeed(-2);//给个往左移的速度429                     break;430                 case KeyEvent.VK_RIGHT://按的是方向右:431                     man.setxSpeed(2);//给个往右移的速度啊!432                     break;433                 case KeyEvent.VK_SPACE://按的是空格:434                     if(state==RUNNING){435                         state=PAUSE;436                     }else if(state==PAUSE){437                         state=RUNNING;438                     }else if(state==START){439                         state=RUNNING;440                     }else if(state==GAME_OVER){441                         init();//游戏初始化,所有台阶和小人重新生成442                         state=START;443                     }444                     break;445                 }446             }447 448             /**449              * 键盘松开时小人你就憋动啦!450              */451             @Override452             public void keyReleased(KeyEvent e) {453                 man.setxSpeed(0);//小人横向速度重置为0454             }455             456         });457         /*458          * 这两句坑了我半天,先开始没加键盘怎么按都没反应459          * 直到加了这两句,也是从俄罗斯方块代码里看的。意思不是很了解,也懒得了解了460          */461         this.setFocusable(true);462         this.requestFocus();463         464         timer = new Timer();//把上面声明的那个定时器引用指个对象给他,不然会报空指针哦~465         timer.schedule(new TimerTask(){466             /**467              * 重写run468              */469             @Override470             public void run() {471                 /*472                  * 想知道下面是干啥的你鼠标移上去呗473                  */474                 if(state==RUNNING){475                     enterAction();476                     isManOnFloor();477                     update();478                     outOfBoundsAction();479                     getLife();480                     getScore();481                     isDie();482                     gameover();483                 }484                 repaint();//重画下,不然你玩张静态图片啊?485             }486             487         }, 0, intervel);//intervel没忘吧,上面有写,计时器时间间隔,10ms一次哦488     }489     /**490      * 主方法,程序的入口491      * @param args492      */493     public static void main(String[] args) {494         JFrame frame = new JFrame("Downwell");//新建一个窗体,标题为Downwell <-啥意思?百度去!495         Game game = new Game();//新建一个游戏496         game.init();//第一次运行你不得初始化啊!497         frame.add(game);//把游戏添加到窗体里去(游戏这个类是继承了JPanel了才可以添加的,别乱加别的对象哦)498         frame.setSize(WIDTH, HEIGHT);//设置窗体宽高499         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认关闭操作(关闭窗体则程序结束)500         frame.setResizable(false);//设置窗体大小不能被改变(不懂就注释了这句然后运行下,用鼠标拖下窗体四角)501         frame.setLocationRelativeTo(null);//窗体居中显示502         frame.setVisible(true);//设置窗体可见,并提醒程序快点调用paint()方法503         game.action();//游戏开始!504     }505     /**506      * 重写paint方法507      */508     public void paint(Graphics g){509         paintStatic(g);//画些静止不动的背景510         paintBoard(g);//画台阶511         paintMonster(g);//画怪物512         paintRocket(g);//画火箭513         paintApple(g);//画苹果514         paintJavaman(g);//画小人515         paintLife(g);//画小人的生命516         paintScore(g);//画分数517         paintState(g);//画状态518     }519     /*520      * 介绍下drawImage()六个参数的重载,最后一个直接写null,只介绍前五个521      * 第一个:要画的图片522      * 第二,三个:画的图片从哪个坐标开始画523      * 第四,五个:控制图片大小,按给定的宽高缩放后画出来524      */525     526     527     public void paintRocket(Graphics g){528         for(Rocket r:rockets){529             g.drawImage(r.getImage(),r.getX(),r.getY(),r.getWidth(),r.getHeight(),null);530         }531     }532     533     public void paintMonster(Graphics g){534         for(Monster m:monsters){535             g.drawImage(m.getImage(),m.getX(),m.getY(),m.getWidth(),m.getHeight(),null);536         }537     }538     539     public void paintState(Graphics g){540         if(state==PAUSE){541             g.drawImage(pause,0,0,WIDTH,HEIGHT,null);542         }543         if(state==START){544             g.drawImage(start,0,0,WIDTH,HEIGHT,null);545         }546         if(state==GAME_OVER){547             int x = 350;548             int temp = score;549             g.drawImage(gameover, 0, 0, WIDTH,HEIGHT,null);550             do{551                 int n = temp%10;552                 g.drawImage(num[n],x,500,100,100,null);553                 temp /= 10;554                 x -= 120;555             }while(temp>0);556         }557     }558     559     public void paintApple(Graphics g){560         for(Apple a:apples){561             g.drawImage(a.getImage(),a.getX(),a.getY(),a.getWidth(),a.getHeight(),null);562         }563     }564     565     public void paintScore(Graphics g){566         Font font = new Font(Font.SANS_SERIF,Font.BOLD,25);//设置字体,我不想查字体的参数了,直接照搬飞机大战567         g.setColor(new Color(0xffffff));//白色的568         g.setFont(font);//把画笔字体设置为上面创建的字体569         g.drawString("SCORE:"+score, WIDTH-150, 25);//这个坐标是慢慢试出来的,想改就改。570     }571     572     public void paintLife(Graphics g){573         Font font = new Font(Font.SANS_SERIF,Font.BOLD,25);//设置字体,我不想查字体的参数了,直接照搬飞机大战574         g.setColor(new Color(0xffffff));//白色的575         g.setFont(font);//把画笔字体设置为上面创建的字体576         g.drawString("LIFE:"+man.getLife(), 10, 25);//这个坐标是慢慢试出来的,想改就改。577     }578     /**579      * 画台阶580      * @param g 画笔,我只写一次,不需要太纠结画笔是什么581      */582     public void paintBoard(Graphics g){583         for(Board b:boards){//增强for遍历集合584             g.drawImage(b.getImage(), b.getX(), b.getY(), null);//画!585         }586     }587     /**588      * 画小人589      * @param g590      */591     public void paintJavaman(Graphics g){592         g.drawImage(man.getImage(), man.getX(), man.getY(), null);//画!!593     }594     /**595      * 画背景596      * @param g597      */598     public void paintStatic(Graphics g){599         g.drawImage(background, 0, 0, WIDTH, HEIGHT, null);//画背景!!!600         g.drawImage(boardtop.image, boardtop.x, boardtop.y, boardtop.width, boardtop.height, null);//画顶部那个刺!!!!601     }602 }复制代码  复制代码 1 package com.tarena.downwell; 2 /** 3  * 可动台阶(除了顶部刺都算) 4  * @author Misaki 5  * 6  */ 7 public interface MoveObject { 8     final int ySpeed = 1;//每次往上移动一个像素 9     void move();//移动!10 }复制代码 复制代码 1 package com.tarena.downwell; 2  3 import java.awt.image.BufferedImage; 4 import java.util.Random; 5  6 public class Monster implements MoveObject{ 7     private int x; 8     private int y; 9     private int ox1;//移动时的左界限10     private int ox2;//移动时的右界限11     private BufferedImage image;12     private int width;13     private int height;14     private int xSpeed;15     16     public Monster(int x,int y,int ox1,int ox2){17         this.x = x;18         this.y = y;19         this.ox1 = ox1;20         this.ox2 = ox2;21         this.image = Game.monster;22         this.width = 30;23         this.height = 30;24         this.xSpeed = -1 + new Random().nextInt(2)*2;//横向速度为-1或125     }26     27     @Override28     public void move() {29         if(x<=ox1){30             xSpeed = 1;31         }32         if(x+width>=ox2){33             xSpeed = -1;34         }35         this.x += xSpeed;36         this.y += ySpeed;37     }38 39     public int getX() {40         return x;41     }42 43     public void setX(int x) {44         this.x = x;45     }46 47     public int getY() {48         return y;49     }50 51     public void setY(int y) {52         this.y = y;53     }54 55     public int getOx1() {56         return ox1;57     }58 59     public void setOx1(int ox1) {60         this.ox1 = ox1;61     }62 63     public int getOx2() {64         return ox2;65     }66 67     public void setOx2(int ox2) {68         this.ox2 = ox2;69     }70 71     public BufferedImage getImage() {72         return image;73     }74 75     public void setImage(BufferedImage image) {76         this.image = image;77     }78 79     public int getxSpeed() {80         return xSpeed;81     }82 83     public void setxSpeed(int xSpeed) {84         this.xSpeed = xSpeed;85     }86 87     public int getWidth() {88         return width;89     }90 91     public int getHeight() {92         return height;93     }94     95 }复制代码 复制代码 1 package com.tarena.downwell; 2  3 import java.awt.image.BufferedImage; 4 import java.util.Random; 5  6 public class Rocket { 7     private int x; 8     private int y; 9     private BufferedImage image;10     private int width;11     private int height;12     private int ySpeed;13     14     public Rocket(){15         Random rnd = new Random();16         this.x = rnd.nextInt(Game.WIDTH-this.width-25)+10;17         this.y = Game.HEIGHT;18         this.width = 50;19         this.height = 90;20         this.image = Game.rocket;21         this.ySpeed = -5;22     }23     public Rocket(int x){24         this();25         this.x = x;26     }27 28     public void move(){29         this.y += ySpeed;30     }31     32     public int getX() {33         return x;34     }35 36     public void setX(int x) {37         this.x = x;38     }39 40     public int getY() {41         return y;42     }43 44     public void setY(int y) {45         this.y = y;46     }47 48     public BufferedImage getImage() {49         return image;50     }51 52     public void setImage(BufferedImage image) {53         this.image = image;54     }55 56     public int getWidth() {57         return width;58     }59 60     public void setWidth(int width) {61         this.width = width;62     }63 64     public int getHeight() {65         return height;66     }67 68     public void setHeight(int height) {69         this.height = height;70     }71 72     public int getySpeed() {73         return ySpeed;74     }75 76     public void setySpeed(int ySpeed) {77         this.ySpeed = ySpeed;78     }79     80 }复制代码复制代码 1 package com.tarena.downwell; 2  3 import java.awt.image.BufferedImage; 4 import java.util.Random; 5  6 public class Apple { 7     private int x; 8     private int y; 9     private BufferedImage image;10     private int width;11     private int height;12     private int xSpeed;13     private int ySpeed;14     15     public Apple(){16         Random rnd = new Random();17         this.x = rnd.nextInt(Game.WIDTH-this.width-20)+10;18         this.y = rnd.nextInt(Game.HEIGHT-65)+65;19         this.width = 30;20         this.height = 30;21         this.image = Game.apple;22         switch(rnd.nextInt(2)){23         case 0:24             xSpeed = -2;break;25         case 1:26             xSpeed = 2;break;27         }28         switch(rnd.nextInt(2)){29         case 0:30             ySpeed = -2;break;31         case 1:32             ySpeed = 2;break;33         }34     }35 36     public void move(){37         if(this.x<=10){38             this.xSpeed = 2;39         }40         if(this.x>=Game.WIDTH-20){41             this.xSpeed = -2;42         }43         if(this.y<=65){44             this.ySpeed = 2;45         }46         if(this.y>=Game.HEIGHT-this.height){47             this.ySpeed = -2;48         }49         this.x += xSpeed;50         this.y += ySpeed;51     }52     53     public int getX() {54         return x;55     }56     public void setX(int x) {57         this.x = x;58     }59     public int getY() {60         return y;61     }62     public void setY(int y) {63         this.y = y;64     }65     public BufferedImage getImage() {66         return image;67     }68     public void setImage(BufferedImage image) {69         this.image = image;70     }71     public int getxSpeed() {72         return xSpeed;73     }74     public void setxSpeed(int xSpeed) {75         this.xSpeed = xSpeed;76     }77     public int getySpeed() {78         return ySpeed;79     }80     public void setySpeed(int ySpeed) {81         this.ySpeed = ySpeed;82     }83     public int getWidth() {84         return width;85     }86     public int getHeight() {87         return height;88     }89     90 }复制代码

 

0 0
原创粉丝点击