我的日常

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

动态微博

查看: 2733|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。
) T( l8 z2 n2 z7 ?$ V0 l
8 L% R1 }9 v; t: O提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。+ I) v6 t" T0 P+ l3 l0 N2 |; y

0 u+ t9 K9 n# O- h) z1 v2 V) Y这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
) B+ {5 Z) j8 B4 |9 h6 |! `- E: O
但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。5 ~, Q' O1 \+ v0 x% D( s
# w# G: E  A3 h+ d  l, h1 J
推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!
7 {4 ~5 L  w/ ?1 K, j6 v. W: r* M: R3 j2 E
本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。
% W. n0 A9 a8 k  y
  X, u% a* `/ f8 T3 \* T; l笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。
  M! g, ]2 `- ]" t' k8 Q6 |% i
' ?1 N( n+ g- A6 j9 e; F目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。9 l& b0 B* s4 T
游戏截图:

8 R; c( ]2 ?8 O: |2 w
( n8 N, n) n: v. \4 L& @1 `
0 w$ q. y% k' }0 R
  y% |$ M9 A' r) U
0 Z5 P2 q. l' ~5 G
核心代码:

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

7 W8 w3 a( W! H- W# _, e
启动类:
# o" B7 C. }/ o% Y
' U. |! h$ Z! i6 e; j1 @4 c
3 [8 I; u, ]  j. I" ?: P5 r
Main.java
  1. package org.loon.game.simple.sokoban.main;  
    6 c0 G8 D$ f) C! T# z2 s4 I
  2. import org.loon.game.simple.sokoban.GameCursor;  4 X* U8 e( Y9 c0 q4 ]
  3. import org.loon.game.simple.sokoban.GameFrame;  
    6 k1 D: W+ S5 K
  4. import org.loon.game.simple.sokoban.control.Sokoban;  , M! x, m* M$ G! U$ U1 c
  5. import org.loon.game.simple.sokoban.control.Stage;  + X# J6 G4 {; c
  6. import org.loon.game.simple.sokoban.control.Stage1;  
    ) K8 r- n" [7 z& S
  7. /**
    " h+ f7 d$ @! \: m
  8. * Copyright 2008 - 2009
    % ?1 H! E8 j- f& G+ U
  9. *  
    9 ]4 M1 b! ]* r. I! g% v
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not 2 F; z0 \; h5 {3 Z2 I
  11. * use this file except in compliance with the License. You may obtain a copy of ' {; ~; i+ P, J
  12. * the License at
    3 a/ a+ l2 Q/ y: U8 H
  13. *  
    2 U  I. o- p. J
  14. * http://www.apache.org/licenses/LICENSE-2.0
    1 f  p& {1 |# I( @' O
  15. *  ! r; x. x6 E  w
  16. * Unless required by applicable law or agreed to in writing, software
    4 ~$ G. H5 M# T, }! J- h
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    2 g" ~6 S& }1 g6 ~: c
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    / }+ {6 O( L6 K  h8 n8 ^
  19. * License for the specific language governing permissions and limitations under
    4 E- }7 Q2 P7 X
  20. * the License. ; i5 y( t- a" o* ~! `
  21. *  
    ! Y5 Y( o5 m. o5 H3 l
  22. * @project loonframework
    3 e; E/ ^5 m8 t) L: v9 U/ S
  23. * @author chenpeng
    7 b. J# @+ O% m9 j$ Y
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
    , {/ {% o, V+ v, |. ]- P0 x- A
  25. * @version 0.1 0 Q1 h  ~9 z# [
  26. */  $ }) A! I1 W7 l4 N
  27. public class Main {  
    % V/ y5 R7 x; k: A* v  _; E/ B
  28.     public static void main(String[] args) {  9 P3 c2 }3 f  v( W# G( q  V, o
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  
    ( q5 u8 X. |, T* M* }) G* M
  30.             public void run() {  ) v5 H5 w/ V0 O) `
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  
    . k; V2 K: x( N  d  D3 ]$ C2 X
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  4 k- X, ]! s( s* d9 y: i7 K% p
  33.                 // 获得搬箱子关卡接口  
    ' F/ t* ?/ O: Y* @5 i
  34.                 Stage stage = new Stage1();  
    5 O1 }; y2 Z; [7 N+ v/ B3 S
  35.                 // 设定游戏控制器  
    + G% a: ^9 M- g4 |6 {' O
  36.                 frame.getGame().setControl(new Sokoban(stage));  
    & C& L$ f# |4 ]
  37.                 // 游戏全屏  
    $ K% ?+ n& {+ z3 |
  38.                 // frame.updateFullScreen();  
    0 T( N. N: Q5 Q4 }; c
  39.                 // 是否显示fps  $ y3 _& {. w! C6 s( D
  40.                 frame.setFPS(true);    ^; ?. _- x7 {5 j% S7 c  n
  41.                 // 允许的最大刷新率  6 q( l2 O5 v2 C: c. a  Q4 S
  42.                 frame.setMaxFrames(60);  
    2 x4 A7 \6 ^' |7 {) r
  43.                 frame.mainLoop();  
    9 }; \" b8 k) q9 t9 z1 i
  44.                 frame.showFrame();  
    1 X# E! D( F* Z6 H, L. D
  45.             }  7 a; M; O$ Z- `& T: r
  46.         });  
    9 \& h' @6 M" \
  47.     }  ' C4 F* W8 s! k8 B& u
  48. }  
复制代码

8 e3 M; i* h1 b/ W4 h( w, ~5 H( o, b6 g+ P9 }! e* Z8 I8 S
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币) 4 E$ U/ K. G( T! K

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