我的日常

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

动态微博

查看: 2787|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 ) I& h6 e# ?" k
5 V/ A* G3 D) K/ G
提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。
, _+ {" G. q1 A9 @" C6 I
; N/ S: d7 J" V" ^8 s" d这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
) j1 D) |0 H, {" P/ i, n8 e  k% v1 d2 v/ L
但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。$ s1 E4 m5 @6 u. O7 I( Y( c# V4 U/ M

: z/ O! w! g# P/ S( i& g推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!: I) ]% Y+ Y- l* J! T0 p

3 o1 H0 A3 k- n+ K* L. ^  E1 a本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。
9 p# s: ^& ^0 ]3 a! l! \& |2 k1 O9 x" H) y
笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。# R4 w' U# }4 f( l: z' N
/ a- i- {5 a4 y8 O* x% ~4 [( V
目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。0 f# c- B/ S& T0 `
游戏截图:

8 L' P: a$ q/ c/ s# H) ]6 j' z) O

8 r1 u! Z8 D1 p7 N; X6 F
& g. y- a2 S5 Q0 @

4 n% w/ A5 }2 l0 m% V

( o/ M  t9 f% B! r, ]3 k
核心代码:

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

% R% _. N+ x; G: `! S/ d. j7 z( ]4 _
启动类:
0 E7 p  Y% C9 w# e9 X

6 ~& ~" E% ^3 h$ l5 v

6 e+ b9 [# ]$ u- K' O
Main.java
  1. package org.loon.game.simple.sokoban.main;  
    9 y/ N; Z. C8 ]* ?9 o4 N
  2. import org.loon.game.simple.sokoban.GameCursor;  
    + W8 h! }( D* H0 Q3 v8 a
  3. import org.loon.game.simple.sokoban.GameFrame;  . A. c0 K) c! [" T& N
  4. import org.loon.game.simple.sokoban.control.Sokoban;  
    + q( ]0 ^8 H! N) N
  5. import org.loon.game.simple.sokoban.control.Stage;  
    1 N1 `. e: ]; `" y1 Z
  6. import org.loon.game.simple.sokoban.control.Stage1;  8 q6 f; [$ ~! O! d+ j: U
  7. /**
    : l  B5 _; Y- ~! m$ S9 U
  8. * Copyright 2008 - 2009 9 W8 a: a2 W) v6 H* B/ J2 h' |
  9. *  - q7 @% P6 [5 f; R' _! l
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
    9 z) T9 z5 d# F* S( r; e. X6 M
  11. * use this file except in compliance with the License. You may obtain a copy of
    8 P$ }* O7 [5 G
  12. * the License at
    0 O( k' {! G- S6 H
  13. *  
    6 U  {8 \: Z6 P: s2 v' l
  14. * http://www.apache.org/licenses/LICENSE-2.0 # ~9 q1 [! Y9 M0 g& d
  15. *  
    * Z) _/ E. K4 v! T( K9 U0 Y4 _
  16. * Unless required by applicable law or agreed to in writing, software 2 |; a7 b! |: W2 K/ O+ u: @6 u) C) `
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    0 C) L4 v7 \& p/ g5 ^
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
      I' R+ `4 m6 F) k: V9 B/ Q
  19. * License for the specific language governing permissions and limitations under : V5 M8 Y3 }' d0 y- V2 S+ f
  20. * the License. 4 ^6 B5 ]6 s5 Z: P
  21. *  
      i6 l# M# n3 w' t! m/ K
  22. * @project loonframework
    & q6 z# Y/ K, a( x1 }* t; ]
  23. * @author chenpeng " }% W; j3 h* W8 s
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn 7 Y' j- q; M. M+ E
  25. * @version 0.1
    6 ^" K7 {% Q4 J  b$ M6 h5 L. b
  26. */  : i/ o1 s" |7 ?9 i1 j4 P" I& M
  27. public class Main {  
    & ~8 Y6 j* v% h' C0 ~4 _
  28.     public static void main(String[] args) {  - ?+ {! X2 y2 o* s( f
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  
    7 r0 a" p/ O. F6 I
  30.             public void run() {  
    & q8 r1 D$ B7 s9 K8 Q8 Z" M5 q
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  
    # z1 ^- G- ]0 t- r4 h- N! k; ]6 N  P, g
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  ; l# m! E* P5 `1 L8 n7 P) h
  33.                 // 获得搬箱子关卡接口  
    2 G5 d- s2 |- r5 C
  34.                 Stage stage = new Stage1();  
    & M2 T$ H' W/ W
  35.                 // 设定游戏控制器  
    9 h/ H, C' m7 I3 ?5 e- c6 i/ v- ^: u
  36.                 frame.getGame().setControl(new Sokoban(stage));  - N$ M& S8 h& r4 T
  37.                 // 游戏全屏  
    1 v4 D4 u* M: J& Z& L: b6 u
  38.                 // frame.updateFullScreen();  
    4 s2 l# J9 S9 ^& Q% m( J
  39.                 // 是否显示fps  
    9 [/ j3 l/ b+ ~/ J$ ~& E
  40.                 frame.setFPS(true);  
    # A2 w: e7 D6 K& N: u: _
  41.                 // 允许的最大刷新率  : y, l2 V) n7 E- k3 V
  42.                 frame.setMaxFrames(60);  
    2 Q/ H6 Z2 W; m( \: `3 D% @0 Q
  43.                 frame.mainLoop();  
    " [5 N( g3 y/ S& W& D
  44.                 frame.showFrame();  % n. c# j7 D' a4 L
  45.             }  
    % q* m' [; F2 @4 O
  46.         });  & M" ^$ x! ?- [" _' |7 t
  47.     }  ( H0 u! S. J& Z) o) ]$ o, ^
  48. }  
复制代码
$ i  H9 V- O7 t1 J2 t( p

0 z+ k+ K/ c* C
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币) & ~8 f8 F# j8 Y8 ?4 n& `) `

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