我的日常

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

动态微博

查看: 2752|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

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

; ]  z3 v' \' q2 D% N本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。
5 b9 d: `2 s3 }# ]& e  K0 E, ~1 S/ d% z6 h$ l3 g
笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。- s9 s. u: |1 G6 M$ V9 A
" k; Z) ?5 I9 {" k
目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。
" |" G  F8 Z* u. d2 l! f" `4 W
游戏截图:

: I6 F. F7 r0 _: f/ x% D  n1 A9 E

. O; z* x! g; v1 h
3 q' @2 `, T- o
, ^# V, V; |( G+ m
$ U9 E- Z: _. K: n
核心代码:

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

6 \8 E/ r3 M9 `4 x4 v0 W2 M

% h8 |/ o: a+ e' u+ C6 F  ]4 a9 h
. F4 \# I: H! ^5 k
Main.java
  1. package org.loon.game.simple.sokoban.main;  
    # |- D9 S* `/ N7 }
  2. import org.loon.game.simple.sokoban.GameCursor;  
    " t) s) F0 m  m) y$ K) z
  3. import org.loon.game.simple.sokoban.GameFrame;  0 K; k# U' f) Y, e* v# s, j; S* `
  4. import org.loon.game.simple.sokoban.control.Sokoban;  
    & ^# }3 U4 @- w. A, ~' R
  5. import org.loon.game.simple.sokoban.control.Stage;  
    % A+ t0 @* ~9 |4 X) m( J
  6. import org.loon.game.simple.sokoban.control.Stage1;  
    7 O! _" L  D5 t1 U9 W: }* f
  7. /** 3 ]! Q4 Y2 W1 N
  8. * Copyright 2008 - 2009 ; {* R3 T' c9 R$ i
  9. *  
    - N3 P7 |" q5 p2 S$ O* h4 O% B
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not ) R' I; `! o1 R( {) j1 Z
  11. * use this file except in compliance with the License. You may obtain a copy of
    ; A5 Q+ E( j; ]' B* o
  12. * the License at 9 P: Q# x0 \. c' ]% S0 n
  13. *  
      O( m) i, L3 e
  14. * http://www.apache.org/licenses/LICENSE-2.0
    3 p& Z6 O4 d! V# `
  15. *  
    2 [5 V8 X" @* w- ^& q9 @* e0 Z
  16. * Unless required by applicable law or agreed to in writing, software 1 ]% ^& u0 I( M! B8 }" D( y
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # u- j) |9 c# Z+ W1 T
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    7 [7 z+ I9 y. }$ l
  19. * License for the specific language governing permissions and limitations under
    ! Y8 d4 t! R- {' s# x7 I* N- H
  20. * the License. 1 Q* d- x5 v$ @& a0 K- ^/ w+ X
  21. *  
    9 T1 N" L7 M- i( M8 G( p
  22. * @project loonframework
    ! ~! k6 N& ]2 x4 Q' Y) i
  23. * @author chenpeng
    / M5 N2 x  j3 `7 {' [0 h* N" a% i
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn ! i" Z7 h" R- n. p/ V1 I$ O& }
  25. * @version 0.1
    , s/ V, \+ _6 K/ j
  26. */  
    6 x3 p5 m8 U. ]8 y
  27. public class Main {  + f, A. |# Q' Y) U) C- K. w1 X3 {
  28.     public static void main(String[] args) {  3 o5 b) X' k) a  s" F
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  ! C9 d$ U6 L7 W* u
  30.             public void run() {  . _3 w5 h. J, H! _1 \- f( X) ?
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  4 p. O. @: Z3 J/ ^) ?
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  
    * s1 e- u  b7 m/ h7 f* K
  33.                 // 获得搬箱子关卡接口  / R3 m3 f5 Z. J
  34.                 Stage stage = new Stage1();  
    3 F% j3 r% x9 w2 Y0 a
  35.                 // 设定游戏控制器  " L6 X/ E+ g. o8 ]/ _; S
  36.                 frame.getGame().setControl(new Sokoban(stage));  6 G# r" K- ?) T2 B2 M( X
  37.                 // 游戏全屏  
    / z; Y5 u1 E% Y. W) x9 ]
  38.                 // frame.updateFullScreen();  4 B) F1 J9 a4 ^3 ~. S
  39.                 // 是否显示fps  
    ; H* s) W0 p% D* Z9 ^. P
  40.                 frame.setFPS(true);  8 v9 Z7 n3 q/ K
  41.                 // 允许的最大刷新率  
    / H# W  l8 ]: V0 C  v- A( n) |
  42.                 frame.setMaxFrames(60);  
    $ v5 {2 I' C# ?, Q; z
  43.                 frame.mainLoop();  ; d4 T) h" x; G- J9 }1 P3 r0 [# e
  44.                 frame.showFrame();  
    * p, O0 d9 F+ L& m
  45.             }  2 O0 P4 B) V* U) I, j
  46.         });  ' \6 Z& S9 C* H
  47.     }  ! }% i- e8 \# ~0 j* d: h3 i% \
  48. }  
复制代码

' o$ f/ [9 c: y+ h9 k
. `* x- q5 G7 O% [* e
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币)
3 F" E& D% F9 g* u* `

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