我的日常

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

动态微博

查看: 2784|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 % [2 P% z2 l+ X" l' T' _$ _' }

$ |  A* t/ R( R" X. O提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。
9 S2 ?3 m/ i' k9 k( C4 _( I, ~$ Q- @5 r5 V! Z
这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
3 a3 z* g7 {" e2 A! b/ D9 y/ r. R7 a4 r* N
但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。0 ]7 Z. R7 A8 a$ Z% m

% n4 u4 ]1 t+ Z0 ^- }% W推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!
9 s* j, A/ K: @1 `1 M% R) K6 u6 m: l# C. G
本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。( N$ r: c6 l. C
; T5 }3 }, V% [) ~1 x0 }  J5 Y
笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。
, r5 D( E+ b5 P/ b/ J
" q! M( k! F) d0 _' K目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。% S* b: K1 ^* \9 ~5 Z& ]' V
游戏截图:

4 e' w9 |5 ~; s0 C; h* v; l

7 @( V5 |7 e+ O( m% p  h
1 \1 I& r; K/ o" r

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

: y; D2 ?, H0 R: r- x
1 \" i1 R( o3 Z
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币) " C9 J2 s: q0 }6 I  a( c

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