我的日常

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

动态微博

查看: 2782|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。
2 }# Q1 V& w" w) @* |) g
3 U- ^" n% @" S4 Y& d; I提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。
7 d; R$ n/ n1 H1 u* m
5 |  ]/ N' |4 b8 `$ E6 a8 @0 E这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
3 Y  K5 ]& d' _2 a6 c9 o: c5 l7 W$ `
3 J' t2 Q/ J( T- b但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。8 H" q' o& e# v, e, Z

' `( c( s2 b; y0 m6 q推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!
+ N8 N3 Q3 G# ?( L' y; M2 o5 F
+ v( W0 w, M3 Y. c! r6 H本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。& [$ n  }+ w+ N& Y* x2 W: f8 q# M
6 h$ G% T- h( ^0 V. J" b
笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。
+ _7 B, t# O' C2 i" x! o0 Y( H" n+ F9 u. C
目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。( J6 k6 q/ y) K; k- O
游戏截图:
0 o; l/ X2 k( z5 k: r% E# ^
% ^) n7 X1 N7 X0 A4 J

# @! o/ l( j* s  X& I5 a  c- Q
, V6 {" A+ S7 g* d+ [- ?
5 f$ K& Z( o/ V& ?( e
核心代码:

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

' D: H* p, H- l  s4 T
Main.java
  1. package org.loon.game.simple.sokoban.main;  
    4 y, x* D5 O1 [3 Q% _
  2. import org.loon.game.simple.sokoban.GameCursor;  
    & T+ X7 s7 E& B7 B- ?
  3. import org.loon.game.simple.sokoban.GameFrame;  * `( ~7 i6 L$ [8 X7 w- a& I2 L: k2 P
  4. import org.loon.game.simple.sokoban.control.Sokoban;  
    + ?! z6 l5 Q+ i9 ~7 _8 Z) O/ z! [
  5. import org.loon.game.simple.sokoban.control.Stage;  ! z7 @  A+ q. q9 F' `5 G0 V6 \1 D
  6. import org.loon.game.simple.sokoban.control.Stage1;  
    * G- H3 U3 @5 t% w
  7. /**
    2 g9 y1 M- R$ z3 _6 ~7 ~
  8. * Copyright 2008 - 2009
    / [+ B3 j. A( M7 C6 O+ q3 _
  9. *  
    . @! I6 @2 @3 E" I' l7 M6 O) A* f
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
    ) L7 G" A, Y3 r8 i2 ]* E/ G7 n
  11. * use this file except in compliance with the License. You may obtain a copy of : x& u' e8 L$ P
  12. * the License at
    $ r( g; @4 W+ {/ ?9 v! c, e
  13. *  $ I  K* c- f* O4 z! u& h: }% M
  14. * http://www.apache.org/licenses/LICENSE-2.0
    " ]: T6 x: g0 G6 \: w
  15. *  & M. F/ j5 P* I& s: x7 y  C  z* X
  16. * Unless required by applicable law or agreed to in writing, software ( F7 m5 N9 V$ E4 z$ w
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    , P5 n! v* A* H. v5 P( X: q
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the & K& o- V; q6 j
  19. * License for the specific language governing permissions and limitations under
    & ^5 E, N; Q3 o+ T' P
  20. * the License. 2 x) H5 u0 L  j9 E! F) q
  21. *  
    5 y* U5 [  B# v  K$ [  i
  22. * @project loonframework ) o& L% m# f# k8 Q& I- l% W1 R
  23. * @author chenpeng
    # t" \: @9 N% K$ i4 f
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
    / \8 ]8 {& A8 L% X# d1 D! E
  25. * @version 0.1
    6 u/ w" `7 n. T
  26. */  
    : t+ o/ G: c+ F) l
  27. public class Main {  
    1 z( y- Y0 f: K, m" M3 t- \
  28.     public static void main(String[] args) {  & C, Y) w1 _2 m& d% k
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  
    " R' B' u1 |6 ~) G
  30.             public void run() {  
    ' r* c/ m8 r3 [- q' b
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  4 w' y5 T8 Q* \' X3 T" r
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  
    ; p) v: C* o: v8 k1 d' E$ z
  33.                 // 获得搬箱子关卡接口  
    ! F: |9 v6 A* p! [- H
  34.                 Stage stage = new Stage1();  
    7 M- u4 z6 G  L/ [3 F
  35.                 // 设定游戏控制器  ! h$ x- \: w( _
  36.                 frame.getGame().setControl(new Sokoban(stage));  
    1 {1 U2 l1 q# F4 l
  37.                 // 游戏全屏  
    ! N$ ?! o4 k& x* p  |
  38.                 // frame.updateFullScreen();  
    1 M# {+ }, T. c
  39.                 // 是否显示fps  
    ; i  w& q' _% Q; E
  40.                 frame.setFPS(true);  
    ' ^) _$ f* y1 S6 F% s3 Y' E6 ]
  41.                 // 允许的最大刷新率  
    % ?  B# c+ H4 g( T7 Z. A
  42.                 frame.setMaxFrames(60);  : w" z* u, V8 W& X  V6 f0 z
  43.                 frame.mainLoop();  
    2 S9 v6 `* B  V6 z6 E
  44.                 frame.showFrame();  
    : ~- f$ Z' R% H: F% E" _6 E! }
  45.             }  + {( ]) y' G% \. {; t5 y7 H( {
  46.         });  2 Z! |4 c" E9 D0 |. h$ g. J# W
  47.     }  
    2 A7 C+ ~4 l, p
  48. }  
复制代码
1 Y' ~2 z2 w. _6 F+ b; X
7 {. G- J. i$ e( c3 t
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币) 4 h% g: p$ P! q% ]$ A

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


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

周末了 哈哈

2

主题

1

听众

1352

金钱

六袋长老

该用户从未签到

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

使用道具 举报

1

主题

3

听众

341

金钱

四袋长老

该用户从未签到

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

使用道具 举报

5

主题

0

听众

316

金钱

四袋长老

该用户从未签到

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

使用道具 举报

0

主题

0

听众

524

金钱

四袋长老

该用户从未签到

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

使用道具 举报

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

   

关闭

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

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