科帮网

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

动态微博

查看: 2863|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
#
发表于 2015-06-03 19:33:35 |只看该作者 |正序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 6 @  A. {: m- w) ^5 i. P9 P

% L2 A# t% w( ]* ~提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。9 [6 F% L" M6 V% H" s

# W1 ~2 n5 S7 a这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
" p3 J' I" s: o, t& m$ E% |. D# I  s( A! D9 F: R
但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。* u: `1 {! \' ]( s, Z

. }1 H  J6 N! G5 J7 d5 z& \7 _1 u推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!) `. [5 O. H# R0 i: L
: X6 Z, x& x" e' O
本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。; j6 i; `! r! @6 U/ N6 o; l2 v
. o/ q# m: ^1 {/ k7 p2 H
笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。+ v" ?; ~2 k# D) G
" B2 \; L8 O# s1 D: j% k5 u9 j+ K
目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。% H( v8 M8 B( `1 I- V% Y& j8 H- X
游戏截图:

. z3 ?7 Y. Y- V$ ?: X
0 f6 i3 e0 |: o* F4 \8 h! M1 @6 h6 o
- v  B$ w4 L# O6 D( V9 N0 r

' e: }, Z4 b; i# T8 I! i

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

9 K$ V6 P+ v' I9 I) r' x3 u: G
启动类:

: }; v9 }1 @4 I) R6 ^( [) C, Z8 z
$ D2 P+ A1 g: k

) n1 n9 y4 E; Q3 g
Main.java
  1. package org.loon.game.simple.sokoban.main;  
    % G0 y9 e" C+ Y' s7 P% q
  2. import org.loon.game.simple.sokoban.GameCursor;  ' G9 j+ T' q6 w( E* S
  3. import org.loon.game.simple.sokoban.GameFrame;  
    ) y, W$ D( i" H8 s9 Y8 h3 j( `5 h# \$ r
  4. import org.loon.game.simple.sokoban.control.Sokoban;  3 O8 C- ~! C5 `* ]
  5. import org.loon.game.simple.sokoban.control.Stage;  
    ) ^( D: y0 @" S
  6. import org.loon.game.simple.sokoban.control.Stage1;  
    " {! Z# U5 _4 r, ]* y! H
  7. /** ' ?9 {; c) F6 T4 y7 D: U5 f( j
  8. * Copyright 2008 - 2009 / C! Z( E- [- |6 [- ^) O2 d
  9. *  
    $ ]5 O, X# [$ T6 e/ d+ V- ?" w
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
    8 l, p+ b" q2 B$ Q7 S
  11. * use this file except in compliance with the License. You may obtain a copy of / R/ X' L& y. s" x. I3 |) o$ y
  12. * the License at % r  ?) G2 a$ i9 G6 F
  13. *  5 r( z3 m' N# W4 s0 h! u9 A
  14. * http://www.apache.org/licenses/LICENSE-2.0 4 M8 n7 T2 h5 ~* _
  15. *  * h3 h% U- k2 a" \
  16. * Unless required by applicable law or agreed to in writing, software
    ( B9 M( x! [- h0 Z+ x
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT " ?. U9 Q  f4 ]% |0 R/ c! |
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 7 h1 t2 G9 S) Q+ Q- G$ ]
  19. * License for the specific language governing permissions and limitations under 7 A. S" ~! @/ U$ p5 t  n
  20. * the License.
    $ Q( t* H! R3 ^& Y6 z# V0 q
  21. *  
    " d! u( J0 k" ?. q  p, [, k
  22. * @project loonframework 9 @- f1 a: S3 D
  23. * @author chenpeng
    8 u# p( C5 g7 G
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
    6 L  S. B2 h( X. W# D) v: g- Q
  25. * @version 0.1
    2 Y7 v4 ~) m+ ?, {& c9 o7 y3 o
  26. */  
    5 T  L2 x4 {0 @! H& X5 X8 R0 e5 H
  27. public class Main {  
    5 {8 Y* z- S( @; N' D- L- i
  28.     public static void main(String[] args) {  
    * X2 s8 g# U" ^, s0 Q; I- Y
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  * r* a' |$ ]( T! [0 t
  30.             public void run() {  0 o$ n1 I3 Z9 ~$ h
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  
    % p2 E+ r; n- R
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  ( Z6 i1 e' W) P; z
  33.                 // 获得搬箱子关卡接口  1 [% i4 n8 \) b# S. J
  34.                 Stage stage = new Stage1();  1 ]& }5 e6 P  {+ o
  35.                 // 设定游戏控制器    h- ?% R& d" p) w! ?' U
  36.                 frame.getGame().setControl(new Sokoban(stage));  
    % H5 U/ S2 W3 R
  37.                 // 游戏全屏  ) C6 x. Q$ I2 }" W: u+ J+ e
  38.                 // frame.updateFullScreen();  
    1 g6 Q! A: P+ q8 {, u4 a
  39.                 // 是否显示fps  2 j, S2 @* ]# Y) G$ A. T% y
  40.                 frame.setFPS(true);  
    . g( Y/ y4 _6 O: V* b/ q
  41.                 // 允许的最大刷新率  6 h7 t8 T' U' R& N" {+ q
  42.                 frame.setMaxFrames(60);  
    + j2 {+ p2 \' O4 L
  43.                 frame.mainLoop();  0 S( M1 f* x! E( R
  44.                 frame.showFrame();  
    0 `4 ~3 y  B) o
  45.             }  ! u6 k: Q- }7 p
  46.         });  8 A& S9 C: T) n5 a5 h
  47.     }  # s8 z9 V/ W3 h$ ?+ |. D
  48. }  
复制代码

- A" t# ^: U$ O# V  V5 S
* a3 A7 H5 Y3 A% u/ Z
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币)
* E3 h4 a7 `* x: [( ]- D

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

周末了 哈哈

0

主题

0

听众

524

金钱

四袋长老

该用户从未签到

地板
发表于 2019-06-10 16:33:14 |只看该作者
谢谢 最近在研究Swing
回复

使用道具 举报

5

主题

0

听众

316

金钱

四袋长老

该用户从未签到

板凳
发表于 2017-08-12 20:49:12 |只看该作者
不错不错不错不错
回复

使用道具 举报

1

主题

3

听众

341

金钱

四袋长老

该用户从未签到

沙发
发表于 2016-03-17 22:12:13 |只看该作者
学习一下。谢谢
回复

使用道具 举报

2

主题

1

听众

1352

金钱

六袋长老

该用户从未签到

楼主
发表于 2015-06-04 00:11:31 |只看该作者
楼主好屌啊!!!!!!!!!!!!!!!!!!!!!
回复

使用道具 举报

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表