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

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

动态微博

查看: 2618|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 $ W/ w% N" l% K; |# t' Z9 q' E
' `% R0 k/ t/ G6 F
提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。- c. n/ i% W! C) J' T) @8 U3 I6 O
8 [. C3 B* R$ G# k6 H
这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
3 {! @1 b4 H4 {& P7 f2 u1 @+ X9 j. z8 w
但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。: Y% r/ I! l, \1 [) o
: l- T+ B7 C3 B9 r5 }
推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!$ T  e! X! Y' u3 h' ~' G

  T6 I/ M$ R) i/ F; t8 X" R本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。* N$ ^. b# N# U

! n( N, \' X+ [. Y笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。
8 ?! V6 J" L' P+ n7 r' e5 Q6 ], i4 a" r' w. n
目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。
& ^; h' s( p- l4 A% L
游戏截图:
& M' m7 y7 o: `
% e! n" p6 J, P; ^, Q

7 h# p2 x& z$ g, [1 K+ {

4 U; v" h" \6 `
3 i8 l0 Q" B) W
核心代码:

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

. o, ?# n+ p6 e1 n5 c# M
启动类:

7 E# k- o1 Q0 A6 z! E- r
. o4 q4 {7 j6 G9 g

. z- c7 `' j  r
Main.java
  1. package org.loon.game.simple.sokoban.main;  
    ( G" O( _# s# b! p
  2. import org.loon.game.simple.sokoban.GameCursor;  ( }( |, o7 H2 B0 }/ u* \7 }- p7 E
  3. import org.loon.game.simple.sokoban.GameFrame;  ( Y' @6 |7 t7 X8 u# L0 ^/ W* g4 z9 G
  4. import org.loon.game.simple.sokoban.control.Sokoban;  
    3 w8 t2 V8 ^% q  ~% V+ |
  5. import org.loon.game.simple.sokoban.control.Stage;  $ f# d* N. ~* z' ^4 ]; o& b/ B
  6. import org.loon.game.simple.sokoban.control.Stage1;  
    . D% D- D/ w2 E7 O8 A' n- T5 D
  7. /**
    $ j& T8 d! W; _; d1 I6 F$ A- U
  8. * Copyright 2008 - 2009
    ; p, l: h: Z' B5 Q4 z) x7 W
  9. *  - F$ H+ n9 ]& u) `: M
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not / w/ |6 r8 e" M
  11. * use this file except in compliance with the License. You may obtain a copy of
    # `" f3 n( p' z
  12. * the License at
    3 Z7 `2 w, v- v
  13. *  $ u# v+ c, h! x% H; p4 K
  14. * http://www.apache.org/licenses/LICENSE-2.0
    ' L% `1 s' M, D" S# a2 |
  15. *  $ M- ^0 F0 @" Z: H0 X. T/ h. B1 S
  16. * Unless required by applicable law or agreed to in writing, software , [: ^" u+ s! w" l- [& f: z% W
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT $ H! `' v6 t6 w
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + J# O1 S! r5 \* ]
  19. * License for the specific language governing permissions and limitations under
    / v: L! {/ g- |. n/ g/ j
  20. * the License. & @7 I% B' {7 u8 m* [8 d5 N: U
  21. *  
    / h, r' r3 X* I# f5 w
  22. * @project loonframework $ m" F. r7 Z6 E& c& [
  23. * @author chenpeng
    5 O" {2 s8 {5 R% f/ V' ^
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn % f) A& |# G- B) v. v' n" ?6 u
  25. * @version 0.1 . p7 b) v3 d. T/ \
  26. */  7 x/ z; m1 T6 ?. Z( N5 h8 u5 T# p
  27. public class Main {  
    4 [$ L; _( Z: _. \4 _! e
  28.     public static void main(String[] args) {  
    7 X: O8 l/ D# _$ U
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  
    , C! B. }+ q6 l
  30.             public void run() {  5 S6 @1 S) g: }- c
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  
    & I2 i+ q$ m. m0 U9 C) Z6 s4 o
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  3 ]/ r% f7 ?) H3 G- ]
  33.                 // 获得搬箱子关卡接口  
    - Y2 I" ~3 f. d& a4 n" q
  34.                 Stage stage = new Stage1();  
    7 n8 g1 E, y0 i3 G3 s
  35.                 // 设定游戏控制器  8 b6 W; T# z% F3 ~3 R2 K5 q; Z; Q
  36.                 frame.getGame().setControl(new Sokoban(stage));  7 Z9 F2 Y* p7 [4 S- a
  37.                 // 游戏全屏  % C- V$ V2 o+ S6 i* i" m& s1 U
  38.                 // frame.updateFullScreen();  
    9 F: |2 j% ~& \% v
  39.                 // 是否显示fps  ' u+ H0 x' e1 g4 D$ J" M  U* p
  40.                 frame.setFPS(true);  
    3 N6 _& f" `* H5 C6 ^9 b, c7 c6 d
  41.                 // 允许的最大刷新率    ?0 }; h4 K5 [) g" _# q' [0 n+ M2 @
  42.                 frame.setMaxFrames(60);  ; |5 y' M0 z- x; _
  43.                 frame.mainLoop();  
    8 U$ M" |! W7 M5 d2 e
  44.                 frame.showFrame();  7 ^6 ^8 z+ n$ y% ^2 j. B
  45.             }  
    * L( j0 k7 u6 H/ W: T
  46.         });  3 T7 N  n/ h3 l
  47.     }  
    - ^; q& Z, U" T  [
  48. }  
复制代码
9 j) ^7 h; }8 f, E4 y, T" H1 o

2 U9 R$ h' F3 V5 Y5 |/ u- p. G
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币) # E. N* I) D; z( @8 E/ A: ]3 ?/ T

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