科帮网

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

动态微博

查看: 2864|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 9 ?- Z$ g1 {+ u% O. E* p/ I

5 R: N  M- L# f$ k/ l提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。4 G3 _: X+ e: t1 F' S

$ v; H; e" Z( h! `' E# S3 x* y这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
( g: }. J$ ?0 a& P
" C. q1 p* W) E- G9 Q: v; H6 u' l但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。6 y% N* \9 h  ]( `$ G1 r& C

6 {  N2 @; a1 |+ \推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!5 x1 S7 Z8 p- |4 ?3 x) b) m

, [/ R( v4 P" ^/ V6 m本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。# N, L/ |$ o2 K8 S& J% U. x

2 F8 a# [& n* ~- a- ]/ a5 _笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。0 f0 A& j7 T$ |) D

4 }! P) f9 I8 H5 Z! Q; u目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。. c# F: I6 ~2 B' i7 F
游戏截图:
9 Q! J  k4 h7 V/ O9 n
( G" x$ F3 k( q. m" b- u

* I- D* p9 d& W7 J+ i
7 J( w+ N& ]$ |# Z+ P( {) z

% W8 I: v* h4 S
核心代码:

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

8 _3 W+ T  f- I3 A. m) e( x
启动类:
3 H2 T3 G, k7 |. H" t3 T; ?
; |. ]; T; b" x8 }) F
- P$ w, r8 E+ J! a, C$ D" H) C* r& [
Main.java
  1. package org.loon.game.simple.sokoban.main;  * U& [5 `6 G" N' [9 G
  2. import org.loon.game.simple.sokoban.GameCursor;  
    1 _- o3 E4 q) u3 k6 a0 k
  3. import org.loon.game.simple.sokoban.GameFrame;  9 m0 F4 d( J3 {
  4. import org.loon.game.simple.sokoban.control.Sokoban;  
    4 y( e. `- p' N
  5. import org.loon.game.simple.sokoban.control.Stage;  
    # X6 Q( {; r3 w* r7 f
  6. import org.loon.game.simple.sokoban.control.Stage1;  ( d; b3 Y3 C9 ]& V6 ]
  7. /**
    % @" o0 e! O4 V- W+ @5 @) {' ^
  8. * Copyright 2008 - 2009 8 V  j6 a: g: ]$ n& m0 e* Y
  9. *  % k% a4 \" Q( u; P1 i' O
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not ! `% V. c3 h  k. X3 g: ^$ i( L! x
  11. * use this file except in compliance with the License. You may obtain a copy of
    7 V" o9 J+ X7 d% \# T
  12. * the License at + J4 M* G3 _) S
  13. *  
    4 ^7 q1 M3 ^8 M% ~
  14. * http://www.apache.org/licenses/LICENSE-2.0 5 N9 r1 R  C( }
  15. *  # P+ T$ j4 X$ b; q/ a
  16. * Unless required by applicable law or agreed to in writing, software
    ' N: _* E6 t  G/ @/ F' q, Q* @
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    ( q$ G4 P: D( t- v7 c7 d
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the / H* C: P4 ~( k+ h( }& |
  19. * License for the specific language governing permissions and limitations under
    # r& F2 J2 A( q9 G2 ~9 \
  20. * the License.
    4 Y/ v+ x/ j4 ]- k& M$ Y) Q
  21. *  
    % P& Z" J3 W/ `' k; s# |+ `3 N
  22. * @project loonframework % A" v+ h- H$ E
  23. * @author chenpeng : e! t' h! h( `3 `
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
    # v, o6 O6 k& y
  25. * @version 0.1 7 c: V3 x1 @, d' u3 o, M. G% D: z
  26. */  
    2 ?3 R& ]1 G# D  p
  27. public class Main {  . Q' y% c9 R9 q0 f3 B* ?
  28.     public static void main(String[] args) {  + z0 Y9 ~" r( Z# u) C# }
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  
    ' r9 t0 }$ A1 y( M6 k3 X# K2 P
  30.             public void run() {  
    1 U; x' A2 [7 [! w; Z: G
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  : M8 q% W* u4 G! C# n
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  6 M+ p, }# B- ~" K: o
  33.                 // 获得搬箱子关卡接口  4 J' x  p; c( A" Y- Z" i& M, m2 e
  34.                 Stage stage = new Stage1();  
    - t6 ]3 o. M' N6 S* K* P7 g
  35.                 // 设定游戏控制器  
    * R0 `8 T" w! U% h
  36.                 frame.getGame().setControl(new Sokoban(stage));  
    ( k! t9 f/ r, V% h
  37.                 // 游戏全屏  
    % a6 Y: A5 |2 {7 d2 _. @' O) i) I. I
  38.                 // frame.updateFullScreen();  
    ( D) b$ B4 r) n2 u7 [/ s
  39.                 // 是否显示fps  6 [4 u! |7 x1 z( f
  40.                 frame.setFPS(true);  
    / R+ H6 ^; X% o1 h5 J* c
  41.                 // 允许的最大刷新率  
    + A6 h( ^4 I) h1 b
  42.                 frame.setMaxFrames(60);  : I+ \* R& |" ?$ c/ B
  43.                 frame.mainLoop();  
    : P. x$ `4 G  c/ u5 t" L# {2 D, o& P
  44.                 frame.showFrame();  7 Z5 ]$ x4 B: ]. W  _2 v7 B& H
  45.             }  ( d0 t5 d; L9 H9 R; \
  46.         });  ! h$ }' T2 j& {7 c* U& `0 A) I
  47.     }  
    ( |! y7 }% `* n" b
  48. }  
复制代码
1 \' f! I/ B9 [3 `3 A2 S6 e
/ e( Z- I- Z. t0 E  x6 K
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币)
7 j& }1 `3 O% J& j

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