科帮网

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

动态微博

查看: 2861|回复: 4

JavaSwing实现的推箱子项目源码

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-03 19:33:35 |只看该作者 |倒序浏览
推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。 , c- s, ]# O3 G
0 B$ n1 f! b: i! C& v
提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。1 p( ^2 ~3 n6 P- w5 g! v
2 n# e' L7 S! r$ o2 U
这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
: U# b- x5 S: y. Q8 C* W
" o, ^% ^: S: ~+ C9 o: R0 t但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。7 [5 }6 a" f" M3 d
3 l1 H8 q  s/ s: a3 V! a
推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!
+ |3 _7 \: I& s3 Q
/ K) e* f4 x3 m2 z9 ~本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。
+ t4 N' P# b/ M' h
3 X/ }1 T* V. p2 v" _9 V笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。9 Y; A+ A" u" G2 q9 x

& y" R- c2 o2 l/ l' i0 B/ ?目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。
8 X2 g2 \6 r2 m) n/ p! h7 y( M
游戏截图:

9 b7 q1 [1 p6 _/ U8 N3 Y% p

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

- ~. H2 S/ W4 D7 Y; \; M
启动类:
! a; ^; X, w, |# K9 z; R1 v

4 g, C0 {! y0 N$ N2 K3 J

3 S: Q: d8 ~, f; P
Main.java
  1. package org.loon.game.simple.sokoban.main;  # F1 R% l) d% ]6 d( m
  2. import org.loon.game.simple.sokoban.GameCursor;  ; H2 L3 t' o3 a; L8 g- \
  3. import org.loon.game.simple.sokoban.GameFrame;  - B* j$ f$ u/ x
  4. import org.loon.game.simple.sokoban.control.Sokoban;  
    : _" w7 J! |' v6 x; p
  5. import org.loon.game.simple.sokoban.control.Stage;  
    * e* I1 V) P3 ?# k+ K4 b
  6. import org.loon.game.simple.sokoban.control.Stage1;  2 p8 M( R3 p+ P5 I4 W' c
  7. /** / S* t+ t5 U# N
  8. * Copyright 2008 - 2009 4 s, Q. N& Z0 }( M) G
  9. *  ' T) V" ~; j/ j  H  a1 ~. a
  10. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
    - L6 Z: j- N% c0 H) }/ l* l6 W
  11. * use this file except in compliance with the License. You may obtain a copy of 5 a% P) m) ]$ U, ^' O+ k' p
  12. * the License at ! o) B6 c+ y+ @- T- c/ U2 }& f
  13. *  , G- p9 a% k- ^# y" e
  14. * http://www.apache.org/licenses/LICENSE-2.0
    9 b, j1 W: B5 E& j. m* K. t
  15. *  
    & h* N  x' j, k5 L; n
  16. * Unless required by applicable law or agreed to in writing, software
    ) z0 O) G/ Q: }- G1 l6 r+ B& `/ {
  17. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    " @. q; s: |; B, O3 b9 N3 L
  18. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the & V( T  N5 @& {
  19. * License for the specific language governing permissions and limitations under , {" z$ K% o9 H7 A$ g' @! L/ I. }
  20. * the License. , Q- N9 R3 X0 S7 I5 }
  21. *  ' ~7 O4 m% E9 \/ z4 v" ?+ ]. l
  22. * @project loonframework
    7 D9 o" X' O- S
  23. * @author chenpeng , R" l9 Z: E3 Q9 [
  24. * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
    " R/ ~5 J. l! ]& i: N
  25. * @version 0.1
    / S$ ?5 z1 ^" J
  26. */  
    ; e" s& W3 ~9 G) G% @
  27. public class Main {  # z1 v1 a# F' Y& O+ n
  28.     public static void main(String[] args) {  
    8 T( [) O, q) G) @5 C0 m
  29.         java.awt.EventQueue.invokeLater(new Runnable() {  
    " s3 X! X  j% L9 C
  30.             public void run() {  8 ]. m8 h$ W+ s8 o5 ?" E. r1 |
  31.                 GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);  
    2 p; T& l3 E) l9 A; ^$ @
  32.                 frame.setCursor(GameCursor.getCursor("image/cursor.png"));  
    ! S$ S4 Q, Q0 @2 g" _. x
  33.                 // 获得搬箱子关卡接口  1 n/ N1 Z6 t0 Z5 s
  34.                 Stage stage = new Stage1();  
    % E; U2 x# E. M) I7 v# u& |) d
  35.                 // 设定游戏控制器  / D+ b0 W* h- `2 b, N
  36.                 frame.getGame().setControl(new Sokoban(stage));  
    3 w9 l4 v6 }" i" c) c- U+ ^
  37.                 // 游戏全屏    y# y) i1 x8 c7 B+ t$ C$ m3 t# u6 ?
  38.                 // frame.updateFullScreen();  
    5 n8 i3 E3 V9 e6 p8 l4 _3 y' c
  39.                 // 是否显示fps  : X, O! k( \" S) X2 I/ ?& Z5 i
  40.                 frame.setFPS(true);  
    ! i  l0 y1 V2 D( w- N: B0 ?6 ~. q+ O
  41.                 // 允许的最大刷新率  
    ( U7 r6 d" G% c, A4 x2 j
  42.                 frame.setMaxFrames(60);  
    8 F3 B# j; k. q1 j5 |/ Y+ {
  43.                 frame.mainLoop();  , G7 [/ t# A# e7 r  x$ Z
  44.                 frame.showFrame();  
    $ h7 q6 W; W: N1 V8 z0 a( H
  45.             }  
    ' t8 U3 p6 w: u1 G6 J
  46.         });  
    9 f5 z! ~) b$ o) S  V
  47.     }  2 a" s( T3 {# c0 {' v6 T
  48. }  
复制代码
" U& f6 Y- z7 Q2 g$ ?# B8 w) a8 _
  D: N6 {. g2 t- }" a' z' l
JavaSwing实现的推箱子项目源码.zip (139.15 KB, 下载次数: 4, 售价: 1 IT币) 2 x8 z; P# L) ?2 E3 s& W7 B9 {

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