是男人就下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
- 是男人就下100层(小游戏)
- flash版小游戏:是男人就下100层
- flash版小游戏:是男人就下100层
- 是男人就下100层
- 是男人就下100层(简仿)
- 是男人就下100层【第一层】——高仿微信界面(1)
- 是男人就下100层【第一层】——高仿微信界面(2)
- 是男人就下100层【第一层】——高仿微信界面(3)
- 是男人就下100层【第一层】——高仿微信界面(4)
- 是男人就下100层【第一层】——高仿微信界面(5)
- 是男人就下100层【第一层】——高仿微信界面(6)
- 是男人就下100层【第一层】——高仿微信界面(7)
- 是男人就下100层【第一层】——高仿微信界面(8)
- 是男人就下100层【第一层】——高仿微信界面(9)
- 是男人就下100层【第一层】——高仿微信界面(10)
- 是男人就下100层【第二层】——帮美女更衣(1)
- 是男人就下100层【第二层】——帮美女更衣(2)
- 是男人就下100层【第四层】——Crazy贪吃蛇(1)
- 面向对象2
- 多线程的等待/通知机制
- discuz学习笔记:显示数组内容、显示二维数组特定值
- 笔记 9.19
- js 删除数组几种方法
- 是男人就下100层(小游戏)
- 笔记 9.14
- 笔记 9.18
- dm-thin模块分析
- 压测与curl
- 面向对象(思维导图)
- 自定义控件其实很简单 四
- 聊天室的客户端Client
- 【51Nod 1269 】Devu and Flowers