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