我的日常

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

动态微博

查看: 2773|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 / d! |0 T  W1 n- G# G4 a2 E

5 @+ p$ s. Q6 P' W+ ?: i# `. ?提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。
7 A) T& @% o) J/ B. F' ]* ]
. k- W; p6 ^) |; l! P这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
$ b! ]9 o6 ?3 e) X/ }9 O9 ]0 b
但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。" \/ W' i2 g! H& @( ?

# g; P) {, ^7 w, L& s  v' q, \推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!9 p3 Y: V- Z* y( K" D% k

3 j2 I0 F5 B' T+ s- [2 a本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。0 ?5 P( w" e$ Z+ \, }& P0 ^+ |

2 @9 D3 b  ?7 r$ A9 _8 O6 ^笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。
' c% N7 p! G9 x5 F7 h. }7 l# k8 E: D0 K
目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。" E7 |$ A& v2 j( V* b! U3 k4 e
游戏截图:
3 s3 h) G: D/ j! m
4 |$ M" l. }& R1 T5 `3 B( S' f6 ~% f
! A" [  ?; s& u" a. J

: _" q# m9 g- i

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

% p6 _# f0 v8 {4 r. q: E! ]
启动类:
9 Y0 X4 S* g5 ?6 m
6 N9 b6 ^: `/ N7 ]$ G& C/ F
. ^% O, z) B2 @# C; ?
Main.java
  1. package org.loon.game.simple.sokoban.main;  8 w7 C3 U; h1 |6 d
  2. import org.loon.game.simple.sokoban.GameCursor;  . b. G3 G7 ~7 i# v; e. p3 G
  3. import org.loon.game.simple.sokoban.GameFrame;  ' d5 M1 `' k/ a( H, p: ^" r3 h
  4. import org.loon.game.simple.sokoban.control.Sokoban;  1 g2 _5 X2 M$ D6 ~& ?% D) L5 \
  5. import org.loon.game.simple.sokoban.control.Stage;  + ]' s: ~8 g9 S8 V- f
  6. import org.loon.game.simple.sokoban.control.Stage1;  
    , g5 R* h. n* e; _
  7. /** ' ^# N- t$ w$ L+ O5 ]- Q; K
  8. * Copyright 2008 - 2009 * O" R2 y' i1 G$ ]. M1 M% i# H
  9. *  
    . o' T- [# a( a) [. i: G
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 |8 f+ m2 ]4 A8 {% b4 f; Z% e: A
  11. * use this file except in compliance with the License. You may obtain a copy of , [7 d: s' v: s" Q' Q$ c$ ^6 D
  12. * the License at
    & X# x5 y1 p7 N* r: f- @
  13. *  
    0 I3 s1 m1 l1 u
  14. * http://www.apache.org/licenses/LICENSE-2.0 . K. G! Q* R* u
  15. *  - f7 C7 |8 k, t: K$ {
  16. * Unless required by applicable law or agreed to in writing, software
    % Z1 I, V! P" h0 G" i7 P% E/ w
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
      u5 j) y6 ?7 |; M$ J! [
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    : [2 B+ u) q' r) T/ o6 h& F
  19. * License for the specific language governing permissions and limitations under
    $ Y( N) f4 F6 [" C/ `9 U
  20. * the License.
    . @$ u  s1 E* {  S+ C( s$ M
  21. *  ' b7 C+ L6 u' x/ a7 `, z* \
  22. * @project loonframework . x7 D) z0 j6 h
  23. * @author chenpeng - q; t) X+ A3 S( [
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
    % @- Y3 ]+ D6 \/ W- F. g
  25. * @version 0.1 + P  L1 Z" B( W; W+ b8 t, n
  26. */  
    " n  E: [2 ~! h5 M0 A7 S4 x- x6 U
  27. public class Main {  ; I' K; E% p% h: r9 @1 w
  28.     public static void main(String[] args) {  2 [+ J: q; H, S; l) O* n+ e* P
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  
    + f0 b: K8 \! L+ c: _
  30.             public void run() {  
    2 _3 I* i  t7 G& V) O$ `
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  + v) m- _* R' K* ?9 @) L- ]6 q
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  # e( Q' t5 z% G( `9 U6 U
  33.                 // 获得搬箱子关卡接口  $ n1 B9 E9 i& l& |) L) C
  34.                 Stage stage = new Stage1();  
      N1 k5 s0 j- c7 P8 i- M- {. c6 o
  35.                 // 设定游戏控制器  / r* Q/ N, `( y" S
  36.                 frame.getGame().setControl(new Sokoban(stage));  
    : t" e' H& @* l- J9 [
  37.                 // 游戏全屏  6 ?3 r# @* n4 _
  38.                 // frame.updateFullScreen();  
    0 h% B' p/ s1 w7 j" u1 b0 ^
  39.                 // 是否显示fps  $ `: w" r5 V- ]. `# C5 V
  40.                 frame.setFPS(true);  
    - z4 q% H- B3 r
  41.                 // 允许的最大刷新率  ! d$ ~# |+ B6 O4 G
  42.                 frame.setMaxFrames(60);  . f5 {% G* A! ]' a; i& A) T
  43.                 frame.mainLoop();  
    7 J) o4 p7 q4 k/ y
  44.                 frame.showFrame();  6 f1 U; W- b9 Z5 N
  45.             }  0 r" l8 y; o2 X6 w( d7 f
  46.         });  : B0 g5 S4 a3 J8 \, z. k9 c; i
  47.     }  ; H3 }- R; r' y  N1 Z7 [% O
  48. }  
复制代码
9 j  O2 @# ~9 r( {6 j# C3 t; B! I
7 Z& X1 j+ o/ Z) u$ V: G( s# Q
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币)
* V8 O. s: K8 ]/ U/ p4 W1 Q

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