推(搬)箱子,又名Sokoban,仓库番等,是一款堪称古玩级的电脑游戏。
6 v: P; v% n7 S$ ~% E
: Y4 i1 k a" s1 W& @提起它,笔者相信没什么人会感觉到陌生,更没什么生物会连听都没听说过。它的发展历史之久远,甚至超越了俄罗斯方块(1988年电脑游戏化)。
- T+ G) ]1 @/ q: Z2 l$ @! q; ~) E9 J" x7 ~% ^
这款游戏最初起源于日本,是个很难争辩的事实(我知道有人反对,但笔者确实找不到什么有力的反对证据)。他由日本人(哎……)今川宏行在1981年创立游戏规则,并于1982年经日本软件公司Thinking Rabbit正式发布。比较遗憾的是,早期的推箱子并没有PC版,笔者在网络上搜索到的老版游戏也大多为90年以前的Mac OS下程式。
" _6 b' l: U* Q+ Y1 F" v
6 q* l& W+ M5 x- Y! D但说起真正令推箱子风靡于PC机的,却该感谢我们的台湾同胞李果兆先生。是他在1994年开发的仓库世家,才真正令推箱子游戏在世界各地大受推崇;仔细说来,推箱子这款小游戏之所以能有今时今日的声望与地位,固然有今川宏行的开创之功,但若说到贡献最大,承前启后的,则非中国台湾的李果兆先生莫属。$ Y% U, u5 [2 R$ {' P$ }
1 h+ r) ] h0 n3 S+ h0 @0 D推箱子游戏的规则非常简单,就是用尽量少的推动或移动把所有箱子都推到目标点上。箱子只能推动而不能拉动;一次只能推动一个箱子。然而,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑力却是截然不同的,有些关卡可能会花费您几个小时、几天甚至几个月的时间,也正是这种简单性和复杂性的结合,最终令推箱子类游戏风靡全球!: ^( g2 V. @4 d# v P" X
e' C% a# V$ ]( o本回笔者在Blog中提供的,就是一款java版推箱子游戏的简单实现。
4 Q& N& ^) q+ L. _1 B5 z' v
1 y' j* M2 u0 U- X$ y* G+ d- }笔者设定[上、下、左、右]为方向控制 ,[S]键为后退到上一步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了角色的移动次数,HP归0则挑战失败。
! K# P" B2 N" }9 k1 a' ]3 g# ?# V/ M& n# r. G9 R7 z% }
目前版本仅提供有5关,有需要者可参考同类游戏自行扩充,游戏源码在jar内。$ u; O8 t. u* e q u
游戏截图: 9 l8 q' I5 x5 m" D' n" w* v
3 o, V2 o: x% [- `; d4 X7 l/ m( R9 T. ^1 i* j/ c1 e4 `4 N
/ g% s0 V8 a, y6 f0 B9 L% j% P2 B& m
: {6 b0 ~0 o+ d8 e( b1 G/ t" |
核心代码:
6 S4 K: U5 Z; sSokoban.java - package org.loon.game.simple.sokoban.control; ! r8 F7 I4 r5 M
- import java.awt.Color;
' U; ?7 v+ Q; d6 t# w1 M7 Q( Z& y - import java.awt.Font;
6 J1 H C# P" q0 y - import java.awt.Graphics; - P' H* G! s2 J( o. e& a2 O5 d
- import java.awt.Image;
1 W; Q+ G5 @! ]) u# A0 c - import java.awt.event.KeyEvent;
; h) c& t+ G' w# v - import org.loon.game.simple.sokoban.GraphicsUtils; & |8 Y8 B2 ~- d3 C
- import org.loon.game.simple.sokoban.LSystem;
! R; i7 O, F6 u8 r# F2 |- b% V0 D - import org.loon.game.simple.sokoban.SimpleControl;
$ I7 M- ^- {# f }, \6 V' b: H - /**
: `0 y, l- ]3 q0 [; X1 W: }' r5 i B - * Copyright 2008 - 2009
/ |0 k0 ?' Y1 t; a' w) a7 Z - * ' o( g/ u) a! s* m; \8 l
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not 3 t5 B7 t/ S( N% M$ P. a0 t
- * use this file except in compliance with the License. You may obtain a copy of
9 e) a0 Q T) Q9 V - * the License at $ i3 |+ B9 ~" V- G7 b8 E1 ]' \
- * 5 l% B$ o* }1 ?
- * [url]http://www.apache.org/licenses/LICENSE-2.0[/url]
! V# U- n; N# Z# n; l - * ) z7 r0 J8 w' C1 O7 q
- * Unless required by applicable law or agreed to in writing, software
2 `2 U7 d. k7 d% X: H - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - p; E* }( A+ E: l3 A* j/ b; W
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 5 Q" _) L" i. m2 E, I
- * License for the specific language governing permissions and limitations under
1 Z7 q' W4 h4 {) t9 F* b4 o - * the License.
# H2 b: z, |3 y9 [ - *
, e8 D5 s$ A: x, |- c - * @project loonframework * i+ |: I9 B# z8 ]0 y% p$ |
- * @author chenpeng
, N7 r& y: r8 \: [2 e* m - * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn 7 s) f" E! l4 ?: u7 j3 T- G
- * @version 0.1 $ B$ G( ^1 n$ {/ B
- */
3 ^4 Z8 e j/ z) g& t - public class Sokoban extends SimpleControl { . U. K( |) }8 D, h- g
- /** 7 ?' }7 W' @0 r _
- *
- Y: i6 M0 P; [- H# {# c& N% {% b - */
j7 I0 v3 y) [: z4 ^ - private static final long serialVersionUID = 1L; 4 J- Z0 d5 \! U! B
- private Image backImage = GraphicsUtils.loadImage("image/back1.jpg"); , G5 i; F5 V8 M/ j2 e
- private Image screenImage; t6 [" E a' L! n% R. }& E
- // 墙壁图
! `; m" o& U. l# W - private Image floorImage[]; ; E& L+ T$ o' W5 M! G& I- m
- // 角色精灵 ) N% w+ y: I( d
- private RpgSprite sprite;
% q. q2 D) x, t c+ \5 o) z - // 窗体显示图 : G h/ h+ A* p
- private Graphics screen; & h2 B. P& q0 j5 `6 ]/ T1 Z N2 u7 d0 Y
- private String message = "按下 [Enter] 开始进行游戏";
% m1 P6 @7 S* Z1 X' v' [; L - private String m_stageName[] = { "关卡1", "关卡2", "关卡3", "关卡4", "关卡5", "关卡6",
6 ^/ e. [: ]8 | - "关卡7" };
" @3 W8 c7 m5 i; S- G ] - private int CS = 32; ^- n' K6 ?8 ]3 w5 T: I* P/ W
- private int maxX, maxY, comps; * h+ Z* @/ M, E3 V- V* E9 O0 [
- private int stageNo;
! a. E9 \* _9 p: `/ E" B - private boolean complete[];
2 B7 \/ I( k- z# K$ }4 C# v$ J+ z - private boolean boxMove[][];
; E# Y$ m( j Y# Z - private int hp[];
6 o/ h) f: x2 L, H% w4 k - private int stageStates[][][]; , l1 Y" Q1 c7 A% D& P: \
- private int ons[][]; , r' b) J: {8 q) o( _
- private int role[];
: k5 U7 g6 z5 Q. | }! l - private int rolex[];
1 }, @1 f) G5 r8 { - private int roley[];
) G! o. ], O3 A& n - private int mapx[]; 8 @7 ~/ v0 ~( Z( r6 j4 t. A6 C3 C
- private int mapy[]; 5 Y" M$ z P8 X4 M
- private int sleep = 0;
" D3 H- y' \0 G1 b# d9 L - private boolean succeed = false;
- B0 n; ~( F+ y- `9 N7 J - private Stage stage;
/ A& \ f5 k0 R - public Sokoban(Stage stage) {
4 X/ W/ O) S9 q9 U" w - this.stage = stage;
. c: d& Z+ s5 K; b8 s5 d' q - this.floorImage = new Image[4]; : z' \ n5 `" `* @: R6 ~' w
- this.sprite = new RpgSprite("image/role1.gif");
. r3 T" V/ z' B& q1 V' e - this.maxX = 16; 1 C9 r, o+ v: B9 x/ S
- this.maxY = 13; 6 W7 m6 X1 B4 H# E9 v1 Y3 ]
- this.comps = 0;
& K1 F4 w% t' L F, Y0 [: W. b - this.complete = new boolean[stage.getMaxStageNo()];
$ S8 U6 `* f E/ {. J3 W2 z - this.boxMove = new boolean[stage.getMaxStageNo()][1500];
6 l$ X7 i, U" C" A6 M9 M - this.ons = new int[stage.getMaxStageNo()][1500]; % ?% N1 S/ \$ f7 ^) O+ o
- this.hp = new int[stage.getMaxStageNo()]; 1 |& y/ \ [$ z+ j" _$ H
- this.stageStates = new int[stage.getMaxStageNo()][maxY][maxX];
; w* U" Y# Q* O9 w6 l& w( M - this.role = new int[stage.getMaxStageNo()]; 0 [: V5 h# s$ Q5 n
- this.rolex = new int[stage.getMaxStageNo()];
' e6 b! o9 L8 o ` - this.roley = new int[stage.getMaxStageNo()]; }6 w" @) T* c! t# Z
- this.mapx = new int[stage.getMaxStageNo()];
( V" L' V7 c/ r& `4 v - this.mapy = new int[stage.getMaxStageNo()];
0 s( l% [% X# ^/ ]1 M, I' H } - for (int j = 0; j < 4; j++) {
, |2 z: l6 S. V6 ?/ @* e) r! \7 B - floorImage[j] = GraphicsUtils.loadImage("image/back" + (j + 1) 2 I& _" `; t) ^6 p9 e* M7 z
- + ".gif"); 9 L/ M+ v7 \1 s& B( M q$ a/ ^* G+ O
- } ; s. Y4 F( M0 a: }% f+ p
- this.screenImage = GraphicsUtils.createImage(CS * maxX + CS, CS
6 q5 ~! E3 e1 P& S' x1 X - * (maxY + 1) + 32, true);
5 c% d7 A# _0 A( V! t: E - this.screen = screenImage.getGraphics(); ; s6 @, t7 G Z4 p3 o5 P; r' z2 `
- for (stageNo = 0; stageNo < stage.getMaxStageNo(); stageNo++) { + q2 Q3 M* ]2 Q' y" z0 r
- this.setupStage(); $ B2 l9 C4 U$ a/ n- r
- } 3 Q1 |! n* |: d b- @$ W1 W0 U' U
- this.stageNo = -1; ' t. |4 V. j+ N
- // 开场界面 2 ?3 l- U7 t& q# H$ m) s9 Z
- this.openDraw();
. b$ P- v, d4 B! f* n3 a1 m: a - } " P# Z0 J& ?. q0 ^, |: z5 V3 |
- /**
% L G; |- x1 c8 e, U) H, U6 W( R! `% L - * 刷新关卡 3 N7 l& r4 V( T) S
- *
5 c' c: j; ~4 M - */
# t g3 g1 M, m8 F: ~2 n - public synchronized void reset(int stageNo) { 5 @( J, }3 W8 p/ g6 k R7 O
- this.stageNo = stageNo; $ R, m8 \6 ?2 d
- this.stage.getMode()[stageNo] = 1; 8 l2 K# E3 p4 {' s. f
- this.message = null;
) O. O; Y) e$ c( u, d - // 设定关卡 # H' s+ H2 f7 ?- F" m. E2 c! Z
- this.setupStage();
& ?' T) c W: Q' Y! G; s - // 重绘背景 3 j9 r: ~0 K* f) Y
- this.background(); 7 I0 t% |' X) b" \4 B; q
- // 重绘游戏屏幕 1 D0 O0 h& D5 B4 B
- this.drawScreen(); 3 z7 l- X8 s" d: u- w, k
- }
0 |7 }3 X7 Y3 W0 D& ?5 Y& k - /** / V" t0 u" U6 Z7 x4 t
- * 绘制屏幕背景
e6 u) V4 a/ j& {+ D - *
/ k0 U# b8 \. R2 u! ] - */ , K$ k$ H2 s5 _; p9 C
- public synchronized void background() {
4 \- X; Q' W7 S+ A6 `3 l - screen.drawImage(backImage, 0, 0, null); U8 r8 R* f& t8 w8 n: I
- screen.setColor(Color.black); 3 r" m/ j8 |1 b
- screen.fillRect(0, LSystem.HEIGHT - 40, LSystem.WIDTH, 40); 2 T }& h Y1 c
- }
: c: G& a: c3 L9 R( X! `$ w! ~( }# ~ - /** 9 s! k2 T+ p, W) f# D% i9 b
- * 绘制屏幕图像
% u7 J9 f: f1 \3 D, ^ - *
0 } B+ I/ G: \ - */
4 r+ I; s* n |2 M - public synchronized void drawScreen() {
) p/ r- I: z& K5 ~6 d - if (stageNo >= stage.getMaxStageNo()) {
7 U; n! Q8 V9 H" G3 E - stageNo = 0; % j- v% r) ^9 C. T
- } . w1 B( z1 A& U8 n; _
- for (int i = 0; i < mapy[stageNo]; i++) {
, r! z3 p, B# f2 K+ Q# \: V8 r - for (int j = 0; j < mapx[stageNo];) {
( B- x, X, u' E5 Z$ H, ~, H - switch (stageStates[stageNo][i][j]) {
" B# P! e: o- D3 o0 I8 f" m - case 2:
& @1 m5 x! P% T9 G G - case 3: % E6 M* P- c% z& U/ l* A7 b7 p5 j
- case 4: 8 w, P6 |* K' m! l
- case 5:
m8 G) z: |5 w% \/ V' X/ Q' d - screen.drawImage(floorImage[1], moveX(j), moveY(i), null);
9 r2 \# \8 G% X8 R) E - default:
/ k# V- k# G- T. v. Z - j++; % t9 P- {1 P% v" H( k3 y/ a7 ~' Z
- break; : a1 B3 X5 [ ^( }, p! |4 {
- } $ f2 u, v) I5 W+ k! z+ |1 ]
- } 6 P0 m0 ?+ Q! U ?+ ]
- } * I9 T4 d! ~) Z9 [3 H7 C. D6 g0 A
- for (int n = 0; n < mapy[stageNo]; n++) { # c& c% j# {3 q/ B8 h' I
- for (int l = 0; l < mapx[stageNo]; l++)
$ g4 |% t0 d7 A4 X" y' U ^ - switch (stageStates[stageNo][n][l]) { " M Y* g" t1 [$ L8 {
- case 1:
: b" q) S! F; ~" @0 w) U - screen.drawImage(floorImage[0], moveX(l), moveY(n), null);
~8 Q! u- G: z# v6 u5 `, } - screen.setColor(new Color(32, 0, 0));
: O8 C- O& b- |9 a( W5 L) C - screen.drawLine(moveX(l), moveY(n + 1), moveX(l) + CS - 1,
# {9 w! q# h, t, Q2 E4 `: z' P) n - moveY(n + 1)); * \( l/ i# e) x* r9 f M! Z) q
- if (l == 0 || l > 0 && stageStates[stageNo][n][l - 1] != 1) {
2 z: w1 E# g& Y - screen.setColor(new Color(160, 128, 96));
% P- S$ _" e3 y# k) o- f8 Z* s - screen.drawLine(moveX(l), moveY(n) + 1, moveX(l),
; i& G1 g$ A" e% u2 [, v7 u3 c - moveY(n) + CS - 2);
4 p: c3 I, S/ B9 @0 o! }; N - }
5 E9 n- V# v; D9 R" @ - if (l == mapx[stageNo] - 1 || l < mapx[stageNo] - 1
: V: K) Q' O2 q! u - && stageStates[stageNo][n][l + 1] != 1) { ( ]+ T, n7 I* e4 I; D6 H
- screen.setColor(new Color(72, 64, 64)); 7 W5 ^2 u6 ]4 e/ F
- screen.drawLine(moveX(l) + CS - 1, moveY(n), moveX(l) 4 c- M) S G* Y/ o, h- @1 |
- + CS - 1, moveY(n) + CS - 2); / h4 d2 b9 n( ^' t0 {5 _
- }
U4 \9 N9 J" w. q+ |1 s - break; . R% n2 ^8 P# L' O. y! u1 u- n
- case 2:
4 {+ R- W# U! W/ j' ]4 ]" V7 } - case 3:
4 H- Z+ V6 G: q% ^$ }0 F - case 4: & k9 f) w3 \; Z$ e
- switch (stageStates[stageNo][n][l]) { 7 ]- g0 @! u7 @( v G
- default:
: T0 N$ K: O5 ^; d - break; # `9 F! K4 _0 Z4 g( z7 ]/ Y
- case 2: , R W9 c# L1 e1 _ V" R7 }
- case 3: ! L( X" l! n0 F. q
- screen.drawImage(floorImage[3], moveX(l), moveY(n), - L4 U+ Q5 U. T4 v
- null); : R9 Z+ I$ R% R3 c7 {% [
- break; / t6 P/ r; T3 e, r
- case 4:
- B0 P7 k# _# z$ z c - break;
# f- h% c% X! A* E9 [+ x6 a - } . t& u" p5 u4 k: [7 c
- if (stageStates[stageNo][n][l] != 3)
0 K5 R8 |6 C6 b2 P) P - screen.drawImage(floorImage[2], moveX(l), moveY(n),
7 U1 W- i. E2 J$ f" l3 K' ~$ Y0 U - null); $ w5 X' x8 z" ?& V
- break;
k$ G0 Z. I! k - default:
; {, G3 r( r! F& f: s - break;
. S1 `/ }8 O: L - }
5 a* g `/ H( h- t# P - } 8 w6 r- |. K( A
- // System.out.println(role[stageNo]); 2 [! s: V; K/ K, q: n" g/ C
- screen.drawImage(sprite.getOnlyMove(role[stageNo]),
: I$ T2 \. K* b. x {. Z. p - moveX(rolex[stageNo]), moveY(roley[stageNo]), null);
- Z, P! @6 q" K. E, f- g& m% u - if (stageStates[stageNo][roley[stageNo]][rolex[stageNo]] == 4) {
+ X9 Q- \# O) v' j - screen.drawImage(floorImage[2], moveX(rolex[stageNo]),
/ L% O& D5 G$ T* }7 j/ l - moveY(roley[stageNo]), null); 0 V9 X- V& S) x3 a. C3 a7 i" G
- }
0 e- k: W3 F' O$ l j$ v - setupDisplay(); 1 A& l, v/ v; J. T
- }
+ v7 y, U7 S$ ~2 g4 | - /**
# E+ J4 X4 Z! }$ p - * 定位到实际的X座标 4 B) F" j0 q/ t) E' U# r
- *
) e3 w8 z5 L" d0 M9 r - * @param i
2 I' a" C0 g9 A+ v! h) |" h# V* E - * @return
! p; W( J+ U# K0 h4 B) h - */ : r6 A9 C: V7 J& M8 o
- public int moveX(int i) {
. c. C8 V( }( L! w: U0 s - return (CS * ((maxX - mapx[stageNo]) + 1)) / 2 + CS * i; - X2 _ i( t7 I/ i* J
- }
& I( `' H( s$ \8 m - /** c* ~2 R3 c" P8 I+ ^ y0 W7 U- d# f
- * 定位到实际的Y座标 3 A0 L" o3 `" f0 j8 C( a' c4 ~$ q' q1 [
- *
) L2 |; k) O9 K( [6 I - * @param i
" l2 ?; _9 ^& e+ v4 T4 N - * @return
8 W6 N# _" a# @- e - */ 6 k; }- U, N6 x. C" m
- public int moveY(int i) { 0 _) I! }- E: t3 w7 L2 ?$ `1 K& E
- return (CS * ((maxY - mapy[stageNo]) + 1)) / 2 + CS * i; 1 {% J/ Q: {, _
- } # Q) h& G8 Z0 _* Z
- /** 2 F, q8 K! B6 \% r
- * 执行操作 , ~- F4 Z' _2 q& Q
- *
$ O. R# h2 y# w! V; l6 ] - */ # y( }4 I6 g [' a0 J" w* {2 L
- public synchronized void execute() {
2 ]# u6 N. R( A( o: K4 e" w: P4 p - boolean flag = true; * c/ O8 B S) p X, X
- for (int i = 0; i < mapy[stageNo]; i++) { 1 n! J4 n. J4 \0 f4 B- f
- for (int j = 0; j < mapx[stageNo]; j++) { 5 _6 J; o) B: E' J) a
- if (stageStates[stageNo][i][j] == 4) {
8 ~1 w; T! h# b: X! P - flag = false;
& T! A: G% @6 Y- N - }
" l+ i& ?6 t* K/ n1 N9 ~0 t! f - }
" H2 d3 l1 E$ i% e - } 0 K; z/ b8 p5 p! n- n2 W
- if (flag) { 6 C- s+ _. H" k$ Y) `7 ?
- stage.getMode()[stageNo] = 3;
: i" E3 D) L, ]! e9 b; l, u - complete[stageNo] = true; 7 h/ l3 d$ t! }" m0 j7 P
- } else if (hp[stageNo] == 0) {
: e, `- Z3 L5 F7 r" _# n - stage.getMode()[stageNo] = 2; 7 Z3 F1 N% Y/ s2 d2 I
- }
9 B; s) P2 {& S9 N- C5 j - comps = 0;
/ i6 G" A8 K, H( w/ U7 T - for (int n = 0; n < stage.getMaxStageNo(); n++) { 9 w; _: b% t& I$ ]9 @( G! N
- if (complete[n]) {
' G6 v6 l7 e- v - comps++; Y% U5 e/ A9 _" x
- } y+ t# |& s; W5 `# o; A
- }
6 s: S$ Q6 j1 _ c2 y - } 8 W, k* r0 a1 J$ e+ X; L
- /** 2 K" y' t# c& d( [6 E
- * 键盘事件处理 ( \. y7 W8 P& T2 L2 m% f9 p
- */
: E) T' @+ }) r2 m7 L( Z$ S! g - public void keyPressed(KeyEvent e) {
( r- v0 n- q; K - if (e.getKeyCode() == 10 && stageNo == -1) {
! ]) f4 ~" u n$ a7 z - // 开始关卡1 , Z& t% f2 O) C _$ T0 |- E
- reset(0); ! {, ?8 z( s/ m5 _
- } else if (stageNo < 0) { & r0 ^: B# f P3 W+ w6 t' q3 c
- return; 8 ]4 l0 N2 k e( @ a4 Z% @: O
- } ' g8 K! j d- d! d* H
- // 选关(默认为最大支持7关,更多请自行设定) 8 a9 Q! i4 W, \* |% E
- if (e.getKeyCode() == 97 || e.getKeyCode() == 49) { 5 u! w+ p# _5 ^) U
- stageNo = 0; % p/ B$ ~ }2 m# @# s
- } else if (e.getKeyCode() == 98 || e.getKeyCode() == 50) {
4 c+ I8 I$ r( L - stageNo = 1; - Y# a1 @5 Q6 m" B
- } else if (e.getKeyCode() == 99 || e.getKeyCode() == 51) { ) E; R; {% i- s2 }' I- \$ {
- stageNo = 2;
0 z& h# N/ E7 |3 j - } else if (e.getKeyCode() == 100 || e.getKeyCode() == 52) { . Q/ I; i7 j: z3 B6 ~- f
- stageNo = 3; 4 _4 p, a- w' S
- } else if (e.getKeyCode() == 101 || e.getKeyCode() == 53) { : g: J" G) X! D! i/ K
- stageNo = 4; # f ~" U( T1 D
- } else if (e.getKeyCode() == 102 || e.getKeyCode() == 54) { $ I% G0 y4 k9 f, F1 Z1 J6 _% z
- stageNo = 5; + i& h4 m' _' M" ~+ J
- } else if (e.getKeyCode() == 103 || e.getKeyCode() == 55) { 9 q) ~$ N/ |/ @; M/ I$ j
- stageNo = 6; 6 P. Z4 S0 x" e! N( [! F8 E
- // ESC,重新开始 . ?/ } h0 V, \8 [0 d) T2 r
- } else if (e.getKeyCode() == 27) { 4 b2 S% ?# o' r/ b3 Q1 l6 j
- reset(stageNo); 7 [, l7 X j) s" p4 s* U( b
- } else if (stage.getMode()[stageNo] == 1) { 1 z2 X) a) H4 v& j) j8 F
- // 退步
8 [& c& b$ L7 x/ q2 I0 J4 m - if (e.getKeyCode() == 83) { / S/ z9 \' `1 D- J, I' t% R' j: k
- nextStep(-1); - m! ?0 C, a o
- }
6 ~2 a* V. \% [6 q( z! Z - // 移动角色
_' p% l! I- a+ r4 R - else if (e.getKeyCode() == 40) { - x0 Y* A0 _: ~" Y! T; z
- nextStep(0);
5 U* E, r* y8 a# g; l Q: E - } else if (e.getKeyCode() == 37) { # x( M u, {7 H& H6 c
- nextStep(1);
& |! ^4 V4 b% U+ o9 e3 E - } else if (e.getKeyCode() == 39) { # u1 a/ z9 c: t+ a) x
- nextStep(2); 5 n- M' _" C8 j: I9 k# L
- } else if (e.getKeyCode() == 38) {
- @0 f, n* d1 B" y! u - nextStep(3);
" @4 R& D4 x) G- ?( E' \ - } else {
. e$ s/ G8 H2 | F; [: X - return;
1 f9 D7 O e6 Z9 M4 o6 w - } 8 |2 U2 ~. H/ F7 t2 e
- } else { $ t; a$ Q% j' A; w8 o K
- return;
0 S4 \5 @2 z- h - } 7 C7 d/ ~6 d# N l ~2 h
- // 绘制背景 ( ^7 G5 j3 k" W; s* G. k/ T* Q) }, t/ d
- background(); , p& q4 p" t2 Q k
- // 绘制游戏画面 # G; \! J c' g& r0 q$ O1 U
- drawScreen();
$ c$ ]2 t9 T) s9 n( ^ - } ( V0 b# V; h+ V: ]3 Y6 A- W! s
- /** 3 |2 L% k$ w; Y% @
- * 切换动作 5 g/ X/ R& C4 j
- * : {. U" u2 G6 |: m
- * @param i 1 a+ t5 j6 c3 A* I {8 Z
- */
4 }, X4 Y2 x9 L% h0 V( E9 O- b - public synchronized void nextStep(final int i) { # [9 e" }3 W0 F" Y; u' j' Y9 H: i) C
- boxMove[stageNo][hp[stageNo] - 1] = false; 3 j. G- B1 m/ a
- switch (i) {
. [* W' M" f s8 v - case 0:
7 r U* e- W$ b0 ~. _# u* O - if (stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] < 2) {
, a. N- w0 |4 b" Z) h - return; 3 X8 P2 l. W3 g% _) t
- }
2 W- p* j; h" s$ y' e% o - if (stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] < 4) {
) c2 A, @) o( z7 f- c9 c$ d* ] - if (stageStates[stageNo][roley[stageNo] + 2][rolex[stageNo]] < 4) {
3 B8 s: d) e9 `* y5 ?8 W6 y - return; 9 F7 U9 O, P% m1 K) H
- } 6 _& ?( F4 ^# X' k/ j
- stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] += 2; 2 \2 [- [( v+ Z6 a" k. j
- stageStates[stageNo][roley[stageNo] + 2][rolex[stageNo]] -= 2; : K3 g* N! H1 N$ k8 i9 q. b! M8 w
- boxMove[stageNo][hp[stageNo] - 1] = true; 3 y7 w# ?8 E# N# l
- } 4 \, T; [+ b9 x8 h, v
- roley[stageNo]++; ! r2 @3 |$ A5 q# W* j. }, R
- break;
D$ v, h5 e1 r) [( R8 I6 `8 e - case 1:
; E2 ^5 R) V V - if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] < 2) {
4 S, L% z* E4 `% J - return;
) c" [) Z8 c& G J - } 5 a T6 y2 s" K, r4 G8 x8 p
- if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] < 4) { ' ~; R7 ]+ U% n8 e
- if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 2] < 4) {
/ I# G7 o9 @( B2 k9 [0 ?% j/ }3 f - return; + ?9 o2 Q2 t- R5 s% n- H
- } / e8 A8 m' p6 [5 n, G) K" \
- stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] += 2;
7 L( H. z5 b1 V% `* n/ z - stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 2] -= 2;
' U+ U6 P! M: d - boxMove[stageNo][hp[stageNo] - 1] = true;
: n. b$ k& z y, B - } % ~+ ]1 a2 ^8 i' z. y+ A. ^
- rolex[stageNo]--;
! s6 x! W$ v9 n1 Y - break; 1 r$ u4 `4 \% s: Y+ b6 R; q
- case 2:
) y: g9 _' z% \ - if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] < 2) { 4 \9 x1 X/ d# L' F' c9 ]
- return; ) y/ t0 T- ^1 c
- }
. {/ i4 t) F5 J# t - if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] < 4) { 1 T) y- w4 M: i
- if (stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 2] < 4) {
8 }7 j) ~" S- S$ j- a0 B - return;
a# ?: `3 j0 L3 E5 B/ \ - }
' o+ @2 Q2 ^9 s: z- u& C - stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] += 2;
+ m: h! {( g/ d8 G, c - stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 2] -= 2;
; C4 ^# Q! ^: v" v8 y8 ~# G0 u3 i - boxMove[stageNo][hp[stageNo] - 1] = true;
; q9 j" _, g9 _5 Q. H - }
3 p" o6 j. U0 e. c' f8 I - rolex[stageNo]++; 1 O6 o. D4 ?$ q/ A1 X
- break; ; I/ g' G1 I" g5 F
- case 3: & Y$ E7 \; ^) ]1 A9 d. f6 U2 Q* R
- if (stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] < 2) { * V, ~* X: u, l( X' ~, w- T
- return;
' j4 r7 L/ ] e8 q: g: o0 ^% o9 m - } ' |& D$ C" F7 c5 Y% y
- if (stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] < 4) {
( Q8 P1 x1 N# m2 x - if (stageStates[stageNo][roley[stageNo] - 2][rolex[stageNo]] < 4) {
4 a3 ~8 {' d9 Y! S$ q$ o* w ~+ x - return;
0 w9 Z, Z) B: H T O: c) X - } 0 L- V# g! a" x2 @' A5 u- p
- stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] += 2; 8 @% L2 {% o) ^8 [# o: L5 g8 @% E1 ^
- stageStates[stageNo][roley[stageNo] - 2][rolex[stageNo]] -= 2;
- B0 K0 ` q4 ^) [: Q - boxMove[stageNo][hp[stageNo] - 1] = true; # h$ f" p! f; S7 I a
- } & d/ [) g% j9 r& D* a: ~
- roley[stageNo]--;
& T6 w7 e* A9 J H5 p; _; | - break;
1 s3 S3 p8 x6 z' j - default:
3 o! f7 h, I; O- n - if (hp[stageNo] == stage.getMaxHp()[stageNo]) {
) L* O/ \6 F! o+ U! y1 O4 Q3 | T - return; ) d, W' t. F+ i P0 d
- }
! k. \5 \1 [4 t0 n, C - switch (ons[stageNo][hp[stageNo]]) {
6 E; ]! V- h; R3 Z2 ?9 R8 Q5 y - case 0:
& k% B, t) K! u, H9 x) P3 K3 V) B - if (boxMove[stageNo][hp[stageNo]]) { ' s: e, y6 _: n% K8 `% ^! k
- stageStates[stageNo][roley[stageNo] + 1][rolex[stageNo]] += 2; " q3 o4 B: \" p+ [
- stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2; 8 s) x3 z4 p2 a: U9 h/ F3 ~( t3 s. t
- } . v, c, Y7 E/ ]- M, s; U) W
- roley[stageNo]--; + Q; r; J4 K+ T
- break; x+ N ]4 T; W( J# z! [0 x
- case 1:
4 L: R' V, n( B# } - if (boxMove[stageNo][hp[stageNo]]) { / P) t$ M* _; v2 f
- stageStates[stageNo][roley[stageNo]][rolex[stageNo] - 1] += 2;
/ u1 ]# |4 S0 d& I - stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2;
* ^/ {& S! w, P& R" \8 V - } 0 B3 f4 u, R: |$ _6 D1 ?
- rolex[stageNo]++;
/ H, @; d0 X' R7 F - break; 2 s8 }4 b# I" p7 o" Y2 `
- case 2: ; B# \0 Z1 j6 M
- if (boxMove[stageNo][hp[stageNo]]) {
$ u' r; @+ @3 C( V) e; e$ L$ q - stageStates[stageNo][roley[stageNo]][rolex[stageNo] + 1] += 2; / i6 K" k% o* D- U) U. K6 e
- stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2;
, l" W) G4 J- j2 j, F - }
% t" z0 v9 A) g b5 r - rolex[stageNo]--;
& v# i* r @) q; L4 G5 v - break; ; n3 e* G9 ]# {* l8 Y4 B6 }
- default:
9 G4 ?- ]8 E8 R; n - if (boxMove[stageNo][hp[stageNo]]) { 8 y- B' R- R% w
- stageStates[stageNo][roley[stageNo] - 1][rolex[stageNo]] += 2;
9 n: g, W' G; w - stageStates[stageNo][roley[stageNo]][rolex[stageNo]] -= 2;
& j" G, f4 r+ g8 ?0 K - } : T' i' r9 g7 f! I: j* z" F
- roley[stageNo]++; , Z; ]+ i2 @; b E; C) O
- break; ( H: R9 W( M4 t4 ^5 \% r
- }
& p8 C3 y5 O5 j- S5 w - break;
/ p5 t% T# S% n( g0 s9 j3 a - } 0 b% B1 P: ?4 W
- if (i != -1) { 8 ^* k) M5 o: x7 k2 M! \, W, U7 R Y$ u
- hp[stageNo]--;
8 z+ O5 n, \( p, e5 M5 L - ons[stageNo][hp[stageNo]] = i;
7 Y$ ^8 e9 i+ Z - }
0 a8 m; Q1 R. [: T; h0 r8 u - role[stageNo] = ons[stageNo][hp[stageNo]];
3 ~: ?( e5 i8 i - if (i == -1) { 3 l# R9 j7 t# l
- hp[stageNo]++;
! a, I9 V+ V* ^: k( d6 [ - }
, |, m, T! b# T/ `1 n - execute(); ; z" C3 s0 [, O0 [' p& F
- }
7 O! }1 p3 U; @0 t3 x - /** . Z f" l9 h( `/ x1 Z; k3 D
- * 开场画面
0 [8 v, }: s3 q5 h! o - *
. G- m2 W2 T. B1 r$ ~' n - */ ) `6 d9 x% G! _; L" J
- public synchronized void openDraw() {
1 C | f# ^- ^) \ - background();
2 n! F( y9 p& g. a* t - for (int i = 0; i < 5; i++) {
1 H6 w: |9 J6 d - for (int j = 0; j < maxX + 1; j++) {
. x# u. h* n# ^$ Y, ^" Q. l2 }2 }3 K - screen.drawImage(floorImage[0], CS * j, ; x2 y+ B `4 f; a
- (CS * i + CS / 2 * maxY) - CS * 2, null);
+ P: {: q7 ^ e& W7 J. H( M" P - }
4 `7 b3 f, G: R3 P8 _ - } / I4 E: C3 z) {( _$ Q% J
- GraphicsUtils.setAntialias(screen, true);
3 d. i: e) l2 @1 z - String mes = "怪蜀黍传说 - 勇者推魔王"; $ i- ~& S. ~! a" x
- screen.setFont(new Font("华文新魏", 1, 35));
+ b' q2 ~1 F$ g8 N1 P ~5 V+ v - GraphicsUtils.drawStyleString(screen, mes, (CS * maxX - screen
' b" R }7 \6 s% ?+ J9 r& R3 l - .getFontMetrics().stringWidth(mes)) / 2 + 13, , O6 L. X+ y E5 t4 T$ I$ E
- (CS * maxY) / 2 + 25, Color.black, Color.orange);
( T( B1 J: L4 _) |( ^" ^ - mes = "Java版搬箱子游戏开发入门示例 - 0.1.0"; ( h7 k: j, `1 E8 I* _
- screen.setFont(new Font("华文新魏", 0, 30));
8 F0 p0 N* Y! F8 V' E) b) J2 f - GraphicsUtils.drawStyleString(screen, mes, (CS * maxX - screen
1 C/ y5 Z! x4 _* \; U, ^6 ? - .getFontMetrics().stringWidth(mes)) / 2 + 13,
0 L/ X+ k3 [, k7 p# [( A8 b5 x - (CS * (maxY + 2)) / 2 - 55, Color.black, Color.white); u1 @$ @! U" ?9 `1 O8 L
- GraphicsUtils.setAntialias(screen, false); 0 \) J, W" C6 R( h& p8 N# w8 {5 n( \4 f2 _
- setupDisplay(); 3 \" x5 c" e% }8 q: C0 Z' g6 \6 `
- }
$ q2 \ @9 X: G& s& x: y5 v/ L - /** 0 G) F. f, }5 y( `3 @' R3 `3 A
- * 绘图接口实现 / o' e; E' y0 e, C
- */ % {0 [! _1 Y4 m+ m6 S
- public synchronized void draw(Graphics g) {
2 \/ A' Q9 D9 {5 ~0 g - g.drawImage(screenImage, 0, 0, null); ( P4 ~& }) u/ h0 W
- if (succeed) {
' t3 E2 f" M; @# } - if (sleep == 100) { * m( c" I( o @; K; i6 i! d3 j* e
- // 进入下一关
; F. B$ P# l# Y# Q- J! L7 _ - reset(++stageNo);
6 e4 J4 j+ h; T5 {5 Q. q0 \* ] k1 l/ m% w - succeed = false; ) A/ J7 Z5 o1 |( f5 R5 ~9 Q$ n
- sleep = 0;
$ z6 `0 E+ a8 Q: z( o+ F. r6 L2 f( r - }
4 @4 j' Y: c; t - sleep++; - h% K, a3 X6 O; T* ^ H9 R
- } , m! N \& h# K2 m9 b
- }
) J! D% V3 `: T2 _/ C" e1 @ - /** 0 g) X3 v$ M5 X, ^" ?" c( L: _
- * 设置基本数据
4 [8 E% @) y+ t, N0 B - *
. d% b% M! _$ M' u$ [' A - */ . \( c; a8 H8 G. g1 Q8 k
- public void setupStage() { " [ c+ C& g t. N" x, w
- for (int i = 0; i < maxY; i++) {
7 }- J! \, Y2 p$ R, z7 w2 _$ Q - for (int j = 0; j < maxX; j++) {
3 O+ E+ B! k# g9 w, R# ^. T - stageStates[stageNo][i][j] = 0;
% r o! ^3 l1 p* K* e. ] - } 8 v; @/ u& ?( s7 s& n( z
- } 2 G S3 Z' v( n7 d1 L" s
- mapx[stageNo] = stage.getConf()[stageNo][0];
, s! O3 X) Y, ?- p0 Z* ` - mapy[stageNo] = stage.getConf()[stageNo][1]; , H* H2 T/ U5 \& b/ v
- rolex[stageNo] = stage.getConf()[stageNo][2];
0 _( W5 E5 y4 ~ - roley[stageNo] = stage.getConf()[stageNo][3];
) b! V9 b) \% X; V - for (int n = 0; n < mapy[stageNo]; n++) { ( q+ y6 L* g! b" v
- for (int l = 0; l < mapx[stageNo]; l++) { 0 ^2 _! t3 @' J* {2 S
- stageStates[stageNo][n][l] = stage.getMapData()[stageNo][n][l]; * {" n' U6 C' M& ~/ c# u8 X+ F5 i1 b
- }
; M$ }& z# x2 D( K% ^ - } $ z% h K: A$ F! \9 E2 o
- hp[stageNo] = stage.getMaxHp()[stageNo];
! N; A6 S, D/ N - role[stageNo] = 0; : L u( F6 ?( r9 Y+ L) X j
- for (int i1 = 0; i1 < stage.getMaxHp()[stageNo]; i1++) { 0 e% O& J+ `8 A9 v* ?; d ^
- ons[stageNo][i1] = 0;
% L! t+ w" @" z9 Q - }
# l3 d/ ` j- a+ L) g - for (int j1 = 0; j1 < stage.getMaxHp()[stageNo]; j1++) {
( q- P5 a# J& d6 Y! G- j$ q - boxMove[stageNo][j1] = false;
( q d! g# ]& d( r - } 2 d0 X* \3 O% C2 u% `& H& V
- }
( m. z2 E* n6 n3 Q - /** 7 o- l2 N9 a: A; w1 y
- * 设置显示 ( f$ ^8 n% x7 q! E1 Z" I
- * / i7 a: b" k$ C+ i {
- */
r& d6 z9 V: @9 E% Q, Y& H - public void setupDisplay() {
# s2 Y) a$ @0 i& l7 z: e$ t - if (message == null) {
' N8 W9 u: D0 w, X; a% s1 ] - screen.setFont(new Font(LSystem.FONT, 0, 12)); & r. t, ]" Z1 \5 u
- int size = 0;
! E9 s* Q7 m. O& n. H3 g - for (int j = 0; j < stage.getMaxStageNo(); j++) { , Y0 z% b2 V( s+ x+ E7 b) e
- if (complete[j]) {
/ |( G5 g @ e; c - screen.setColor(Color.gray);
* `. {+ ]6 _8 h% P2 { - } else { + ^8 m" k" Z1 s; k3 a
- screen.setColor(Color.white); + A& O. R4 @; g, L- S6 ~
- } + P3 W7 g" o( P' G& v8 S8 a6 {
- if (j == stageNo) {
6 R" p4 ]+ `. B9 s) v: q - if (complete[j]) { 8 ^, I1 j* g2 j- j
- screen.setColor(Color.magenta);
) y5 |' ?" W% {* o - } else {
, M) {, D! z( k+ h5 \ - screen.setColor(Color.cyan); " C% U U7 G0 e2 i
- } 7 M$ n. }; Y. e6 ~# z+ }
- } \' u, ] z2 _, E
- screen.drawString(m_stageName[j], size = (10 + (screen
) l5 i. ~5 k. n( y - .getFontMetrics().stringWidth("关卡0") + 20)
! \1 F" J/ G& a - * j), LSystem.HEIGHT - 50);
6 V+ e/ W5 k9 w' ^* {: V - } & X2 h9 V) h; u+ P2 s1 Y" t, ~! ~
- screen.setColor(Color.white);
/ w2 O/ S7 ~6 u2 S/ \! ~. n - if (stageNo == -1) { y7 X" b: `* [# r' `5 Y
- // 初始画面,无数据 ! j8 Z9 k8 \# f1 C( V
- } else { , I& ~! X7 M( g- y
- // 显示状态 $ p. F4 k: o3 v! B1 B6 ~
- if (hp[stageNo] == 0) {
0 x$ \. c+ L* `% I" p* ?- b - screen.setColor(Color.red); ' ^# W1 f7 V3 z( F
- } else if (hp[stageNo] <= stage.getMaxHp()[stageNo] / 4) { $ b, Q/ d# Y% m: t7 ^4 n3 ?
- screen.setColor(Color.orange); & k# b& d* `7 p
- } else if (hp[stageNo] <= stage.getMaxHp()[stageNo] / 2) {
. L6 i4 A( j5 P - screen.setColor(Color.yellow);
! N8 }. z7 F$ h$ H - }
* E# x. w# `1 P) C1 K) [ - screen.drawString("主角 HP " + hp[stageNo] + "/"
. Y# t" K# I+ y$ {' j - + stage.getMaxHp()[stageNo], size + 50, ( r9 d, f& z; i W5 ]/ R
- LSystem.HEIGHT - 50); * {1 E* z7 R0 ?4 X
- switch (stage.getMode()[stageNo]) { : V# c7 M# x. H F" u
- // 生命耗尽
% |* F$ \: J$ v, z/ E+ @% ] - case 2: 8 ?7 r% M" t4 M% z
- screen.setFont(new Font(LSystem.FONT, 1, 30)); . a9 P" E6 ^2 Z9 B5 m
- screen.setColor(Color.red); 3 G' x! v! }$ _
- GraphicsUtils.setAntialias(screen, true); % ^5 J- O- q2 G) Q
- screen.drawString("The End!",
, Y2 p, z0 @# T; T2 [' w F( Z, T& @ - (CS * maxX - screen.getFontMetrics().stringWidth( $ C3 v" }9 D: H" s
- "The End!")) / 2 + 14,
) X6 O6 Y' k, T. l - ((CS * (maxY + 1) + screen.getFontMetrics() 3 U3 ~( S7 A6 K& Y! `- D7 x+ g
- .getAscent()) - screen.getFontMetrics()
" {0 _% _1 Q) ?, x/ W7 p - .getDescent()) / 2); + Z/ k/ z: m8 \1 d" V" J
- GraphicsUtils.setAntialias(screen, false); " R6 S! G4 Z$ [% s6 I* P
- break;
* {% E, q5 f% V1 Y; q - // 胜利 ( @7 _- D" z4 O8 X0 o
- case 3:
; _: _" \% |$ k - screen.setFont(new Font(LSystem.FONT, 2, 40)); X) ?0 Y: G* V) L1 X
- screen.setColor(Color.darkGray);
# [& V2 W$ T" ?3 C4 w - GraphicsUtils.drawStyleString(screen, "Good job!", (CS
2 U$ Z' Z9 S f6 i - * maxX - screen.getFontMetrics().stringWidth( # l( C3 y) w* w" b' [
- "Good job!")) / 2 + 14, ((CS * (maxY + 1) + screen
4 A& ~1 }" h- ?) m" d - .getFontMetrics().getAscent()) - screen
, y& O& V8 k# R& ~( O - .getFontMetrics().getDescent()) / 2, Color.black, 1 n {/ N3 v) z8 @2 G
- Color.white);
" _+ v$ [, F: Y1 o1 ?& ^' s+ Z - // 胜利标记
. c7 f a& U, _ - succeed = true;
9 ]3 X8 R1 x$ O) l4 u p+ T$ G - break; + e1 b1 _8 o k W U3 @+ `% L2 w
- } & P) L4 k7 i% K0 V3 M
- } , t4 n |8 \- r! [4 P
- } * L' s0 ^, z8 C" ^3 O5 Y4 ~0 E) t- Q
- // 存在信息时 M( S+ x: C" ]& P
- else {
( l/ J# K( u; {. o - screen.setFont(new Font(LSystem.FONT, 0, 12));
- C( |6 e; V# y5 ^* V2 K% h - int n = screen.getFontMetrics().stringWidth(message) + 16;
/ D# ?+ v" s4 l+ u8 c5 J% D - int l = screen.getFontMetrics().getAscent() 4 ~& n g7 X2 V$ A, Y3 W
- + screen.getFontMetrics().getDescent() + 8;
8 R. b. Z% v$ s5 T9 w" g - int i1 = (CS * (maxX + 1) - n) / 2; 3 E! x; _/ U/ M# A5 m% l
- int j1 = (CS * maxY + 1) - l / 2;
S6 }) p4 l6 Q0 h9 S4 B. K - int k1 = i1 + 8;
' p9 w. o( b6 y. r9 M - int l1 = CS : ]5 L! d* ^6 L- w& j
- * maxY
3 h2 p" x# o5 ~/ u8 V0 f7 Z - + 1 1 e8 W! a2 l1 B9 R \$ B1 B
- + (screen.getFontMetrics().getAscent() - screen
4 }$ \; w; B7 \6 y& A - .getFontMetrics().getDescent()) / 2; 7 e) E9 h( ?- Z
- screen.setColor(Color.black); % ^" M; M& E% G0 C) j, B1 V
- screen.fillRect(i1, j1, n, l);
; x/ M) R) j$ j8 A4 O( Z4 g K/ Z - screen.setColor(Color.white); 9 U/ D3 z; n. ?) o- A
- screen.drawString(message, k1, l1); 9 \" u. p" _6 u( o' P3 n% }
- } k: Y0 b5 f' |+ y& g; S9 A' z" E
- }
( g* M. X( g; ]6 V - }
复制代码 5 ]. v, Z, U6 S7 ]
启动类: % ^1 Z/ r& D1 H4 `' U5 \( `9 ]
7 r2 q& N& Y) O3 V
# p# K% t6 X0 f6 C
Main.java - package org.loon.game.simple.sokoban.main; * [2 l6 ^* ~0 R- ~' r1 M9 B
- import org.loon.game.simple.sokoban.GameCursor; 7 N+ S- k$ w* g( M4 o! e
- import org.loon.game.simple.sokoban.GameFrame;
$ n: ~ F9 o9 A; r. d9 I - import org.loon.game.simple.sokoban.control.Sokoban;
$ u( I3 l* v5 i) | P+ I3 s4 E/ P, O - import org.loon.game.simple.sokoban.control.Stage;
; H2 J7 `- k. N# u0 X: \ - import org.loon.game.simple.sokoban.control.Stage1; 8 ]; x. z! E3 k: H
- /**
. P c* m; J8 \9 t, Q6 z8 s - * Copyright 2008 - 2009
, Y" S4 `. C5 L- s - *
0 v% W) ^- |7 q4 q) y% y - * Licensed under the Apache License, Version 2.0 (the "License"); you may not 3 z; x: Q- a7 p! X
- * use this file except in compliance with the License. You may obtain a copy of
& Q8 D6 I' J, o8 d6 F - * the License at
# K. ~, \8 R6 F* V4 ~; z - *
' Q" q+ X0 `# s0 k$ J3 {0 | - * http://www.apache.org/licenses/LICENSE-2.0 ! K: M" ~$ k6 H% N) G
- * - G! C6 b) t- a) ~# L' ?
- * Unless required by applicable law or agreed to in writing, software 5 X5 z: v P9 h2 u
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT ) `" K6 ^+ J+ }- ~8 H* g
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 6 q, [1 N' R4 H7 d* u
- * License for the specific language governing permissions and limitations under
. C6 ^& b. [5 ` - * the License.
2 J# t" u3 G9 U - *
" w b1 @- W2 H- O0 Z6 I0 W0 I - * @project loonframework
. V1 `6 k& _3 T* L - * @author chenpeng
% o& H( n+ t: y0 C+ ^" a p, h, K. ~ - * @email <a title="" href="http://hi.baidu.com/ceponline" mce_href="http://hi.baidu.com/ceponline" target="_blank">ceponline</a>@yahoo.com.cn
" k0 U! R7 e) R2 l# {# d+ v5 v$ { - * @version 0.1
- }1 v# @) }& B7 g) S2 z3 A - */
2 t0 c% f4 Z& a4 \ - public class Main {
4 `( X1 A" P/ v* r4 ]; j+ S - public static void main(String[] args) { 9 U4 J- w# ?8 k
- java.awt.EventQueue.invokeLater(new Runnable() { 4 I7 q# d; |" R( P& i
- public void run() { ; X& i! B& I2 X, D& q
- GameFrame frame = new GameFrame("Java版搬箱子游戏入门示例及源码-0.1.0", 540, 480);
- g7 |1 J. S* ]6 b' d, c f8 L - frame.setCursor(GameCursor.getCursor("image/cursor.png"));
; i; j6 r& @2 q& s$ E+ H - // 获得搬箱子关卡接口
+ C0 j/ h( Y" p0 _4 H4 B9 W - Stage stage = new Stage1();
+ L. r3 i/ h6 b0 x( E1 p5 b4 S+ V - // 设定游戏控制器 5 v/ x6 b* v; f
- frame.getGame().setControl(new Sokoban(stage));
v" h. a. m. Y R - // 游戏全屏 - i# v6 n9 `3 f. @. o. C- b
- // frame.updateFullScreen(); 7 l9 c& T1 {4 o e$ }
- // 是否显示fps 2 ~! @3 B) o, e# a% U" i3 Q# {' P
- frame.setFPS(true); 0 Y3 P" U& p8 ?# R( v" T
- // 允许的最大刷新率
5 V' @) W9 y. t9 }2 M - frame.setMaxFrames(60);
2 b1 i9 E! ~0 ] - frame.mainLoop();
3 v- t: q& n) N9 R- O - frame.showFrame(); 2 ~, x9 w" G- u9 `; a
- } ; f1 U9 ]' V% R, b! \1 f2 g
- }); ' T0 B. s- o8 K4 m- `
- }
/ k( l8 J& s/ c# @! @ - }
复制代码
: B6 I$ ^% B) ]$ }! `! [5 W
/ s7 Y ~6 Q0 e' Q0 u6 v/ Q
JavaSwing实现的推箱子项目源码.zip
(139.15 KB, 下载次数: 4, 售价: 1 IT币)
$ `% O; p3 Z, K' B" E& V* A4 c5 ^, h/ |
|