我的日常

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

动态微博

查看: 2753|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

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

% {9 l6 @2 |  G- P. T+ `本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。  h- C4 B. E# I3 n. i2 g5 i  M
* K6 d% g6 z; _8 ?3 R" R
笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。2 @! d2 p5 d5 f# j- u: N* E
- e. K) X) e- l. d" P+ v& h
目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。
8 p6 p  A: F/ {
游戏截图:
: A( I: O5 E+ i9 B

; k0 E" }! k& R& C' x5 l4 i( G* h

2 {; o5 m- S+ m- o0 M
0 J. n  G0 s! D

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

. h  Y% L8 n* Q5 W
Main.java
  1. package org.loon.game.simple.sokoban.main;  , Q% ]# s7 V6 _7 u6 h( Q
  2. import org.loon.game.simple.sokoban.GameCursor;  1 C5 H- t/ L7 L- S
  3. import org.loon.game.simple.sokoban.GameFrame;  
    6 R& I. \6 `2 E/ C$ q* ~6 h6 O
  4. import org.loon.game.simple.sokoban.control.Sokoban;  6 q- ?- N# ^" `$ u
  5. import org.loon.game.simple.sokoban.control.Stage;  
    ' i; k+ k" m* V
  6. import org.loon.game.simple.sokoban.control.Stage1;  : U  c* w) ~' V5 [2 y
  7. /**
    , p% i  X3 o# _7 w: q8 e* C# q
  8. * Copyright 2008 - 2009
    9 l" L5 ?3 O! e0 T4 U" `# E# \
  9. *  3 b& g& t% R6 F! R0 `
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not * B1 ], N4 ^2 i
  11. * use this file except in compliance with the License. You may obtain a copy of # l" c' T7 O, M$ p% y
  12. * the License at & n" y( ]( x4 v  }
  13. *  8 C6 G/ a5 L# F9 Z" o7 h& P
  14. * http://www.apache.org/licenses/LICENSE-2.0
    * j/ Q2 K& J: U& o; J. |
  15. *  
    # P" c# M& D+ X  a: W$ B$ K
  16. * Unless required by applicable law or agreed to in writing, software * Z  @+ O1 F) B* w
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 7 p3 v  \& \' M7 r' E/ |. K
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    - m3 E  k* z$ {* I% _* H, N2 J
  19. * License for the specific language governing permissions and limitations under
    7 |; k& o+ t1 `' E  z0 T/ T$ a. Z
  20. * the License. ' ^" m2 \* K$ N- L3 m& v
  21. *  
    . r! K; H3 @! z
  22. * @project loonframework 4 t4 M$ @1 q0 d0 ]3 h; x) q" F7 q* {
  23. * @author chenpeng * C, H1 W" U7 m  t$ T; |
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn ( o) ]/ ]! \" B- C
  25. * @version 0.1
    . s/ r6 j) }6 D+ X5 Z
  26. */  
    & r" p/ t* r4 C6 o. D8 C* _3 {: ~
  27. public class Main {  
    - Q; ~3 T# M# a9 V
  28.     public static void main(String[] args) {  
    , X% u/ d/ S$ W# S) G
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  7 I4 D9 Q- O; y% ^  |
  30.             public void run() {  ) ?* J1 |) a% d* R5 m+ }* i. E* H
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  
    * w' D+ X( j. A3 H, z
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  
    3 j" ]+ X# m0 @% B* x
  33.                 // 获得搬箱子关卡接口  
    . e2 e1 N0 P% C2 K6 S2 E/ Q' @
  34.                 Stage stage = new Stage1();  & ^* d- L7 o& i; u" g+ Z! J
  35.                 // 设定游戏控制器  
    - \/ \  b8 r: J- B7 R& n3 L
  36.                 frame.getGame().setControl(new Sokoban(stage));  . @# C8 K3 x. h7 I( `* ?/ n# Y
  37.                 // 游戏全屏  
    , L& _1 v! D5 D! b& k
  38.                 // frame.updateFullScreen();  
    & K. [2 `/ T+ ^
  39.                 // 是否显示fps  & G& A, ~' @, ~) u, n4 J+ i$ D
  40.                 frame.setFPS(true);  ( |) F8 o: x# X" r. x9 p
  41.                 // 允许的最大刷新率  + P% c; q1 X' }' Y/ l% S8 z/ w
  42.                 frame.setMaxFrames(60);  
    3 D* g+ T2 f0 i5 i. m( m2 _
  43.                 frame.mainLoop();  * W0 x. R. q" [3 m7 b- g. o  o
  44.                 frame.showFrame();  & W8 P1 [+ [! c  Z
  45.             }  / W) `9 j  t6 q4 S# o2 c
  46.         });  
    ; ^7 d/ J! D% s- K: ~
  47.     }  
    . j' s; ^% {2 L* a- c$ N
  48. }  
复制代码

3 Z5 E  ^% }5 ?) ]9 V$ W( D( o2 ?# S0 X) Y. I8 a2 _( k
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币)
& z  k7 ^8 l& a; S, M3 @6 w7 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群 科帮网手机客户端
快速回复 返回顶部 返回列表