科帮网-Java论坛、Java社区、JavaWeb毕业设计

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

动态微博

查看: 2621|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。
6 v: P; v% n7 S$ ~% E
: Y4 i1 k  a" s1 W& @提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。
- T+ G) ]1 @/ q: Z2 l$ @! q; ~) E9 J" x7 ~% ^
这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
" _6 b' l: U* Q+ Y1 F" v
6 q* l& W+ M5 x- Y! D但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。$ Y% U, u5 [2 R$ {' P$ }

1 h+ r) ]  h0 n3 S+ h0 @0 D推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!: ^( g2 V. @4 d# v  P" X

  e' C% a# V$ ]( o本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。
4 Q& N& ^) q+ L. _1 B5 z' v
1 y' j* M2 u0 U- X$ y* G+ d- }笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。
! K# P" B2 N" }9 k1 a' ]3 g# ?# V/ M& n# r. G9 R7 z% }
目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。$ u; O8 t. u* e  q  u
游戏截图:
9 l8 q' I5 x5 m" D' n" w* v

3 o, V2 o: x% [- `; d4 X7 l/ m
( R9 T. ^1 i* j/ c1 e4 `4 N
/ g% s0 V8 a, y6 f0 B9 L% j% P2 B& m
: {6 b0 ~0 o+ d8 e( b1 G/ t" |
核心代码:

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

7 r2 q& N& Y) O3 V
# p# K% t6 X0 f6 C
Main.java
  1. package org.loon.game.simple.sokoban.main;  * [2 l6 ^* ~0 R- ~' r1 M9 B
  2. import org.loon.game.simple.sokoban.GameCursor;  7 N+ S- k$ w* g( M4 o! e
  3. import org.loon.game.simple.sokoban.GameFrame;  
    $ n: ~  F9 o9 A; r. d9 I
  4. import org.loon.game.simple.sokoban.control.Sokoban;  
    $ u( I3 l* v5 i) |  P+ I3 s4 E/ P, O
  5. import org.loon.game.simple.sokoban.control.Stage;  
    ; H2 J7 `- k. N# u0 X: \
  6. import org.loon.game.simple.sokoban.control.Stage1;  8 ]; x. z! E3 k: H
  7. /**
    . P  c* m; J8 \9 t, Q6 z8 s
  8. * Copyright 2008 - 2009
    , Y" S4 `. C5 L- s
  9. *  
    0 v% W) ^- |7 q4 q) y% y
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not 3 z; x: Q- a7 p! X
  11. * use this file except in compliance with the License. You may obtain a copy of
    & Q8 D6 I' J, o8 d6 F
  12. * the License at
    # K. ~, \8 R6 F* V4 ~; z
  13. *  
    ' Q" q+ X0 `# s0 k$ J3 {0 |
  14. * http://www.apache.org/licenses/LICENSE-2.0 ! K: M" ~$ k6 H% N) G
  15. *  - G! C6 b) t- a) ~# L' ?
  16. * Unless required by applicable law or agreed to in writing, software 5 X5 z: v  P9 h2 u
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ) `" K6 ^+ J+ }- ~8 H* g
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 6 q, [1 N' R4 H7 d* u
  19. * License for the specific language governing permissions and limitations under
    . C6 ^& b. [5 `
  20. * the License.
    2 J# t" u3 G9 U
  21. *  
    " w  b1 @- W2 H- O0 Z6 I0 W0 I
  22. * @project loonframework
    . V1 `6 k& _3 T* L
  23. * @author chenpeng
    % o& H( n+ t: y0 C+ ^" a  p, h, K. ~
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
    " k0 U! R7 e) R2 l# {# d+ v5 v$ {
  25. * @version 0.1
    - }1 v# @) }& B7 g) S2 z3 A
  26. */  
    2 t0 c% f4 Z& a4 \
  27. public class Main {  
    4 `( X1 A" P/ v* r4 ]; j+ S
  28.     public static void main(String[] args) {  9 U4 J- w# ?8 k
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  4 I7 q# d; |" R( P& i
  30.             public void run() {  ; X& i! B& I2 X, D& q
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  
    - g7 |1 J. S* ]6 b' d, c  f8 L
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  
    ; i; j6 r& @2 q& s$ E+ H
  33.                 // 获得搬箱子关卡接口  
    + C0 j/ h( Y" p0 _4 H4 B9 W
  34.                 Stage stage = new Stage1();  
    + L. r3 i/ h6 b0 x( E1 p5 b4 S+ V
  35.                 // 设定游戏控制器  5 v/ x6 b* v; f
  36.                 frame.getGame().setControl(new Sokoban(stage));  
      v" h. a. m. Y  R
  37.                 // 游戏全屏  - i# v6 n9 `3 f. @. o. C- b
  38.                 // frame.updateFullScreen();  7 l9 c& T1 {4 o  e$ }
  39.                 // 是否显示fps  2 ~! @3 B) o, e# a% U" i3 Q# {' P
  40.                 frame.setFPS(true);  0 Y3 P" U& p8 ?# R( v" T
  41.                 // 允许的最大刷新率  
    5 V' @) W9 y. t9 }2 M
  42.                 frame.setMaxFrames(60);  
    2 b1 i9 E! ~0 ]
  43.                 frame.mainLoop();  
    3 v- t: q& n) N9 R- O
  44.                 frame.showFrame();  2 ~, x9 w" G- u9 `; a
  45.             }  ; f1 U9 ]' V% R, b! \1 f2 g
  46.         });  ' T0 B. s- o8 K4 m- `
  47.     }  
    / k( l8 J& s/ c# @! @
  48. }  
复制代码

: B6 I$ ^% B) ]$ }! `! [5 W
/ s7 Y  ~6 Q0 e' Q0 u6 v/ Q
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币) $ `% O; p3 Z, K' B" E& V* A4 c5 ^, h/ |

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


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
回复

使用道具 举报

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

   

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