我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 项目源码 > JavaSwing实现的推箱子项目源码
总共48087条微博

动态微博

查看: 2752|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 7 Q7 v. T% \* |$ r5 @

6 ?+ S0 C/ H5 u: T1 U  t( X1 f提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。
0 j' p: _" U3 u$ Y6 y/ j6 D) K0 T( P3 Z) b2 `8 z, m$ y
这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
0 q8 f4 g: d( ~. g3 X4 J
/ p; }" Z9 W9 E- m$ @- g7 ?但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。
. ~0 i* d  ]: F8 }8 q  G' {  U* F4 R3 Z5 w8 N. F
推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!
8 V1 Y+ F/ x( m5 W- [) K( J$ o- K% N) G7 g
本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。! v, Z/ W5 w2 M- y4 K% A# W% j

' y1 t2 ?; p. b: I4 O$ w笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。8 y: h$ @7 ?5 P4 W

3 {. e$ N7 ^& ]/ o0 |: R; i; |目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。/ A; H5 @: a. e  j6 I, m5 h
游戏截图:
2 d1 g7 i- u4 H% k/ S2 ]7 l/ w
/ b7 T. x# Y" j& m  I0 M
& I2 Z# p; t, I) g; a5 `: r2 x

. l6 w) I5 f+ t; |9 l, K

# k7 `9 c! M) K
核心代码:

