科帮网

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

动态微博

查看: 2861|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 6 m% a) o0 H% j. N
; a, ^% H# r+ w4 z7 E9 O1 w
提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。
- K% N0 O, k& B4 g2 m6 h- y+ x# B& g
这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
3 r6 r6 p0 W6 _. D6 S+ d, B
% M5 s7 V/ n" `7 \6 s0 U9 T但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。% W" g- V8 \5 q
: E  Z1 L+ Q' ~; e- h
推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!% s  k! `; M3 E. I7 o. G9 Q2 O
* Q- F: {3 o* H- r  t9 u8 u& I
本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。
) d$ A( L3 K1 C. s
7 |: l& Z7 o" C# {8 C4 A- o6 M9 v/ _笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。( s- H' D: h/ M3 N3 F1 s( }

& j" ?& E( ^0 ^% M目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。% ^! g2 \  @! n0 c- u
游戏截图:
6 g  [7 Y% I# O- r$ n0 M
9 j7 e% R- }. n7 A' H) ?
8 |! f: G" a& z
0 Q3 O) |; h3 U2 P* v! `0 D

, N3 h" [) K8 t: d
核心代码:

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

4 y$ q8 M: n) S% x! \
启动类:
% `) `" Q  K6 b% D* Y, F

7 N6 Q8 e: h* C3 _8 U
8 i. D6 u* ~) p1 A) X* }- W% w5 }! z5 n
Main.java
  1. package org.loon.game.simple.sokoban.main;  + w' G% |4 X5 p( q2 N9 w; T+ g
  2. import org.loon.game.simple.sokoban.GameCursor;  
    ) @8 o: x4 [- U* ]& y& F" Z* u+ ^
  3. import org.loon.game.simple.sokoban.GameFrame;  ) E* s; P! S8 p. P
  4. import org.loon.game.simple.sokoban.control.Sokoban;  7 ^$ m1 M9 I6 b1 ~: {
  5. import org.loon.game.simple.sokoban.control.Stage;  ( L- l3 g7 o+ c# I' r: c9 X
  6. import org.loon.game.simple.sokoban.control.Stage1;  3 M" @3 ^2 Q/ y( R5 S# W8 v
  7. /** " A9 ?1 }4 h: q+ Z$ s) ?5 f
  8. * Copyright 2008 - 2009 $ U- N. I6 e( j7 l& C! U; m' B+ w
  9. *  ; @( W4 i+ \0 ]6 }
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not 7 H& K" k+ M- V4 g9 a
  11. * use this file except in compliance with the License. You may obtain a copy of / v* g  n( N' E# I  Q. L7 c
  12. * the License at
    & ]" L, b* E3 H) l8 l; r! I
  13. *  % f. z  c+ g* W- Q) x6 ~+ I
  14. * http://www.apache.org/licenses/LICENSE-2.0 " F' p& c& {* a
  15. *  
    & ^! l' L4 z) K+ E* K
  16. * Unless required by applicable law or agreed to in writing, software
    ; S, k& ]- L0 f: ~/ k; B9 r
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    ' g0 r- A& T5 u+ z" k5 Y) S; q, i
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    & c9 U& ]$ ?* B3 S$ p0 W8 G" X
  19. * License for the specific language governing permissions and limitations under
    & ~. r/ {: N6 L! }* }
  20. * the License. . m, C6 J% D9 _, b. U
  21. *  $ W, I3 V) j( H' H9 `1 z6 i
  22. * @project loonframework % m4 U- x0 h1 u# B% |
  23. * @author chenpeng
    + M2 ]2 g! v& F( N( \* b, m
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
    - O6 T4 [3 x7 n6 p% K
  25. * @version 0.1 % G) Y! B) T# Y# B" u) Z! Z
  26. */  
    1 U8 T' Q5 ^* O; ]5 K8 K
  27. public class Main {  8 X( S" C! C$ d7 u
  28.     public static void main(String[] args) {  
    + ?- I  Y% `( W- w( b5 L" H( z
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  
    1 Z5 O+ |- @4 k, n9 i4 {5 c8 Q
  30.             public void run() {  7 k( k% `3 v. P( ^
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  4 z# O/ D5 n8 C% z" v
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  6 V+ W/ z  k$ R" I/ b3 P: Y
  33.                 // 获得搬箱子关卡接口  
    5 E4 w- J. E  n5 M
  34.                 Stage stage = new Stage1();  - \. [: a; ]; U* n" [0 c3 U
  35.                 // 设定游戏控制器  
    . \7 f9 U  ]& J( k; t. n( h
  36.                 frame.getGame().setControl(new Sokoban(stage));  
    , y( O% H4 J8 b- n8 \
  37.                 // 游戏全屏  3 n* |3 D+ w/ x" I( A" N& c
  38.                 // frame.updateFullScreen();  
    . t- d) g1 I* ]3 J+ y5 R  S1 s
  39.                 // 是否显示fps  
    * h- z3 U$ G0 I+ A
  40.                 frame.setFPS(true);  9 Z; |$ Q4 S3 ?+ ?9 w  p
  41.                 // 允许的最大刷新率  
    # v4 i6 n( E0 X3 f# @9 V
  42.                 frame.setMaxFrames(60);  6 w$ y$ f9 w! B. O; r* x2 W
  43.                 frame.mainLoop();  
    % O6 C# z8 _8 j9 Y
  44.                 frame.showFrame();  ' f% j+ j' N0 ?! |  S
  45.             }  2 d* `6 O4 j; f6 ^  x( l! F
  46.         });  % s  ?+ c: ]; z( c) C, [
  47.     }  
    6 e. j, i1 O2 ?* u
  48. }  
复制代码

/ t' L$ G! s$ j$ A& `+ {$ W* D( [; g1 I& {! o9 w) q# f
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币)
5 |& N0 [* {1 q9 F

科帮网 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群 科帮网手机客户端
快速回复 返回顶部 返回列表