我的日常

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

动态微博

查看: 2783|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 / i  j% N- m) M$ D! _& |

0 ?1 `# z- y: B/ K  ?4 b% f% n. c提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。. r1 f" b4 r( u# I0 ^4 B

# o: c7 c3 ]) e% a: L: ^' a5 h6 ]这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。5 p' t- ?: b; J

+ |% Z- D+ C0 k- l5 k2 w但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。
, B! G2 O% D) S  R& H4 D. G9 |" A( |
推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!
* G9 p9 k7 F. P1 j$ A$ D& e/ `! [9 V( h7 T/ `+ _. G, f
本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。9 Q# S( R# a. l* w7 V- Y

- U0 g/ y. K# g笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。4 u  {% I' t; y3 K# v+ a5 c9 C# C& e5 d

6 A- x# M# O& r2 J& n" v目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。5 P4 E* x) t5 `. ~! `8 {5 \3 o
游戏截图:
$ x; U( D$ F0 m( X0 W
+ u- Y6 H/ a0 f8 J
; F) J" k3 Y! O

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

' O* u# r, s8 ]1 n4 u* [
启动类:
4 N$ ^# O5 E" |; B$ z7 R; v! `
4 H5 Q$ |  `4 A  `- W9 {4 T

2 L; p! N7 K. I  n% Q0 M
Main.java
  1. package org.loon.game.simple.sokoban.main;  
    5 K/ d! s) P* Y; H+ p
  2. import org.loon.game.simple.sokoban.GameCursor;  . v% g. e# P4 A# F) ]
  3. import org.loon.game.simple.sokoban.GameFrame;  
    * U8 y& K+ h% O" c. n( [6 M5 `
  4. import org.loon.game.simple.sokoban.control.Sokoban;  & L( O1 a; Z" E( |* w1 Y5 F
  5. import org.loon.game.simple.sokoban.control.Stage;  
    ' n/ u8 j2 w7 `' A) |( x
  6. import org.loon.game.simple.sokoban.control.Stage1;  
    $ K# X" M: u' {0 V: o2 E
  7. /** + g' Q6 [% E& l- z: R( v
  8. * Copyright 2008 - 2009
    # I$ X& S0 O! y4 ~2 b$ `% Z# ~
  9. *  
    1 F# ?% J4 R5 y$ }
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not 6 o6 B' @9 b. f+ W5 U! I
  11. * use this file except in compliance with the License. You may obtain a copy of
    + }/ I9 S' ]$ n; y& z- `6 {+ _" Y6 \
  12. * the License at
    ( J! R# U5 q2 w% p! e
  13. *  
    2 c6 c1 d0 l5 _$ ^9 D, X) z
  14. * http://www.apache.org/licenses/LICENSE-2.0
    1 z0 |6 S5 K8 \4 M
  15. *  
    4 a3 ~2 ^- O. s5 X* V0 A
  16. * Unless required by applicable law or agreed to in writing, software * x' P+ I: W  t; [
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
      {+ I  G, g  H( `$ s
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    . O, {  B2 |+ `" g5 S" x+ s
  19. * License for the specific language governing permissions and limitations under
      A, `) j* ?3 I( }7 {' H: L
  20. * the License.
    : ]) a' ~. ~+ F( D! W6 {
  21. *  
    : H, T3 O! |2 F/ E
  22. * @project loonframework , @0 G4 ^/ d7 w* Z7 [
  23. * @author chenpeng 8 W/ \' Y' }4 m& J6 }* X
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
      [, _0 |. \5 @  C
  25. * @version 0.1 1 `( F1 [$ K, M2 d9 M% n' s
  26. */  1 b+ P- H% ^9 h: e1 z
  27. public class Main {  ! ~* x" A7 e  z' O' ^4 E
  28.     public static void main(String[] args) {  
    # ?/ Z6 m8 Z% n8 q- b$ @
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  
    " ^1 X$ b' l3 j. a) b. H/ h
  30.             public void run() {  
    $ D; y! i3 K/ W
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  - c4 R8 J4 F! d7 A# D
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  1 F; g# ]; H5 x- o3 W& o
  33.                 // 获得搬箱子关卡接口  
    : g7 ?7 c( O5 y# @1 b- |. r
  34.                 Stage stage = new Stage1();  9 u) y" g) y8 K% L
  35.                 // 设定游戏控制器  ( D6 [. T6 k; ^# I, b
  36.                 frame.getGame().setControl(new Sokoban(stage));  * }( T. P7 S+ X& c( Z8 _; J
  37.                 // 游戏全屏  % s$ u% g9 o8 B( \4 z% k) B* Q* ?) x! ]
  38.                 // frame.updateFullScreen();  / y: d+ R* ?  [, O' ^: t
  39.                 // 是否显示fps  " j8 I5 ~* {8 l& N* z- _6 C* N4 h
  40.                 frame.setFPS(true);  8 t% p  m3 g0 j2 v# c1 T( ~& `) l
  41.                 // 允许的最大刷新率  
    2 y  d. b+ m. g; _
  42.                 frame.setMaxFrames(60);  
    * [1 ]* A+ G4 z7 b) }
  43.                 frame.mainLoop();  ! v; Q6 ~$ U9 t0 t% t1 _& i- i
  44.                 frame.showFrame();  
    . S/ c! q) L2 m1 E" f9 }
  45.             }  
    6 L0 l$ |( P# s7 j3 w! I  |; z. K& f
  46.         });  
    $ ]+ \# s7 I! Z' e4 Y4 Z- b
  47.     }  + A8 c7 b9 Y2 s7 U) P& b5 ~
  48. }  
复制代码

8 y8 b4 z; U6 o  N4 X' k9 N, L  }; I% u* a. x
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币)
. c5 T' C7 Y; y) Z" d8 _; 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群 科帮网手机客户端
快速回复 返回顶部 返回列表