科帮网

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

动态微博

查看: 2862|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 # x1 s% J1 ^1 P+ P8 }! x1 v* R

# r6 x: {2 P* e: S& A# |: Y提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。6 s$ Q/ q" {/ q+ T5 S" H
, R/ Y! {0 ^' q2 J6 f
这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
! h3 Q1 p7 l$ ?* w' {
% R- y+ H% p" i. A4 X但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。
. P" b2 G/ r+ v# L( o6 f4 h9 N' W
+ a( F! o; z5 w) m4 g3 l. q推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!
+ H- V2 r! j" }; M0 V
. p- j5 Z; @+ R4 P, N本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。, h/ d9 a4 L7 G9 l( ]

- n( s9 h/ L  L6 o4 a笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。
2 [1 m( {1 V: ]# y  W& j3 q* Q9 @5 x2 `' R
目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。8 H0 D8 \. G5 o0 V( u+ O0 k
游戏截图:
8 e, [8 v% K7 j, e, v8 N

  f9 i6 l5 V' [! |; M( }

" R! E3 `& d# ^$ b

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

0 P, a: a9 a6 j+ |, y
启动类:

3 p7 C  I) x# x2 ~4 c) I
( A/ S, a$ q# B. M% m# F

; l! Y( U  Z* z5 F+ ~- Y0 p3 w
Main.java
  1. package org.loon.game.simple.sokoban.main;  1 B9 o; K6 y4 ?5 A
  2. import org.loon.game.simple.sokoban.GameCursor;  1 f5 S' i) ]6 B0 u
  3. import org.loon.game.simple.sokoban.GameFrame;  ( k6 o/ K* P: H! D
  4. import org.loon.game.simple.sokoban.control.Sokoban;  1 ~! A+ f5 |9 o1 b2 i" B
  5. import org.loon.game.simple.sokoban.control.Stage;  
      a; n2 i; G" I, i; \/ r& G
  6. import org.loon.game.simple.sokoban.control.Stage1;  
    , T+ T1 N4 f% _3 c
  7. /** ' M# U. @: F) A( i+ Q
  8. * Copyright 2008 - 2009
    ! B6 ~0 w: r+ f  J1 M
  9. *  
    0 ~8 P1 y. H; w1 C7 L
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not % q' _: Z, Y/ S  Y& g8 u2 ]1 A  f7 c; U
  11. * use this file except in compliance with the License. You may obtain a copy of
    # J6 M4 O" G' h% R  J' \- a
  12. * the License at ( @) Y" f' Y) U" T# \# ]
  13. *  
    * S* p) u; t5 l$ g5 C% e. O* A9 a
  14. * http://www.apache.org/licenses/LICENSE-2.0
    1 z6 N" p5 Q$ D( v9 P
  15. *  4 M9 U2 {! V( [  ^9 ~. t" d) J
  16. * Unless required by applicable law or agreed to in writing, software
    ! y- \8 ?- H( Q& q8 S3 O' c
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ( f$ O% J( S% b. A4 [& K) Y
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the " e6 h+ }$ ?+ g8 P+ ]( c) \2 q
  19. * License for the specific language governing permissions and limitations under
    / g2 P% N/ e9 N$ M* J
  20. * the License. ( T) y  J  U$ l; v4 ^% p/ W
  21. *  * U$ F  W% P: W
  22. * @project loonframework
    2 B; r3 x0 q5 j+ S' p; o9 T
  23. * @author chenpeng   ?' l* G, l. p7 {- E! _7 z
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn ; w" {5 ~- L- k/ W
  25. * @version 0.1
    7 [8 q4 E; |; N- }
  26. */  " }1 k! Q; Z' u# ^/ s% }' U5 H
  27. public class Main {  
    % p9 @* ^4 B! w; Y
  28.     public static void main(String[] args) {  0 D( m+ v7 \9 O7 A0 d. c- h* C3 X1 A
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  + e1 x" E9 O5 u& s4 n
  30.             public void run() {  
    ) ^& K2 t( Y8 `+ Q/ I: k% X7 }
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);    Z' W% |3 g- O& S6 C
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  6 S( H4 @" H- ~4 x4 J' r
  33.                 // 获得搬箱子关卡接口  
    0 i- K3 s" f% }7 B3 R( }
  34.                 Stage stage = new Stage1();  + x; w9 W! d5 W5 J! a) B. w
  35.                 // 设定游戏控制器  
    : s% m* _) {8 C3 m6 b9 N
  36.                 frame.getGame().setControl(new Sokoban(stage));  % X, d! z- S6 m: g
  37.                 // 游戏全屏  3 l3 f$ d2 \* e' V0 S
  38.                 // frame.updateFullScreen();  
    ) V* I+ O8 U& r; w1 X
  39.                 // 是否显示fps  8 y8 }; ~) c- g% b. g9 }* O
  40.                 frame.setFPS(true);  9 @& k8 a  m5 T; m7 G
  41.                 // 允许的最大刷新率  ' b( e5 v$ @" S& g" p7 G
  42.                 frame.setMaxFrames(60);  
    6 H4 S) u' y  J; z  @
  43.                 frame.mainLoop();  
    & A% V3 n: \3 L4 T
  44.                 frame.showFrame();  
    ! ~5 s' F" ]$ a5 L: F# O% s( k+ V
  45.             }  2 l% d! A1 X9 K9 q; Q0 M; m
  46.         });  * z4 u4 S1 L  u9 N- ]- d
  47.     }  
    : K. V2 y8 j8 B  c1 w8 _
  48. }  
复制代码

8 o, @! ]+ k- ?8 X7 ~, u+ f2 f' ~; o
+ i) F% v' D! r
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币) 1 N$ B2 P, B; b: c7 Y3 A

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