我的日常

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

动态微博

查看: 2785|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。
4 Y# b1 M# P0 c3 D# Z8 i2 x. h1 c! `' b" Y9 P! L1 a
提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。* b( a* a% d' P
* ~& X  A( V- B* |8 T* B
这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。- W' c) k% e' }8 X8 _2 q% l' S
/ d, Q$ J0 i9 j. I; R$ Y
但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。
7 G& E; m' C2 v% A4 j. w4 N5 ]/ h* X% R7 [9 s
推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!" `  g6 w6 j9 J" }# ^" S* {) B

. X  C2 V6 [% \9 C本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。1 [% l; s4 {9 X

/ Q, V+ {8 V# H& N+ X" l4 i$ K3 a. ]4 O笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。: d+ M( n& @  G

& x$ M. i- k' Y1 Y3 U2 J目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。/ F: X7 _2 \8 R
游戏截图:
! f, ~8 K2 a1 Y6 t! O7 o/ Q

! a. f9 ~: m- E! Y
- D3 f7 F( b6 H, X9 J" Y( Y

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

4 V5 B( b" O  Q9 `$ f4 a4 P
启动类:
. l( D2 l# z* N5 b8 j' `
9 b/ ~' S" M7 e: }1 O

% P9 k% Q1 h8 H5 l" O
Main.java
  1. package org.loon.game.simple.sokoban.main;  
    - k9 o' H8 {$ E* r  [
  2. import org.loon.game.simple.sokoban.GameCursor;    n( j# E  t- U
  3. import org.loon.game.simple.sokoban.GameFrame;  
    7 ~: u3 U2 [7 j- U1 B
  4. import org.loon.game.simple.sokoban.control.Sokoban;  
    5 C4 N, _: Q9 A+ Y" h: M1 p* Y
  5. import org.loon.game.simple.sokoban.control.Stage;  & c7 ?$ V7 C- x% V8 n# c. ]
  6. import org.loon.game.simple.sokoban.control.Stage1;  
    / ^) |* T7 \# ^7 p. s
  7. /** 8 X' W  x7 E# s8 y9 a
  8. * Copyright 2008 - 2009 , u) p% k+ d- a" z
  9. *  6 ~4 s! x: V; e: f( {
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not 9 U& r  `5 T- Y+ ?7 O2 j7 ?
  11. * use this file except in compliance with the License. You may obtain a copy of + T( _* H$ y, o% B% W9 t3 h( h
  12. * the License at $ W: q" ^- |3 o, w
  13. *  
    " k+ B7 }7 c+ A3 _2 @
  14. * http://www.apache.org/licenses/LICENSE-2.0 6 P& _$ o9 R" P, t
  15. *  
    * N% z( L; Z( L/ O3 K
  16. * Unless required by applicable law or agreed to in writing, software   V/ T0 }6 e1 s  D8 w- \2 ^
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT & Q: h# ?" R+ N
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    5 M6 A& z( N+ y& U$ e
  19. * License for the specific language governing permissions and limitations under * H, K$ X5 \* d4 e0 {
  20. * the License.   i1 w5 W; C& M' g2 Q1 U  Z9 v
  21. *  5 X3 A& z% w; }
  22. * @project loonframework % o4 m: [6 h7 b2 S# a  X* b
  23. * @author chenpeng
    . }* `7 l4 N! z. i$ y* N5 h$ 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 0 |9 T5 ?& x. f* D! f5 e0 n1 T+ L
  25. * @version 0.1
    + K( C. X" h* l, i9 G- l
  26. */  
    & S: H0 Y$ L/ W
  27. public class Main {  
    3 k1 i. h6 g" k( G
  28.     public static void main(String[] args) {  
    0 H. S5 ]  b6 F- T2 m
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  ; d1 y) z* v" X4 @! x  I
  30.             public void run() {  
    0 t1 i: g" b9 J: o
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  
    $ b' K4 c. N# M  M/ i
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  ; M0 O% B& r3 G) d8 [8 u
  33.                 // 获得搬箱子关卡接口  % E' g" k4 V; W2 j( g( ^8 ?
  34.                 Stage stage = new Stage1();  
    ' M0 }- K" E# p' Z
  35.                 // 设定游戏控制器  
    ! |* F  p$ t9 j8 p% v
  36.                 frame.getGame().setControl(new Sokoban(stage));  
    ' Q2 [% t# c5 {5 b7 ~* w3 t
  37.                 // 游戏全屏  0 a" \. A% T7 S" o0 B. Y
  38.                 // frame.updateFullScreen();  
    8 I8 a2 g8 ~8 C$ z% @* E
  39.                 // 是否显示fps  
    # y& ]9 e/ X6 k- H
  40.                 frame.setFPS(true);  
    6 x6 t1 |7 o9 k
  41.                 // 允许的最大刷新率  # d4 f! ^  P2 j" B
  42.                 frame.setMaxFrames(60);  + G7 o& t* o0 G( u
  43.                 frame.mainLoop();  
    / \/ c# R: T2 v* s: ^: b* m
  44.                 frame.showFrame();    o6 a/ J. P: Y$ X
  45.             }  
    # |; B. e: d6 r4 ~- A& j( A8 l
  46.         });  + @( }% Y$ X# T1 r
  47.     }  
    ! l  _. t. o; _& w$ O
  48. }  
复制代码
/ g: S% d# b9 x# o
9 N5 B9 ?3 Q5 M  |' h# [7 e' G( y4 `
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币) , B/ t# ^5 G: r3 N- l3 `8 G

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