Java版推箱⼦(搬箱⼦)游戏开发⼊门⽰例及源码
也欢迎⼤家转载本篇⽂章。分享知识,造福⼈民,实现我们中华民族伟⼤复兴!
推(搬)箱⼦,⼜名Sokoban,仓库番等,是⼀款堪称古玩级的电脑游戏。
提起它,笔者相信没什么⼈会感觉到陌⽣,更没什么⽣物会连听都没听说过。它的发展历史之久远,甚⾄超越了俄罗斯⽅块(1988年电脑游戏化)。
这款游戏最初起源于⽇本,是个很难争辩的事实(我知道有⼈反对,但笔者确实不到什么有⼒的反对证据)。他由⽇本⼈(哎……)今川宏⾏在1981年创⽴游戏规则,并于1982年经⽇本软件公司Thinking Rabbit正式发布。⽐较遗憾的是,早期的推箱⼦并没有PC版,笔者在⽹络上搜索到的⽼版游戏也⼤多为90年以前的Mac OS下程式。
但说起真正令推箱⼦风靡于PC机的,却该感谢我们的台湾同胞李果兆先⽣。是他在1994年开发的仓库世家,才真正令推箱⼦游戏在世界各地⼤受推崇;仔细说来,推箱⼦这款⼩游戏之所以能有今时今⽇的声望与地位,固然有今川宏⾏的开创之功,但若说到贡献最⼤,承前启后的,则⾮的李果兆先⽣莫属。
推箱⼦游戏的规则⾮常简单,就是⽤尽量少的推动或移动把所有箱⼦都推到⽬标点上。箱⼦只能推动⽽
不能拉动;⼀次只能推动⼀个箱⼦。然⽽,尽管它的规则是很简单的,但对于不同难度的关卡,所需要的脑⼒却是截然不同的,有些关卡可能会花费您⼏个⼩时、⼏天甚⾄⼏个⽉的时间,也正是这种简单性和复杂性的结合,最终令推箱⼦类游戏风靡全球!
本回笔者在Blog中提供的,就是⼀款Java版推箱⼦游戏的简单实现。
笔者设定[上、下、左、右]为⽅向控制 ,[S]键为后退到上⼀步操作,[ESC]为重新开始当前关卡,点击键盘上对应关卡的数字键可以直接选关,需要注意的是笔者以HP限制了⾓⾊的移动次数,HP归0则挑战失败。
⽬前版本仅提供有5关,有需要者可参考同类游戏⾃⾏扩充,游戏源码在jar内。
游戏截图:
核⼼代码:
Sokoban.java
[jav a]
1. package org.loon.game.l;
2. import java.awt.Color;
3. import java.awt.Font;
4. import java.awt.Graphics;
5. import java.awt.Image;
6. import java.awt.event.KeyEvent;
7. import org.loon.game.simple.sokoban.GraphicsUtils;
8. import org.loon.game.simple.sokoban.LSystem;
9. import org.loon.game.simple.sokoban.SimpleControl;
10. /**
11.  * Copyright 2008 - 2009
12.  *
13.  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
14.  * use this file except in compliance with the License. You may obtain a copy of
15.  * the License at
16.  *
17.  * /licenses/LICENSE-2.0
18.  *
18.  *
19.  * Unless required by applicable law or agreed to in writing, software
20.  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
21.  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
22.  * License for the specific language governing permissions and limitations under
23.  * the License.
24.  *
25.  * @project loonframework
26.  * @author chenpeng
27.  * @email <a title="" href="hi.baidu/ceponline" mce_href="hi.baidu/ceponline" target="_blank">ce
简单的java游戏代码
ponline</a>@yahoo
28.  * @version 0.1
29.  */
30. public class Sokoban extends SimpleControl {
31.    /**
32.      *
33.      */
34.    private static final long serialVersionUID = 1L;
35.    private Image backImage = GraphicsUtils.loadImage("image/back1.jpg");
36.    private Image screenImage;
37.    // 墙壁图
38.    private Image floorImage[];
39.    // ⾓⾊精灵
40.    private RpgSprite sprite;
41.    // 窗体显⽰图
42.    private Graphics screen;
43.    private String message = "按下 [Enter] 开始进⾏游戏";
44.    private String m_stageName[] = { "关卡1", "关卡2", "关卡3", "关卡4", "关卡5", "关卡6",
45.            "关卡7" };
46.    private int CS = 32;
47.    private int maxX, maxY, comps;
48.    private int stageNo;
49.    private boolean complete[];
50.    private boolean boxMove[][];
51.    private int hp[];
52.    private int stageStates[][][];
53.    private int ons[][];
54.    private int role[];
55.    private int rolex[];
56.    private int roley[];
57.    private int mapx[];
58.    private int mapy[];
59.    private int sleep = 0;
59.    private int sleep = 0;
60.    private boolean succeed = false;
61.    private Stage stage;
62.    public Sokoban(Stage stage) {
63.        this.stage = stage;
64.        this.floorImage = new Image[4];
65.        this.sprite = new RpgSprite("image/role1.gif");
66.        this.maxX = 16;
67.        this.maxY = 13;
68.        thisps = 0;
69.        thisplete = new MaxStageNo()];
70.        this.boxMove = new MaxStageNo()][1500];
71.        s = new MaxStageNo()][1500];
72.        this.hp = new MaxStageNo()];
73.        this.stageStates = new MaxStageNo()][maxY][maxX];
74.        le = new MaxStageNo()];
75.        lex = new MaxStageNo()];
76.        ley = new MaxStageNo()];
77.        this.mapx = new MaxStageNo()];
78.        this.mapy = new MaxStageNo()];
79.        for (int j = 0; j < 4; j++) {
80.            floorImage[j] = GraphicsUtils.loadImage("image/back" + (j + 1)
81.                    + ".gif");
82.        }
83.        this.screenImage = ateImage(CS * maxX + CS, CS
84.                * (maxY + 1) + 32, true);
85.        this.screen = Graphics();
86.        for (stageNo = 0; stageNo < MaxStageNo(); stageNo++) {
87.            this.setupStage();
88.        }
89.        this.stageNo = -1;
90.        // 开场界⾯
91.        this.openDraw();
92.    }
93.    /**
94.      * 刷新关卡
95.      *
96.      */
97.    public synchronized void reset(int stageNo) {
98.        this.stageNo = stageNo;
99.        Mode()[stageNo] = 1;
100.        ssage = null;
101.        // 设定关卡

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。