9 N- ?( L- p# w6 V8 \: x1 T
Sokoban.java
  1. package org.loon.game.simple.sokoban.control;  
    6 E& h5 k/ F* [# F/ B# ]& @
  2. import java.awt.Color;  / [7 G9 E+ n# l, ~; U6 N1 e7 e
  3. import java.awt.Font;  
    & j  y+ r+ j1 f" O( B/ F% f* K
  4. import java.awt.Graphics;  0 v+ ^. ~! _. ?& v, {0 x2 x& Z
  5. import java.awt.Image;  
    $ J/ y8 J. o6 `& P
  6. import java.awt.event.KeyEvent;  $ K9 d3 ~% b  `8 v. u& R& G9 m
  7. import org.loon.game.simple.sokoban.GraphicsUtils;  ) Y* Z- S% Q- A$ c# C
  8. import org.loon.game.simple.sokoban.LSystem;  ) t# Q# U2 U2 I( F; }, x0 H
  9. import org.loon.game.simple.sokoban.SimpleControl;  ; E  W+ g7 T; z( n
  10. /**
    6 {( H+ i/ G9 n
  11. * Copyright 2008 - 2009 + {& }& F6 I+ ~, ?4 V' G' h) g2 x
  12. *    P+ t+ P, K6 m9 W9 X2 x' `; x7 Q
  13. * Licensed under the Apache License, Version 2.0 (the "License"); you may not 2 m& N; I  L. T9 i3 F: v
  14. * use this file except in compliance with the License. You may obtain a copy of 9 R# U0 M5 z3 I' n
  15. * the License at 2 Y. Q" H  @# A7 F
  16. *  
    , y  E# v2 w6 o8 H* I% E! m5 V
  17. * [url]http://www.apache.org/licenses/LICENSE-2.0[/url]
    7 A9 R- f% F; p7 d& T2 @
  18. *  
    ! S" P) }, o0 H8 }9 @) q( C
  19. * Unless required by applicable law or agreed to in writing, software
    % z: P: q- F, ]  [( S; x
  20. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    - z3 l. [  u  z, _
  21. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    ) E0 n2 D+ F: C, r
  22. * License for the specific language governing permissions and limitations under
    ) h" g) f( G6 E2 x2 C$ ~
  23. * the License. 9 q9 D: ~: k  F6 ^4 @! M! l
  24. *  # f* ]; ^- l, a3 y) c
  25. * @project loonframework ; [' b- P. z6 p" {" c. Z$ d
  26. * @author chenpeng ' B/ Q6 P4 i$ N- F1 m; T- G
  27. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
    ( }  P% q) F" q5 b; [5 L( l% ~) B8 ^
  28. * @version 0.1
    9 E/ ]* i9 M9 P3 h2 k$ ], u
  29. */  * ?0 p# {( m9 u# J4 c
  30. public class Sokoban extends SimpleControl {  
    ; }' W9 ?1 G. k
  31.     /** 3 b5 K# C3 K) T3 m3 O
  32.      *  
    7 O/ {7 S* H1 t& |' O! s
  33.      */  - c( a- F! p/ [9 a- f
  34.     private static final long serialVersionUID = 1L;  
    ! ?0 ]% t1 O  `- o
  35.     private Image backImage = GraphicsUtils.loadImage("image/back1.jpg");  
      H; {& M" ^; Q! G* s7 p  j3 W
  36.     private Image screenImage;  0 T$ z, x+ x& I6 R7 O
  37.     // 墙壁图  
      N) G2 e7 C; M& o! L& e4 A
  38.     private Image floorImage[];  
    " K. ^. q5 Q8 l+ g. S% O% M/ K
  39.     // 角色精灵  
    9 v" ]7 G7 k( S# M
  40.     private RpgSprite sprite;  3 \7 f1 Z* H2 N8 o
  41.     // 窗体显示图  
    2 `* j& t( P/ C" {6 U, k
  42.     private Graphics screen;  
    4 o: N. a$ h* g% p/ S5 c
  43.     private String message = "按下 [Enter] 开始进行游戏";  
      K2 z+ N' P/ O; q' S" h
  44.     private String m_stageName[] = { "关卡1", "关卡2", "关卡3", "关卡4", "关卡5", "关卡6",  # L8 S: [9 B! d6 _" B; D
  45.             "关卡7" };  1 m+ K* v5 t5 {5 l6 G; S/ N
  46.     private int CS = 32;  
    * f* |/ \, {# ]. ?  W+ r
  47.     private int maxX, maxY, comps;  - n' S7 M8 {2 O1 T( k! T
  48.     private int stageNo;  
    ; {; \' a" b1 j0 l2 T
  49.     private boolean complete[];  
    : Y6 c6 R8 o) u+ @7 B+ j: X9 A
  50.     private boolean boxMove[][];  
    0 K- y3 G$ d5 J" U
  51.     private int hp[];  
    ' V* g, j5 D; H& f; s6 n
  52.     private int stageStates[][][];  8 n; _# u0 F% ?& D- c, _0 t
  53.     private int ons[][];  ' g" s9 E8 r& x; l
  54.     private int role[];  
    4 x& P6 X( N3 I% J4 T
  55.     private int rolex[];  $ w0 V: |3 D1 h; l- V0 V
  56.     private int roley[];  " _* c- D7 N. j, Q
  57.     private int mapx[];  
    2 P! d% D0 m5 _, U$ ^: R% \
  58.     private int mapy[];    j  }/ g) p' L9 Y* `" g! }
  59.     private int sleep = 0;  # c7 Z- c5 M8 ]; X" e. k5 i
  60.     private boolean succeed = false;  
    * M' v; z, W5 G/ `5 H
  61.     private Stage stage;  
    8 L* ~. |9 v0 p7 e
  62.     public Sokoban(Stage stage) {  
    5 b, q( Q9 ~) Y7 Y
  63.         this.stage = stage;  + X7 q( k, Y7 F! L& g
  64.         this.floorImage = new Image[4];  0 k$ s9 ?6 O9 [6 I2 {, O" o
  65.         this.sprite = new RpgSprite("image/role1.gif");  * W) p9 Q( }0 x" W7 \
  66.         this.maxX = 16;  5 b  |1 Z7 |5 e5 W
  67.         this.maxY = 13;  ! q: |5 ~# r/ v2 l+ Q+ g
  68.         this.comps = 0;  / ?9 a  `: U( s+ I& b7 M% V
  69.         this.complete = new boolean[stage.getMaxStageNo()];  
    4 M! y. j" I5 b8 r) k6 G) C) \
  70.         this.boxMove = new boolean[stage.getMaxStageNo()][1500];  + |2 X$ |$ b$ P$ B( |
  71.         this.ons = new int[stage.getMaxStageNo()][1500];  
    : e2 ^4 d) m" v1 Y" @
  72.         this.hp = new int[stage.getMaxStageNo()];  
    ; Q4 j( d, f0 f$ }$ p3 e. d; x
  73.         this.stageStates = new int[stage.getMaxStageNo()][maxY][maxX];  
    ! m/ |$ y' ]  I" O! c% B
  74.         this.role = new int[stage.getMaxStageNo()];  / |) F) P( [  @. `6 ^- A
  75.         this.rolex = new int[stage.getMaxStageNo()];  
    * M/ c! Q' b. y# r
  76.         this.roley = new int[stage.getMaxStageNo()];  
    1 Y. P+ u6 C; ?4 q5 t8 s* T
  77.         this.mapx = new int[stage.getMaxStageNo()];  
    # q# y: ?4 x- C9 j0 E1 c1 G
  78.         this.mapy = new int[stage.getMaxStageNo()];  3 h- W. Q. f8 C# T3 d1 b$ j
  79.         for (int j = 0; j < 4; j++) {  
    3 O+ X5 X5 }9 q) p" o
  80.             floorImage[j] = GraphicsUtils.loadImage("image/back" + (j + 1)  
    9 x! ]* U0 \, ?& K7 H! x$ n8 p
  81.                     + ".gif");  
    % w/ |$ H: i2 l/ y# g
  82.         }  
    ( u* J& e( I8 p' ?
  83.         this.screenImage = GraphicsUtils.createImage(CS * maxX + CS, CS  # u4 }7 w, E) K5 d4 g6 B" V
  84.                 * (maxY + 1) + 32, true);  5 ~: h6 `; u6 ^, I
  85.         this.screen = screenImage.getGraphics();  
    : v8 B/ O* s* j7 |! B, N$ O6 F
  86.         for (stageNo = 0; stageNo < stage.getMaxStageNo(); stageNo++) {  4 l2 ^, Z0 c" [4 S; c7 P
  87.             this.setupStage();  $ {! B3 C9 o' d3 v7 {" f) K; w
  88.         }  
    % ]0 c, [8 R* f. S
  89.         this.stageNo = -1;  
    ! Z2 T& O( j& G/ u* b
  90.         // 开场界面  
    ! ]+ Y0 W6 ^) T4 ^% f; }$ a
  91.         this.openDraw();  . y* |! \! [. [+ t2 S, G4 R
  92.     }  $ Z, M; m, L- `
  93.     /** . S5 b9 t6 _. ]( |& e1 u
  94.      * 刷新关卡
    3 k5 r2 s! z7 K/ b
  95.      *  
    9 h" s. n% h- W# S
  96.      */  # N, n% j; @0 i6 z  w7 l
  97.     public synchronized void reset(int stageNo) {  
    & r: j! e, o7 H
  98.         this.stageNo = stageNo;  
    8 a: ~5 ?/ b7 P5 T( G& t! o
  99.         this.stage.getMode()[stageNo] = 1;  . _) O# {' Y3 |' `
  100.         this.message = null;  
    4 ~& B/ p' r/ B7 ]5 Q8 O
  101.         // 设定关卡  ! r7 A# ^9 H0 q; g
  102.         this.setupStage();  : {, @# M; \( K1 p% J2 y
  103.         // 重绘背景  ! R% }2 B& J0 N) _9 k
  104.         this.background();    ~( o4 \/ g+ ?6 V  {1 g
  105.         // 重绘游戏屏幕  4 a/ [- L. n4 q( V, m9 G! K/ i$ g
  106.         this.drawScreen();  , A8 d: C* C7 ?+ ]5 p4 L
  107.     }  
      j+ E) v9 l; e# q5 q( W# T
  108.     /** 9 }- p, b% K5 ^. B
  109.      * 绘制屏幕背景 , e' e- r% o/ L9 c% r" ~+ i
  110.      *  % \% V- \& n  K. l
  111.      */  
    ' ^3 J" v* m6 y1 {
  112.     public synchronized void background() {  
    ) z/ \# O' w7 o! z$ A% _0 q
  113.         screen.drawImage(backImage, 0, 0, null);  
    + m2 f/ j' v, B9 e0 Z
  114.         screen.setColor(Color.black);  
    * K& w8 B7 b7 B! ^4 s* L7 s4 W
  115.         screen.fillRect(0, LSystem.HEIGHT - 40, LSystem.WIDTH, 40);  ; V' @6 }  m( H4 y
  116.     }  3 G# M  \- G' F$ ^
  117.     /** + H7 v& A% v' I+ W% }) b- ]1 {
  118.      * 绘制屏幕图像
    ; H* P/ G1 Q, d6 X8 I+ f
  119.      *  0 M! x5 x9 A, r0 ^
  120.      */  
    ; ^- M7 p  J/ M) w# D
  121.     public synchronized void drawScreen() {  8 W* ~' \* R2 U
  122.         if (stageNo >= stage.getMaxStageNo()) {  
    ' M: d0 y" c; Y6 Z" G
  123.             stageNo = 0;  
    $ s/ g1 M! ]+ t! t" R7 g
  124.         }  
    8 i$ E9 n  m" X6 R
  125.         for (int i = 0; i < mapy[stageNo]; i++) {  - \$ p. n+ T; {! u5 n3 d& M
  126.             for (int j = 0; j < mapx[stageNo];) {  4 {# i& x: d, h! U5 u2 X
  127.                 switch (stageStates[stageNo][i][j]) {  8 T4 [5 e' s% J! t3 U9 m' A2 s
  128.                 case 2:  5 k+ C* }; E8 ~; X6 R* X
  129.                 case 3:  6 _' d& g- L. B5 F: q( ~- |
  130.                 case 4:  
      y# q: M9 i+ Z/ o5 n2 m$ H
  131.                 case 5:  ' a. w5 w/ d; H2 Q3 y, @# `. J: z
  132.                     screen.drawImage(floorImage[1], moveX(j), moveY(i), null);  
    0 A; @7 s% N. E  b" J8 h# c0 R
  133.                 default:  
    / X. y1 q2 g' z/ x
  134.                     j++;  
    $ w& e& o/ b5 T' {
  135.                     break;  
    # F* _) f5 T& u3 H% n
  136.                 }  
      o0 ?8 S$ n0 Y6 v" E* r. K
  137.             }  $ @! R7 T4 F7 t( d
  138.         }  0 E5 ]$ a4 o( W3 \, E
  139.         for (int n = 0; n < mapy[stageNo]; n++) {  1 Q( y& D+ I& x$ b; |1 S+ F
  140.             for (int l = 0; l < mapx[stageNo]; l++)  , M; O4 I/ L/ ]' K
  141.                 switch (stageStates[stageNo][n][l]) {  
    3 M/ V; n' [1 x5 X
  142.                 case 1:  1 [1 ?: R  [& r; e2 L
  143.                     screen.drawImage(floorImage[0], moveX(l), moveY(n), null);  / U0 S5 U4 m' K$ d4 v; U7 y
  144.                     screen.setColor(new Color(32, 0, 0));  ( b+ Q  }+ W2 D9 ~) h6 k0 b" O
  145.                     screen.drawLine(moveX(l), moveY(n + 1), moveX(l) + CS - 1,  8 k! r" j0 c, k5 D! n# r3 E
  146.                             moveY(n + 1));  0 ~+ v8 I5 I8 c
  147.                     if (l == 0 || l > 0 && stageStates[stageNo][n][l - 1] != 1) {  
    / g  X9 F2 y( z# E. M
  148.                         screen.setColor(new Color(160, 128, 96));  
    % [, @8 A! g3 @% j6 e# J
  149.                         screen.drawLine(moveX(l), moveY(n) + 1, moveX(l),  * @  Z5 s$ O1 f% H0 ^( H
  150.                                 moveY(n) + CS - 2);  3 T- w0 K" e% R5 s, ~* M/ W
  151.                     }  1 {& i) l' w. }- C! b. K5 k, c
  152.                     if (l == mapx[stageNo] - 1 || l < mapx[stageNo] - 1  7 Z2 I4 J, C' y0 a
  153.                             && stageStates[stageNo][n][l + 1] != 1) {  
    8 h/ I- G9 i6 [1 o! P0 |
  154.                         screen.setColor(new Color(72, 64, 64));  3 i0 `$ q6 T) o0 i& a
  155.                         screen.drawLine(moveX(l) + CS - 1, moveY(n), moveX(l)  
    . @0 T- n4 }9 ~) z4 d% N7 m6 Y
  156.                                 + CS - 1, moveY(n) + CS - 2);  5 K5 ?2 V7 C9 \" S' j7 ]8 F
  157.                     }  " U0 k; v, D, j6 c% `
  158.                     break;  
    5 _9 {$ N4 a* S6 @& B
  159.                 case 2:  
    * M. ]% M/ y( g7 C4 W. w4 C
  160.                 case 3:  
    # q( n* u$ {$ o; t) B% e: Z
  161.                 case 4:  0 k6 T2 Q- e/ l, f
  162.                     switch (stageStates[stageNo][n][l]) {  # ]3 S: t, R) O! C# j- H7 v
  163.                     default:  
    5 f: D- ~  w6 a5 G9 A, C; h2 h8 n
  164.                         break;  
    4 d6 G* \8 p3 ?$ s
  165.                     case 2:  
      t8 m: K( L- H
  166.                     case 3:  
    ) i8 M% |. v+ w! z
  167.                         screen.drawImage(floorImage[3], moveX(l), moveY(n),  2 L. B1 q$ U3 {; M7 U5 W7 |
  168.                                 null);  8 l. B" c, ]; x$ q) ?
  169.                         break;  3 c/ Q+ r5 [1 B" q! k( E8 O1 U
  170.                     case 4:  
    4 P% z9 E/ j) S: J# ^$ C
  171.                         break;  1 o6 |/ y/ F5 A# P$ B- }3 @2 ?
  172.                     }  
    5 g0 M! I* Z/ }0 n
  173.                     if (stageStates[stageNo][n][l] != 3)  ) [+ R" @- y# `: W; P2 s
  174.                         screen.drawImage(floorImage[2], moveX(l), moveY(n),  
    4 P3 |9 ?1 E0 T' ^7 `+ J2 c
  175.                                 null);  
    , O; ]# c% Q" F& `
  176.                     break;  
      W; k; Z' Q8 o4 ]' o5 v3 J
  177.                 default:  
    7 h, b7 l& O6 L# x. m) w  s  B/ b
  178.                     break;  8 j  f$ W/ [' A4 r' v
  179.                 }  
    ) L, g9 W9 l7 I: d2 ]
  180.         }  ; i  K# G4 |& U) l, S) ^
  181.         // System.out.println(role[stageNo]);  
    8 S& C* I. h- a; `7 b4 J
  182.         screen.drawImage(sprite.getOnlyMove(role[stageNo]),  
    " w1 d, u7 s1 X; i3 N+ x; i
  183.                 moveX(rolex[stageNo]), moveY(roley[stageNo]), null);  4 `8 N+ H6 M- i8 s) _( N
  184.         if (stageStates[stageNo][roley[stageNo]][rolex[stageNo]] == 4) {  . K6 g& s( x5 ?% C% L) T: D4 h
  185.             screen.drawImage(floorImage[2], moveX(rolex[stageNo]),  
    ) e% g/ W8 z$ J' a) c) L
  186.                     moveY(roley[stageNo]), null);    F+ u( i- P7 c7 v/ d# w5 b
  187.         }  5 d1 J# l; Q: d$ N
  188.         setupDisplay();  
    , z/ g+ y% V9 }% c! e
  189.     }  
    . N6 i0 ~" t8 F  Y* P& h8 U
  190.     /**
    . }  B5 K. t* Q; p1 q  B
  191.      * 定位到实际的X座标
    2 p5 G# S8 \- Z! C" O1 z2 K
  192.      *  3 ~  N6 a% M+ i
  193.      * @param i ; x7 e; |0 J$ t8 F9 i
  194.      * @return
    7 W1 ^7 i7 \; P% Q/ g# l- }" ]
  195.      */  7 |5 }9 S6 O4 d3 `, G2 p
  196.     public int moveX(int i) {  + t0 \/ N+ X) L* b/ f
  197.         return (CS * ((maxX - mapx[stageNo]) + 1)) / 2 + CS * i;  ) e2 i# V' x7 ?: @* \
  198.     }  
    & w& @' H( ^% v" J% h
  199.     /** . ~1 Z' H7 I  _5 l
  200.      * 定位到实际的Y座标 1 H1 C  {# |8 j  V: b" W2 K
  201.      *  
    ) |/ p3 l5 n8 t, U. X; y
  202.      * @param i
    * e) q1 k' P' v/ Z" E
  203.      * @return
    $ m$ y/ U: k2 E2 a+ \
  204.      */  ! g0 o. D) U: E! _9 ]
  205.     public int moveY(int i) {  
    . C% _: t! [2 A- P4 C
  206.         return (CS * ((maxY - mapy[stageNo]) + 1)) / 2 + CS * i;  
    7 t# b$ ~: e' U  M
  207.     }  
    7 T! y0 @0 g: G" r  {6 k
  208.     /**
    8 q. ]( v1 j$ @  l: c
  209.      * 执行操作
    ! e& _! ^) ^8 V/ W  y0 J: n
  210.      *  / j- S+ V  X" l* C' l' |$ S7 _& Z+ D
  211.      */  
    * T4 v0 M* Q8 D' T
  212.     public synchronized void execute() {  2 Q# e5 M# R4 O9 [  \  b5 n
  213.         boolean flag = true;  7 Y& d- _% k) r8 y# I* G" h: t
  214.         for (int i = 0; i < mapy[stageNo]; i++) {  $ N/ g. |, F, d% C8 N: u
  215.             for (int j = 0; j < mapx[stageNo]; j++) {    u; @; ~/ L- Q- H; R- C
  216.                 if (stageStates[stageNo][i][j] == 4) {  
    7 c9 ]. Q; o  @
  217.                     flag = false;  
    1 I9 a- T) K6 x. {  R2 ]8 o# ^
  218.                 }  6 c5 C, v5 L+ Y. a; f7 D3 P
  219.             }  
    3 ]" T; M' z& g* A8 ^3 w
  220.         }  
    . `+ Q+ _) f. E1 t; \: t
  221.         if (flag) {  7 C& P/ a! Q  R1 u7 b1 E
  222.             stage.getMode()[stageNo] = 3;  
    - p9 n# s" D% e$ ~( s
  223.             complete[stageNo] = true;  
    : `" Z' r  h" Z
  224.         } else if (hp[stageNo] == 0) {  
    " e; Q8 e2 _+ C
  225.             stage.getMode()[stageNo] = 2;  
    0 u* x5 h7 p: V! ^
  226.         }  3 f8 Y, v6 y4 f
  227.         comps = 0;  
    ; B& V9 S) H, V2 n
  228.         for (int n = 0; n < stage.getMaxStageNo(); n++) {  
    - i' g2 {9 L+ X! k/ e$ ~7 k1 [( w$ }/ T
  229.             if (complete[n]) {  & o- i0 F! G* r
  230.                 comps++;  
    0 x  I# @+ t: c2 @
  231.             }  ) {3 b. o0 H2 F
  232.         }  / Y+ m! C8 _& g4 Y' \$ t8 Y
  233.     }  
    ( R- v) r) U0 d- E9 `3 O: ?
  234.     /** + X' Y9 P( Q* y; v  W+ S, w
  235.      * 键盘事件处理 7 N% M: H. R! @1 k
  236.      */  
    : d5 p) L/ O# u  {) ]9 n
  237.     public void keyPressed(KeyEvent e) {  
    6 H* U+ S+ q9 P6 E5 ?  {
  238.         if (e.getKeyCode() == 10 && stageNo == -1) {  
    : k, R" f  V7 ^9 Z
  239.             // 开始关卡1  
    / F9 H6 |2 j& W$ r# ]' X5 J
  240.             reset(0);  
    ! }0 U$ W+ _0 C" z& K' `3 u
  241.         } else if (stageNo < 0) {  $ s; m  K3 o6 y! {
  242.             return;  9 v* f$ R) y( {6 G1 w) w: Y5 W3 s
  243.         }  # R6 ~/ s# w8 ^' t: [6 {$ K: t
  244.         // 选关(默认为最大支持7关,更多请自行设定)  
    ( _2 i1 v( O6 i' r8 U
  245.         if (e.getKeyCode() == 97 || e.getKeyCode() == 49) {  # _* S) E9 J( i# R, Z1 @! L
  246.             stageNo = 0;  
    ; M7 j2 M8 q5 R# l8 K
  247.         } else if (e.getKeyCode() == 98 || e.getKeyCode() == 50) {  ) ^* i; E+ r% l8 {' B
  248.             stageNo = 1;  + m' `' T8 N' |% k' |% Z2 Z0 Q
  249.         } else if (e.getKeyCode() == 99 || e.getKeyCode() == 51) {  
    2 V, r, T3 T0 H, ]; o0 y# O
  250.             stageNo = 2;  - p  j( Z; X% b+ x  x
  251.         } else if (e.getKeyCode() == 100 || e.getKeyCode() == 52) {  $ b( f( K3 W; |! E( `
  252.             stageNo = 3;  ) p) A/ e, O0 a. I6 C
  253.         } else if (e.getKeyCode() == 101 || e.getKeyCode() == 53) {  4 w8 I8 J1 L  {& n6 `
  254.             stageNo = 4;  
    ) q7 U+ s: @( G8 y+ K6 s" Y
  255.         } else if (e.getKeyCode() == 102 || e.getKeyCode() == 54) {  
    4 b! K& {  q' k% v5 F# ]
  256.             stageNo = 5;  
    ; {' H7 m- e' b3 H) G' Q3 x
  257.         } else if (e.getKeyCode() == 103 || e.getKeyCode() == 55) {  
    6 t2 M7 m; i) a, _+ q5 M
  258.             stageNo = 6;  
    9 l* S0 J# V  G; L
  259.             // ESC,重新开始  & _' q7 k' X( D
  260.         } else if (e.getKeyCode() == 27) {  ' d# h+ N* d% c: d
  261.             reset(stageNo);  
    + h7 G4 z, @# Y
  262.         } else if (stage.getMode()[stageNo] == 1) {  , p- d+ y* P3 L- n
  263.             // 退步  " A6 w  V2 P) Y2 s
  264.             if (e.getKeyCode() == 83) {  
    . C5 N1 x/ X5 O
  265.                 nextStep(-1);  
      f6 z5 N1 H" r
  266.             }  
    0 w5 D' T5 Z' t2 k0 R+ X* h' m7 I
  267.             // 移动角色  $ P! s7 C2 M$ X( A4 K) B9 f5 \( M! j( f4 E
  268.             else if (e.getKeyCode() == 40) {  6 W. l2 ?% z. r
  269.                 nextStep(0);  , ^0 L# g; \$ G0 {
  270.             } else if (e.getKeyCode() == 37) {  
      e/ b0 y% w8 w5 Y+ T' m
  271.                 nextStep(1);  , u3 {( m2 D6 X* W( }+ _8 E
  272.             } else if (e.getKeyCode() == 39) {  
    ' c1 u0 N8 B& }* r4 I1 n" @
  273.                 nextStep(2);  
    % E( x  E0 s/ g0 t
  274.             } else if (e.getKeyCode() == 38) {  5 @) [/ G4 _6 A& R
  275.                 nextStep(3);  
    / x5 |9 _( R/ L4 {0 E0 T3 [
  276.             } else {  ! P# |; ^, r- Z+ [, q  w9 y, ~
  277.                 return;  0 Q6 S) j& R* Y: X/ @: V  }
  278.             }  
      s' h3 j( g$ l6 @4 ^7 s0 M
  279.         } else {  
    ' {; X, F  U+ P/ V) v
  280.             return;  
    4 F3 y$ L+ }& g  v# O; k) L$ R2 V
  281.         }    t9 e& L: M! k8 @( R3 N; c4 w
  282.         // 绘制背景  
    6 J$ ~/ i" ~& R! K; r- K+ O
  283.         background();  : y+ \( v6 c1 W4 U
  284.         // 绘制游戏画面  
    0 |8 [! Z/ ~+ u5 ?+ O
  285.         drawScreen();  9 z2 I9 C. T( z, N
  286.     }  ! b$ w* F' P' F- p" C/ P
  287.     /** 4 w2 [  v+ x3 J6 m0 a
  288.      * 切换动作 : W3 \, t1 x+ c, E
  289.      *  , @& R* z! _4 w7 o
  290.      * @param i - A" V, W$ y# {
  291.      */  
    1 m# v' [! o2 }& U" Q
  292.     public synchronized void nextStep(final int i) {  & M# D# [) _# z
  293.         boxMove[stageNo][hp[stageNo] - 1] = false;  
    & F% e2 V1 A- [0 r
  294.         switch (i) {  1 C" H7 G$ a! R" b9 n8 |6 e1 P
  295.         case 0:  $ i2 O( t( m/ a7 s- h' I
  296.             if (stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] < 2) {  7 B& z' C- p4 @# ~' n+ q
  297.                 return;  
    * n: q3 G! y# o; Z
  298.             }  ( u2 z* \1 X# b8 a9 m* d! Y' G
  299.             if (stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] < 4) {  
    % y* d! T2 q. E. k/ b
  300.                 if (stageStates[stageNo][roley[stageNo] + 2][rolex[stageNo]] < 4) {  
    # g2 Q# O' s( ?0 B) z
  301.                     return;  
    ' M# F& }6 Q+ s- C
  302.                 }  
    5 m! I2 R7 J' H( O, t4 r
  303.                 stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] += 2;  " J& o5 I4 o  n; b  V) G9 F4 ]+ P
  304.                 stageStates[stageNo][roley[stageNo] + 2][rolex[stageNo]] -= 2;  ; w, {, i; ^$ D7 U8 ^- _
  305.                 boxMove[stageNo][hp[stageNo] - 1] = true;  
    5 c4 {* j4 g3 z& s6 c# i- Y4 t
  306.             }  
    0 D) @+ U8 k0 g9 h" H* q
  307.             roley[stageNo]++;  
    - t/ q. B2 c* P2 \% z3 J9 F% B3 Z
  308.             break;  
    0 Q" M- O8 E) n% a( B
  309.         case 1:  
    / W  _# [1 g% }8 C9 Q3 b) i3 c
  310.             if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] < 2) {  0 ?3 v& K! N7 M/ A& r) Q  K
  311.                 return;  
    9 V8 Q1 z; \+ N6 G
  312.             }  
    : Q/ m  `6 ?" d  _
  313.             if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] < 4) {  8 ~$ t) O7 p" \1 W  j0 m4 R8 O7 B6 z
  314.                 if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 2] < 4) {  9 v4 ^5 P3 ~: h9 w. k2 _- k
  315.                     return;  8 ~# l. r: a$ h/ `
  316.                 }  
    : Z9 ^( ~0 f1 W
  317.                 stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] += 2;  6 ]' A+ M) z3 H# z
  318.                 stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 2] -= 2;  
    9 n5 N0 f4 x) `" S
  319.                 boxMove[stageNo][hp[stageNo] - 1] = true;  9 @) y* d8 P; _2 d# v7 f
  320.             }  
    ) E! e  [0 M) n1 n; ]
  321.             rolex[stageNo]--;  
    . O9 h: r# w' b) _% P' U7 z
  322.             break;  
    8 e& J/ c' O. x( t
  323.         case 2:  0 b8 f, Y# [! _/ J6 d
  324.             if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] < 2) {  
    , @% F( M: c& |
  325.                 return;  
    2 b$ c! L$ r/ B
  326.             }  8 a0 z. s) y$ X( ~& N
  327.             if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] < 4) {  2 |* C5 x9 K# B
  328.                 if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 2] < 4) {    e2 Y  f) l! k& X
  329.                     return;  . h$ R2 n2 b3 m8 c" \
  330.                 }  
    2 j9 \1 _1 x4 ?2 Y( B! b
  331.                 stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] += 2;  " e  j9 ]; d( O9 x$ E
  332.                 stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 2] -= 2;  # C) X. ?: z2 E# `8 _
  333.                 boxMove[stageNo][hp[stageNo] - 1] = true;  5 J& k, t! O7 G0 `" p
  334.             }  : y% D; O; A; _* A3 W
  335.             rolex[stageNo]++;  + h3 H# {. d: u
  336.             break;  
    5 z/ v: [* b2 w6 ]' l2 {
  337.         case 3:  
    ! r6 u2 ?/ ^% [8 `: x6 A% R8 U
  338.             if (stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] < 2) {  2 k- c9 E( M" p7 @2 v. g
  339.                 return;  
    * B4 S) ~+ Q4 f- l
  340.             }  ; X! ^, D- X! }+ S7 F( Y
  341.             if (stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] < 4) {  - F& {; f6 [8 j! N, S' y
  342.                 if (stageStates[stageNo][roley[stageNo] - 2][rolex[stageNo]] < 4) {  
    & m% _$ F$ _" u5 ^
  343.                     return;  4 j1 m2 r1 p8 s$ c- r% D1 T
  344.                 }  
    8 r' \" K' Q% j* I
  345.                 stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] += 2;  
      P; `1 I* w, c1 _
  346.                 stageStates[stageNo][roley[stageNo] - 2][rolex[stageNo]] -= 2;  , S- V" X) p: N% c9 Y( G, v9 w
  347.                 boxMove[stageNo][hp[stageNo] - 1] = true;  . V; ]' m' P, F, r
  348.             }  
    5 m* o8 ]8 p- X9 R; U: ?
  349.             roley[stageNo]--;  0 \% i0 \/ m$ H! m, @: r
  350.             break;  ( x0 Q" t6 K  y0 X& w" z  Z2 z
  351.         default:  ' `3 b  R1 J% w% I' b8 R
  352.             if (hp[stageNo] == stage.getMaxHp()[stageNo]) {  0 h4 H7 ?6 r' a! K  ]
  353.                 return;  0 t& I! n7 \9 \! r8 [: v! N
  354.             }  
    . h! Q: n2 `- O( R8 Z+ L* S
  355.             switch (ons[stageNo][hp[stageNo]]) {  
    ' y9 J7 X2 N/ Y9 B: Q& J; B
  356.             case 0:  . y% d) I2 K7 g8 G# v6 i7 Q
  357.                 if (boxMove[stageNo][hp[stageNo]]) {  & F, K  s; `' U1 x: I& b- J  v
  358.                     stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] += 2;  / C: T3 ?8 x& f8 n% m
  359.                     stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2;  
    1 W/ u, C: s$ Y) A/ ]; z$ a7 g' M
  360.                 }  
    ) Z: q+ M3 f. @: X6 V+ j
  361.                 roley[stageNo]--;  - O/ v8 [9 j/ y9 u  J
  362.                 break;  ! S2 p# s" e; t
  363.             case 1:  6 [( R! T( l  C2 p7 o
  364.                 if (boxMove[stageNo][hp[stageNo]]) {  * P. [. b7 e2 d6 m6 W9 t
  365.                     stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] += 2;  
    + }6 t/ D; w5 s/ {2 l: C- |
  366.                     stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2;  
    % `8 [- h9 ?6 U; ?4 G( X9 ^, C
  367.                 }  $ E: U4 d1 R/ }, e# K6 ?
  368.                 rolex[stageNo]++;  
      w! }# s0 ?6 r" K3 V! S
  369.                 break;  
    7 y& E5 ]) {$ r' o* a
  370.             case 2:  
    # f" _4 e9 }& {( q. C
  371.                 if (boxMove[stageNo][hp[stageNo]]) {  7 c$ M3 f4 [3 [1 E/ k/ r+ v! K
  372.                     stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] += 2;  & n. i% v, r1 R2 z, s
  373.                     stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2;  9 Z5 J4 \* M8 G/ V3 @/ g
  374.                 }  
    : l. n/ s% K8 M: W
  375.                 rolex[stageNo]--;  
    / z( S" e5 ?' f& c$ m3 G
  376.                 break;  
    1 Q7 i) N$ n1 T( j3 a( e' Q
  377.             default:  ; Z) X5 D% J' o; ?$ k
  378.                 if (boxMove[stageNo][hp[stageNo]]) {  & C: D0 H! P) B# V
  379.                     stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] += 2;  
    9 l1 J( U) |+ v0 W
  380.                     stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2;  
    $ y+ c" C( }; u
  381.                 }  % e- }+ l# L9 `2 L5 ]' A% I9 F- A
  382.                 roley[stageNo]++;  , y" U7 m* I" ?  H9 N4 D
  383.                 break;  7 m& [9 a) ~! |/ x" X% \- I
  384.             }  8 J; ]" U* ?2 i6 J
  385.             break;  
    : r; _( |+ C7 o) {; U
  386.         }  
    $ C/ c, B4 S2 Q, }; Q9 a
  387.         if (i != -1) {  * D( O! e% O) |
  388.             hp[stageNo]--;  + `0 [) j3 T7 O8 j% C9 ~4 b
  389.             ons[stageNo][hp[stageNo]] = i;  
    1 D* d. e' ~+ E! y4 I9 F
  390.         }  8 c  j* S$ q9 G" O% D/ H
  391.         role[stageNo] = ons[stageNo][hp[stageNo]];  9 T- P$ q5 ^% L4 T. }6 F
  392.         if (i == -1) {  * f# w) C% k( J* k* O
  393.             hp[stageNo]++;  % q4 d% ]  ]. G
  394.         }  , g' \7 u% B9 `* }. `
  395.         execute();  
    2 h- K" R6 w: t+ c+ j' v$ B9 Y3 y
  396.     }  # I9 j) N( v9 g! D+ r( O8 l
  397.     /**
    $ h8 Q8 t. y$ \1 m# ~5 b6 U+ x' x: D0 J
  398.      * 开场画面 & a4 _6 ]& U' {
  399.      *  4 D6 q6 d9 m; G
  400.      */  
    / Y+ m+ j; W- Z! j
  401.     public synchronized void openDraw() {  
    1 d2 N! ~; z' I8 J5 t& ]% p: B7 w0 K5 s6 M" S
  402.         background();  
    0 e9 y7 H( u* A9 P7 g  I
  403.         for (int i = 0; i < 5; i++) {  
    " `1 i6 i* t5 J# [0 p) t. B
  404.             for (int j = 0; j < maxX + 1; j++) {  
    + ]2 k0 [. Q0 m! W" y5 V  R
  405.                 screen.drawImage(floorImage[0], CS * j,  
    0 {# S/ [/ p7 _! [4 a/ ?
  406.                         (CS * i + CS / 2 * maxY) - CS * 2, null);  ( W8 x$ g2 @( O
  407.             }  
    5 w* T, @+ J5 p, l) \: j# i2 {
  408.         }  # @8 f" j/ a! ^  r
  409.         GraphicsUtils.setAntialias(screen, true);  
    $ G' k1 {6 \$ x- r5 U: n
  410.         String mes = "怪蜀黍传说 - 勇者推魔王";  1 K& T: H$ s4 b/ K+ ~) x
  411.         screen.setFont(new Font("华文新魏", 1, 35));  
    ; M/ d; B& Y* B% u
  412.         GraphicsUtils.drawStyleString(screen, mes, (CS * maxX - screen  2 E" Y" ]* g8 i$ `' g
  413.                 .getFontMetrics().stringWidth(mes)) / 2 + 13,  6 O% z: f* w. H  H
  414.                 (CS * maxY) / 2 + 25, Color.black, Color.orange);  4 G. u, E7 u# N; V& T: w
  415.         mes = "Java版搬箱子游戏开发入门示例 - 0.1.0";  
    % `5 O; N; Q" X  }
  416.         screen.setFont(new Font("华文新魏", 0, 30));  , [% e& n: u2 Y, N( |2 {  H  i8 y
  417.         GraphicsUtils.drawStyleString(screen, mes, (CS * maxX - screen  % y$ \5 h5 I3 R4 r2 ?6 V; |
  418.                 .getFontMetrics().stringWidth(mes)) / 2 + 13,  , y. p2 F4 K9 ^: j8 `4 _
  419.                 (CS * (maxY + 2)) / 2 - 55, Color.black, Color.white);  
    , [3 h6 i& ^( X% M+ p
  420.         GraphicsUtils.setAntialias(screen, false);  9 E% o1 o! a' B, L  d7 ~
  421.         setupDisplay();  . a0 {: }. w- y
  422.     }  ; ^5 [" x6 K9 K$ K' C
  423.     /** 0 p* [; m' [  \4 u/ h1 _8 b
  424.      * 绘图接口实现 , c3 L5 H  H2 P2 _' M3 @, W
  425.      */  ! s3 l: P& I% x
  426.     public synchronized void draw(Graphics g) {  4 e8 D9 |7 w7 \* e# k
  427.         g.drawImage(screenImage, 0, 0, null);  . T" _2 y+ L$ P0 ?2 T- g+ V4 n" g/ d
  428.         if (succeed) {  
    7 F! ~* m6 h+ `+ X/ q
  429.             if (sleep == 100) {  8 \5 [* @9 w; k4 f9 J
  430.                 // 进入下一关  
    1 L1 l. _% F0 _! @
  431.                 reset(++stageNo);  
    . d, W1 k/ R5 V2 ^
  432.                 succeed = false;  ; y9 f/ i& Q( A: [. B
  433.                 sleep = 0;  
    ' Y# ], \- u1 C' }, n4 |' n- s
  434.             }  * m( T1 d% }  j! T1 J
  435.             sleep++;  % X  }5 L1 D/ A& X
  436.         }  3 h9 ^3 D# l5 O. T4 J
  437.     }  ( i: Z+ R$ M! a# `9 y1 t$ `4 b
  438.     /** - ?/ }* c1 T4 ^1 b4 N5 H
  439.      * 设置基本数据 6 `+ w9 a6 g# l8 [4 d1 f
  440.      *  9 r! O( }+ Q$ k  j' w
  441.      */  4 @# r( Y' f) a3 O! J* i; |' t  E
  442.     public void setupStage() {  * r* w4 ~% k/ ]6 N+ W" V+ c7 C( S
  443.         for (int i = 0; i < maxY; i++) {  
    ( U" n( \6 \' }
  444.             for (int j = 0; j < maxX; j++) {  
    3 e# @" }, g' Z! l
  445.                 stageStates[stageNo][i][j] = 0;  
    . }' ~; N" j0 z& s3 E) O7 A
  446.             }  & V% q% ?* M& B  L3 i' l9 G
  447.         }  
    1 }6 p  q4 E; n% `" W
  448.         mapx[stageNo] = stage.getConf()[stageNo][0];  
    " E2 t. X( d2 |' t" j( T8 r
  449.         mapy[stageNo] = stage.getConf()[stageNo][1];  ) R, H4 o, s- ?7 j3 D/ \
  450.         rolex[stageNo] = stage.getConf()[stageNo][2];  2 E, g1 d, }8 N+ N4 P  K1 G( E
  451.         roley[stageNo] = stage.getConf()[stageNo][3];  " y/ V3 k/ s1 p# {( z7 Y* W
  452.         for (int n = 0; n < mapy[stageNo]; n++) {  
    ( ]- V- J# P2 ~3 a! {' m
  453.             for (int l = 0; l < mapx[stageNo]; l++) {  
    . J, T% A% s  z+ F3 j4 k  w
  454.                 stageStates[stageNo][n][l] = stage.getMapData()[stageNo][n][l];  
    ; r$ d- M5 `0 Q1 y
  455.             }  1 t+ a& l0 N: F0 d; S% N
  456.         }  8 }, r7 f2 g9 p) ?% T
  457.         hp[stageNo] = stage.getMaxHp()[stageNo];  
    # |4 @) I: K/ a" _8 e
  458.         role[stageNo] = 0;  
    9 ^. ?- B# t! k$ Q' i( x3 o
  459.         for (int i1 = 0; i1 < stage.getMaxHp()[stageNo]; i1++) {  ) G% [8 y1 `) p) ?5 j( P" b7 x
  460.             ons[stageNo][i1] = 0;  
    " M( A/ G/ S6 M) C% o
  461.         }  
    2 s; J' L( S( i, T
  462.         for (int j1 = 0; j1 < stage.getMaxHp()[stageNo]; j1++) {  
      `4 |2 q8 X, D" o5 A( K
  463.             boxMove[stageNo][j1] = false;  1 k# Y( I& r% m6 Z7 q7 X& M
  464.         }  
    7 Y0 O/ m) C! Z2 G7 L* o  q5 S8 i2 p
  465.     }  5 x6 a! \% ]1 ]! i+ Q
  466.     /** , D' r2 y8 [! Q, C/ O
  467.      * 设置显示 & Q8 o6 n) U& c$ @. k) W
  468.      *  
    ( J! g4 Z' l! j8 D4 u- l4 O% J
  469.      */  
    7 [( Q; P+ H1 c* I
  470.     public void setupDisplay() {  
    ; a5 a* D) x- P4 x/ s
  471.         if (message == null) {  
      T0 }3 x# N4 |- O$ i, f( g
  472.             screen.setFont(new Font(LSystem.FONT, 0, 12));  
    6 r5 m" b. u; D
  473.             int size = 0;  9 a+ p  n' s* m+ x
  474.             for (int j = 0; j < stage.getMaxStageNo(); j++) {  
    % y! Y( \+ _, D2 A
  475.                 if (complete[j]) {  8 M7 K2 q* x- D1 |  M( {
  476.                     screen.setColor(Color.gray);  
    7 w: W* P, j0 m! Z) q
  477.                 } else {  
    , x5 f# K% x- B: S  y6 C. H( Y2 J- U( h* \
  478.                     screen.setColor(Color.white);  7 y1 @* s$ ^0 X1 y( G" T, l
  479.                 }  ) n* c4 b( T- t! h
  480.                 if (j == stageNo) {  
    / T& Z" U" O+ j- J! A
  481.                     if (complete[j]) {  
    : E- w3 b$ o' V1 `7 C9 F* o$ y, r/ n
  482.                         screen.setColor(Color.magenta);  
    . q4 ~+ m! R7 f  S# h- ^4 C  z
  483.                     } else {  
    + Y+ j: g1 `8 ~% w
  484.                         screen.setColor(Color.cyan);  ) S, R8 `8 Z6 \  j2 ]$ P
  485.                     }  
    5 y9 A# v* _& ]' b" x7 x
  486.                 }  % e: T" i' o, \: l0 L
  487.                 screen.drawString(m_stageName[j], size = (10 + (screen  ! [( m: o3 H# B  N3 @; y
  488.                         .getFontMetrics().stringWidth("关卡0") + 20)  
    $ f5 j  Z* g# a
  489.                         * j), LSystem.HEIGHT - 50);  
    : Z( T% [& }$ @! V. g
  490.             }  # N8 Y8 F2 Z/ w3 l( x9 e2 z" ^
  491.             screen.setColor(Color.white);  ) D1 I0 d0 R' F4 ~) [
  492.             if (stageNo == -1) {  9 j6 I7 V# u- N
  493.                 // 初始画面,无数据  / b6 M& j# Z+ [9 m
  494.             } else {  
    5 H' u6 Q# M( m0 \* f* s3 e
  495.                 // 显示状态  ! P  `0 K5 o2 `
  496.                 if (hp[stageNo] == 0) {  
    8 A9 U) a8 v6 K  U: }& I( m; E
  497.                     screen.setColor(Color.red);  1 t4 u, k" f8 a) b! E% Q- ]+ {$ C
  498.                 } else if (hp[stageNo] <= stage.getMaxHp()[stageNo] / 4) {  
    6 Q+ X# a6 n3 S' b9 ^# H
  499.                     screen.setColor(Color.orange);  6 p7 R7 P3 x6 d* \) G
  500.                 } else if (hp[stageNo] <= stage.getMaxHp()[stageNo] / 2) {  
      G) k+ V2 r. F
  501.                     screen.setColor(Color.yellow);  7 ~4 p- I. R3 c; Z5 z5 \
  502.                 }  - m" Y; R  k5 J9 o, w& N
  503.                 screen.drawString("主角 HP " + hp[stageNo] + "/"  0 O3 Q. u3 Z2 L- u) x/ x1 }
  504.                         + stage.getMaxHp()[stageNo], size + 50,  
    ; ?# M3 Y6 W) \8 D( \  R
  505.                         LSystem.HEIGHT - 50);  4 p: G+ P4 v! q1 h) Q
  506.                 switch (stage.getMode()[stageNo]) {  ! c. V; G2 W, J& v) |. H5 l9 u
  507.                 // 生命耗尽  
    . u% e+ V# I, b1 b6 U& v5 r
  508.                 case 2:  $ C4 Q1 b" C' \  s& b0 N1 l
  509.                     screen.setFont(new Font(LSystem.FONT, 1, 30));  ' a2 A2 B% H( E1 T/ D$ d
  510.                     screen.setColor(Color.red);  
    # E9 Q/ r% ], N" ]! `" A+ d# r
  511.                     GraphicsUtils.setAntialias(screen, true);  ) o  F. n4 C' L& k  P' C5 u+ w1 E
  512.                     screen.drawString("The End!",  
    6 {' z0 l7 O# A6 S; b6 I& S
  513.                             (CS * maxX - screen.getFontMetrics().stringWidth(  4 x" n$ Z$ L- M* D* c8 `4 \# o' `; H2 m
  514.                                     "The End!")) / 2 + 14,  
    , R3 n3 v2 H: v2 K% K4 X$ ~
  515.                             ((CS * (maxY + 1) + screen.getFontMetrics()  " i; Y& f3 x/ g0 S; F
  516.                                     .getAscent()) - screen.getFontMetrics()  
    % g9 b+ \* v; [8 B# n2 b
  517.                                     .getDescent()) / 2);  
    ' P" k+ R- J2 {9 @) ]2 G8 F
  518.                     GraphicsUtils.setAntialias(screen, false);  
    ) D* Y( ?! \9 ?2 b
  519.                     break;  ( l% u* g$ W# Q" }
  520.                 // 胜利  : {. }% @+ h0 C+ P. v
  521.                 case 3:  
    ' p% x: E2 z' v" p3 H  {5 b
  522.                     screen.setFont(new Font(LSystem.FONT, 2, 40));  4 ]: \# A% d5 z7 Q$ g+ \
  523.                     screen.setColor(Color.darkGray);  ! w2 @) S# W0 v1 q
  524.                     GraphicsUtils.drawStyleString(screen, "Good job!", (CS  
    % }8 ]. b) _, x
  525.                             * maxX - screen.getFontMetrics().stringWidth(  
    7 c1 B8 Z& N4 J
  526.                             "Good job!")) / 2 + 14, ((CS * (maxY + 1) + screen  & J5 E7 c# K% R. u0 _. s+ d3 c
  527.                             .getFontMetrics().getAscent()) - screen  
    * @& w5 O# y/ ^/ o2 ~! z
  528.                             .getFontMetrics().getDescent()) / 2, Color.black,  
    * R7 ?9 t+ g. S9 d7 h6 K, W
  529.                             Color.white);  / B4 D/ J2 y% J0 r4 J, ?( B
  530.                     // 胜利标记  8 F- Y/ B5 g0 T! B
  531.                     succeed = true;  ! G- w9 q# T" R
  532.                     break;  % I% S1 K$ P9 V6 H9 y, }2 l5 E0 F
  533.                 }  
    8 Z9 a6 O" [0 S& A# C' ?7 n
  534.             }  
    , K( t! p! O. `4 B
  535.         }  
    . M! @5 Y4 O  O3 T, B3 R8 ]. n
  536.         // 存在信息时  
    ) a* K$ U' H* m+ R
  537.         else {  
    ; J8 b  S5 L' Q3 u) n
  538.             screen.setFont(new Font(LSystem.FONT, 0, 12));  
    7 J$ C/ g# l0 E, ], t; r/ Q) b- [; Y
  539.             int n = screen.getFontMetrics().stringWidth(message) + 16;  
    2 V3 x% d1 L% k7 j2 j, Z
  540.             int l = screen.getFontMetrics().getAscent()  " q: Z; D% e" \, }! o
  541.                     + screen.getFontMetrics().getDescent() + 8;  
    # R, T. V+ m8 Y+ S: d. m; U
  542.             int i1 = (CS * (maxX + 1) - n) / 2;  
    0 C+ A- ?! l6 E9 |* P2 C9 ~
  543.             int j1 = (CS * maxY + 1) - l / 2;  - E7 r8 b+ w( G# G
  544.             int k1 = i1 + 8;  ) u) K$ v; ?. e7 H7 ~9 |+ I4 o
  545.             int l1 = CS  4 Q/ j9 X; L, r3 a4 z. \
  546.                     * maxY  - c0 z  u' I6 b4 v9 @! n' Z8 U5 z
  547.                     + 1  
    # u6 a+ V" I& m1 e7 Y
  548.                     + (screen.getFontMetrics().getAscent() - screen  ; A- ~& @+ h, g
  549.                             .getFontMetrics().getDescent()) / 2;  
    # {6 x' s; o) |/ c: R7 N! |
  550.             screen.setColor(Color.black);    \2 u. M( E. b; [
  551.             screen.fillRect(i1, j1, n, l);  
    # E. l) I; x+ j0 A% o) ^
  552.             screen.setColor(Color.white);  
    * w8 g9 V) j+ _9 I" x) T8 T
  553.             screen.drawString(message, k1, l1);    x) h7 B9 }& ?0 x
  554.         }  % j* C- Z' e" n( v# m
  555.     }  
      }9 Q$ T+ F  w6 |
  556. }  
复制代码

/ L. m5 T& _7 u7 Z6 y9 y: r( W+ {
启动类:

& q% E. B6 X6 x. L& n/ l
; A0 X( }- a' b9 g2 C4 Z
* o( E, j& C( y' H8 w) f
Main.java
  1. package org.loon.game.simple.sokoban.main;  9 c1 _4 L" R/ F( x& @! Q' s9 r8 Y
  2. import org.loon.game.simple.sokoban.GameCursor;  0 V3 [  R+ \# G
  3. import org.loon.game.simple.sokoban.GameFrame;  9 s& c( z. ^# g  R5 O0 U5 s
  4. import org.loon.game.simple.sokoban.control.Sokoban;  . n- R4 r/ w3 ?: N6 [6 }
  5. import org.loon.game.simple.sokoban.control.Stage;  
    , N3 n  ?/ q( S5 A0 A
  6. import org.loon.game.simple.sokoban.control.Stage1;  
    . s7 A0 K; O- _: F1 y, v
  7. /**   s2 T$ d0 \8 l( w" T8 H# ~
  8. * Copyright 2008 - 2009 3 t  R+ a' S0 Y6 w  ~, n3 y' a
  9. *  5 o% b9 o- D+ ^* _, q
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
    ( }) h8 A7 Y+ M3 {4 V! h9 D6 f# o9 u3 z
  11. * use this file except in compliance with the License. You may obtain a copy of 5 r3 L8 h; O, \9 Z5 [0 b6 d
  12. * the License at ' Z; B( o% d* I5 E, W9 ?7 E$ c& _8 P
  13. *  
    6 a6 S8 L  A! X5 O
  14. * http://www.apache.org/licenses/LICENSE-2.0
    / \1 Q( T# X/ e9 T* A
  15. *  7 U7 i$ l; D& p9 \. s9 S$ W
  16. * Unless required by applicable law or agreed to in writing, software . r+ B: j, f2 i1 w* I
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ) g$ p7 W, ~5 b' ^
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the : W% I, U/ l$ i8 r2 c3 G
  19. * License for the specific language governing permissions and limitations under " y2 u1 \. |+ M% z' Y5 a5 u! y
  20. * the License.
    $ d6 k! N' l5 m1 ^) B! b& ^8 T& C
  21. *  8 W& i5 G1 B. D8 g/ T! d) n' @/ [
  22. * @project loonframework ) R/ Z9 B' @& B
  23. * @author chenpeng 2 ]+ W$ s8 Y" p* T* T  Y
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
    ! d7 ^2 F6 P  {4 p1 A; x+ H0 K7 b
  25. * @version 0.1 $ r9 r0 i3 C2 {# \" s+ j
  26. */  
    # }  y6 t- Q5 J- J& {7 |) a4 p/ j7 x
  27. public class Main {  
    - L/ I3 T1 e* M
  28.     public static void main(String[] args) {  ) Z% ~$ B$ J& Q# H: e/ T5 O0 E
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  % V9 O) t; Q  r3 q3 A( ^
  30.             public void run() {  
    - H) i5 M5 x: d  w; U3 P7 F
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  
    8 X* t% F* i7 L
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  # `& x  S8 J( u; a* I' n
  33.                 // 获得搬箱子关卡接口  . |$ x% d7 m3 t& J/ Z1 s) `
  34.                 Stage stage = new Stage1();  5 \, z3 L% e0 J
  35.                 // 设定游戏控制器  6 l) [3 h  {7 Q. W! {' i
  36.                 frame.getGame().setControl(new Sokoban(stage));  
    . B$ e2 o. \9 S0 X: A
  37.                 // 游戏全屏  
    * {3 a5 w7 J& k8 y
  38.                 // frame.updateFullScreen();  
    7 l* Z4 U) g- T' r# h+ Y  l, `
  39.                 // 是否显示fps  
    ! D' t- j$ W, \; `+ R
  40.                 frame.setFPS(true);  
    $ X) V& u$ f- q- L
  41.                 // 允许的最大刷新率  
    9 c+ ?) I/ e* Y+ y5 r7 Z1 S* S
  42.                 frame.setMaxFrames(60);  6 x: U7 \  n, U
  43.                 frame.mainLoop();  / l4 t0 {& G: K( v( y2 W! q
  44.                 frame.showFrame();  5 E( ~0 w1 s4 f- @# T) ^
  45.             }  
    6 r+ N+ L/ s' ]% J- s: U% p& N
  46.         });  
    : H6 X) `6 D, B+ D
  47.     }  
    6 k. W+ {" q: n6 Q" X
  48. }  
复制代码

5 t0 g9 s( J- Z; M+ }  _- g$ q4 Y3 I- c: J. i
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币) 4 z# |6 j4 f4 }. h  D0 ]* o$ l

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

周末了 哈哈

2

主题

1

听众

1352

金钱

六袋长老

该用户从未签到

沙发
发表于 2015-06-04 00:11:31 |只看该作者
楼主好屌啊!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

1

主题

3

听众

341

金钱

四袋长老

该用户从未签到

板凳
发表于 2016-03-17 22:12:13 |只看该作者
学习一下。谢谢
回复

使用道具 举报

5

主题

0

听众

316

金钱

四袋长老

该用户从未签到

地板
发表于 2017-08-12 20:49:12 |只看该作者
不错不错不错不错
回复

使用道具 举报

0

主题

0

听众

524

金钱

四袋长老

该用户从未签到

5#
发表于 2019-06-10 16:33:14 |只看该作者
谢谢 最近在研究Swing
回复

使用道具 举报

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表