是男人就下100层(小游戏)
生活随笔
收集整理的這篇文章主要介紹了
是男人就下100层(小游戏)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
復制代碼1 package com.tarena.downwell;2 3 import java.awt.image.BufferedImage;4 /**5 * 所有臺階的父類(包括頂部的刺)6 * @author Misaki7 *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就是沒被踩過,踩過就falsepublic 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;//縱坐標為窗體的高度(正好在窗體之外)}@Overridepublic void move() {this.y -= ySpeed;}/*** 這個方法每個功能性方塊都差不多,只解釋一次*/public void flash(){if(this.index==6){//如果圖片播放到最后一個this.image = Game.board_e[0];//重新把圖片設為開始的圖片this.index = 0;//重置indexthis.flag = true;//臺階改為正常(沒被踩過,總不能踩一次鬼畜一天吧)}else{//如果圖片還沒播放完this.image = Game.board_e[++this.index];//播放下一個圖片}}/*** 執行功能*/@Overridepublic 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 Misaki7 *8 */9 public class BoardMoveL extends Board implements MoveObject,Function{
10 private int index = 0;
11
12 public BoardMoveL(){//見BoradFlip
13 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 @Override
21 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 @Override
34 public void function(Javaman man) {
35 man.moveSpeed = -1;
36 }
37 //下面的都用不到,只是實現接口必須重寫。(好吧我設計也有點問題)
38 @Override
39 public void flash() {
40
41 }
42 @Override
43 public boolean isFlag() {
44 return false;
45 }
46 @Override
47 public void setFlag(boolean flag) {
48
49 }
50
51 }
復制代碼復制代碼1 package com.tarena.downwell;2 3 import java.util.Random;4 /**5 * 傳送帶(往右)6 * @author Misaki7 *8 */9 public class BoardMoveR extends Board implements MoveObject,Function{
10 private int index = 0;
11
12 public BoardMoveR(){//見BoradFlip
13 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 @Override
21 public void move() {//見BoardMoveL
22 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 @Override
31 public void function(Javaman man) {//見BoardMoveL
32 man.moveSpeed = 1;
33 }
34 @Override
35 public void flash() {
36 // TODO Auto-generated method stub
37
38 }
39 @Override
40 public boolean isFlag() {
41 // TODO Auto-generated method stub
42 return false;
43 }
44 @Override
45 public void setFlag(boolean flag) {
46 // TODO Auto-generated method stub
47
48 }
49 }
復制代碼復制代碼1 package com.tarena.downwell;2 3 import java.util.Random;4 /**5 * 釘子臺階6 * @author Misaki7 *8 */9 public class BoardNail extends Board implements MoveObject,Function{
10 private boolean flag = true;
11 public BoardNail(){//見BoradFlip
12 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 @Override
21 public void move() {
22 this.y -= ySpeed;
23 }
24
25 @Override
26 public void function(Javaman man) {
27 if(flag){//如果沒被踩過
28 man.subLife();//減命
29 flag = false;//改為踩過
30 }
31 }
32
33 @Override
34 public void flash() {
35 // TODO Auto-generated method stub
36
37 }
38
39 @Override
40 public boolean isFlag() {
41 // TODO Auto-generated method stub
42 return false;
43 }
44
45 @Override
46 public void setFlag(boolean flag) {
47 // TODO Auto-generated method stub
48
49 }
50 }
復制代碼復制代碼
package com.tarena.downwell;import java.util.Random;
/*** 普通臺階* @author Misaki**/
public class BoardNormal extends Board implements MoveObject{public BoardNormal(){//見BoradFlipRandom 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;}@Overridepublic 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 Misaki9 * @version 1.1
10 */
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(){//見BoradFlip
23 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 @Override
31 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 @Override
44 public void function(Javaman man) {
45 Timer timer = new Timer();
46 timer.schedule(new TimerTask(){
47
48 @Override
49 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 Misaki5 *6 */7 public interface Function {8 void function(Javaman man);//執行功能9 void flash();//播放專屬動畫
10 /*
11 * 關于Flag的get/set
12 * 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 Misaki7 *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 Misaki24 * @version 3.225 * 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;//將小人的橫向速度重置為0
234 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 @Override
424 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 @Override
452 public void keyReleased(KeyEvent e) {
453 man.setxSpeed(0);//小人橫向速度重置為0
454 }
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 * 重寫run
468 */
469 @Override
470 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 args
492 */
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 g
590 */
591 public void paintJavaman(Graphics g){
592 g.drawImage(man.getImage(), man.getX(), man.getY(), null);//畫!!
593 }
594 /**
595 * 畫背景
596 * @param g
597 */
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 Misaki5 *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或1
25 }
26
27 @Override
28 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 }
復制代碼
?
總結
以上是生活随笔為你收集整理的是男人就下100层(小游戏)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Postman高级功能-Monitor
- 下一篇: php实现wav转mp3,求,用PHP实