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

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

动态微博

查看: 2623|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 ' o+ P8 M. B; @" {8 B; N7 }
0 x. A2 x% q2 @# h
提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。) Y8 H7 G( }* }. ^& F
  d& ?. y& y( h
这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。  g; D5 ?2 Q+ ?0 p! }2 {

2 Z4 q0 p+ I/ P' A  Y但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。% ]. o6 _6 i* x1 d4 Z8 J+ s( g

9 q/ ]1 R1 P4 X& Y" {推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!6 ?2 q' \4 F# ?/ R# B3 l

4 {3 H9 g$ W* m0 a5 j2 j本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。
$ f4 o; W$ h1 @( u( L5 E9 a4 ^  ]* b7 I
笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。& l6 P5 L  p7 j

# n* M" Q% X# v, i3 P6 b目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。8 F0 B2 [3 f- ?
游戏截图:

3 s& \$ |9 g  X+ R* B5 W
% B# i& O1 k0 G6 C: z" b0 w
- `( [- Z+ [4 p! M2 m& _9 I3 e
/ s" D% r+ f: s

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

( h3 h0 X' ^6 ~+ Q/ B
启动类:

. _8 Y5 Q. z1 L% n3 Q

1 z8 B; F0 z6 ?1 {+ v

# h5 g; g, K4 T/ e$ r
Main.java
  1. package org.loon.game.simple.sokoban.main;  $ w" h( Y+ O4 \* _4 R6 U; I0 s
  2. import org.loon.game.simple.sokoban.GameCursor;  
    ' D( }( w1 g" o5 i2 O* {; F
  3. import org.loon.game.simple.sokoban.GameFrame;  / _, ]  |( E  x2 @, T1 e
  4. import org.loon.game.simple.sokoban.control.Sokoban;  ; `; K$ G- _" a* e
  5. import org.loon.game.simple.sokoban.control.Stage;  
    , l. i2 Y7 o# ]5 k5 l: Z
  6. import org.loon.game.simple.sokoban.control.Stage1;  
    1 }, ~7 v+ F  q; S3 K; E
  7. /** / }+ t6 Y/ e8 v& C6 G
  8. * Copyright 2008 - 2009 - F9 c8 L8 g% f( u( q$ d2 `
  9. *  
    & F. m: f* s/ ~) @6 u4 Q: _3 \
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
    ' k% ?; m' C1 I7 f, l" J$ h% F
  11. * use this file except in compliance with the License. You may obtain a copy of 5 _0 y6 {; _) E3 W1 V
  12. * the License at . n5 K- Z) l9 @% M/ c7 t2 T, ^
  13. *  8 f+ o3 \6 e1 J' L  y
  14. * http://www.apache.org/licenses/LICENSE-2.0
    " ]' z2 w- R" X' \
  15. *  6 E  _! d+ L' W' l/ M( s2 O$ g# Z
  16. * Unless required by applicable law or agreed to in writing, software : K) W7 |% r0 e) @, a8 f1 O
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 2 p+ O4 R- u3 B" R+ A; S/ t* U
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + W- X- `6 ~& L$ }
  19. * License for the specific language governing permissions and limitations under # L1 Z) T0 B# V0 `; e6 X; r
  20. * the License.
    6 R8 N; X, Y4 {
  21. *  8 v( ?2 x) t( v6 ^' f% E2 N
  22. * @project loonframework 6 a& [/ ~% G8 I! D  q& F$ @3 X; e& }
  23. * @author chenpeng # n' }6 V+ x3 t
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn 8 w; X! \! o$ F0 _
  25. * @version 0.1
    & `0 m5 W4 I- [
  26. */  $ s$ }; E$ W  m
  27. public class Main {  
    6 k, A  `9 w) O& O4 |2 J
  28.     public static void main(String[] args) {  . D6 l, w7 R  S8 z
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  
    + X  M$ o- F0 H. d1 Q
  30.             public void run() {  
    , z( e5 ^; T$ ?
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  5 r; ^2 c% @* i. v: T
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  * s% p! i# t) @: _
  33.                 // 获得搬箱子关卡接口  $ J, Z9 D0 F0 {' L
  34.                 Stage stage = new Stage1();  
    % @: |; c* R7 u
  35.                 // 设定游戏控制器  
    9 z2 O" Q1 P: c9 k1 M
  36.                 frame.getGame().setControl(new Sokoban(stage));  # m- X& z( [- @# M9 Y
  37.                 // 游戏全屏  8 w$ k" P# t9 u: P
  38.                 // frame.updateFullScreen();  
    , Q9 F1 @/ D" Z# {8 I
  39.                 // 是否显示fps  , x, `& ]# d' G- g/ e& F( R, t8 L
  40.                 frame.setFPS(true);  
    6 [# t: q* L( z% c
  41.                 // 允许的最大刷新率  " d& c* o4 `) e1 Q; B! w! Z
  42.                 frame.setMaxFrames(60);  
    + v, _8 @% I1 S
  43.                 frame.mainLoop();  
    ! s/ _  c9 x3 t) C
  44.                 frame.showFrame();  ! S8 b' o' [8 ]/ R  U4 d% Q5 F
  45.             }  
    9 r: C1 F' W( s* r# \
  46.         });  / L/ |3 [. s. u1 l8 h/ ?9 g( [' r
  47.     }  3 m+ K! w- W2 k4 q% ]
  48. }  
复制代码
9 p  y& R! y" }; H- Y5 Z$ |: h
6 X/ Q$ S* C0 ^; `
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币)
/ L+ x( y0 `; P9 {

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