2012.6.12, by Careone <careone@139.com>
前言:在接触和使用Emacs过程中,玩过 gomoku 五子棋游戏,觉得在EMACS上用[2012/6/22更新]
windows 版本 Sokoban 下载:
http://www.abelmartin.com/rj/sokoban_prog1.html
---------------------
参考了一下EMACS/XEMACS旧版本中的 sokoban (仓库番)游戏,觉得很多东西可以通用:
* 关卡文件原理可以通用;
* 行走(TRACE)路线可以自动判断并生成 LURD 格式文件[上(Up),下(Down), 左(Left),右 (Right)];
如 AAA.XSB详细说明见后面;代码: 全选
rdLdlluRdrUruullDRdrUdldlluRdrUU
* sokoban (仓库番)下载:
-- EMACS 22.3, 23.4, 24.1 等较新版本的 EMACS 已经去除了 sokoban.e 游戏,可以试下较早版本的 EMACS;
-- XEmacs 21.4.22 中,自带有 sokoban.el ,下载位置:
文件1(主程序): sokoban.el
c:\Program Files\XEmacs\xemacs-packages\lisp\games\sokoban.el
文件2(关卡地图文件): sokoban.levels
c:\Program Files\XEmacs\xemacs-packages\etc\sokoban.levels
-----------
sokoban 在 XEmacs 菜单中的位置:
Tools >> Games >> Sokoban
当然也可以复制上面的文件到 EMACS 中,并在配置文件中加入下面几行(请按实际位置修改下面的文件路径)
Emacs 23.4 FOR WINDOWS 测试运行正常, 最新的 Emacs 24.1 测试报错无法运行游戏)
XEmacs 下载地址:
XEmacs and Supporting Libraries and Programs for Windows
http://www.xemacs.org/Download/win32/#I ... e-Download
LINUX下:------------------代码: 全选
(auto-compression-mode 1) (setq sokoban-level-file "/usr/share/xemacs21/packages/etc/sokoban.levels") (autoload 'sokoban "/usr/share/xemacs21/packages/lisp/games/sokoban.el.gz" nil t)
WINDOWS 下:需要添加的函数和变量代码: 全选
(auto-compression-mode 1) (setq sokoban-level-file "c:/Program\ Files/XEmacs/xemacs-packages/etc/sokoban.levels") (autoload 'sokoban "c:/Program\ Files/XEmacs/xemacs-packages/lisp/games/sokoban.el" nil t)
关于 okoban (仓库番)游戏,可以参考以下网站:代码: 全选
* defun maze-pass //通过某个门;
* 编程原理: HDU4213_Sokoban_模拟题_推箱子
http://hi.baidu.com/cchuncoder/item/cb4 ... 93260ae783
* sokoban 推箱子常见问题解答
http://sokoban.ws/faq.php
* 自动解题程序: sokoban722.zip WINDOWS 版本
http://www.ic-net.or.jp/home/takaken/e/soko/
直接下载(大小100 - 300K): http://www.ic-net.or.jp/home/takaken/e/ ... ban722.zip
* 魔方8俱乐部: http://bbs.mf8-china.com/forum.php?mod= ... lay&fid=57
* 歪推箱子(WINDOWS版本,附带上千种关卡)
http://sokoban.ws/ysokoban/ysokoban.php
* XSB(关卡地图文件)格式和LURD(行走路线)格式简介
http://sokoban.ws/xsb_lurd.phpXSB格式和LURD格式简介
Introduction to XSB and LURD
推箱子关卡一般用XSB格式来保存和交流:(In Sokoban community, levels are shared in a standard format called XSB)例子 (example)@ ==> 人 (man)
+ ==> 人在目标点 (man on goal)
$ ==> 箱子 (box)
* ==> 箱子在目标点 (box on goal)
# ==> 墙 (wall)
. ==> 目标点 (goal)
- ==> XSB格式空位代表“地板”, 但因为空位显示有问题, 就用“-”代替空位。(floor, represented by ' ' or '-')
关卡地图文件: AAA.XSBTitle: Classic level 1代码: 全选
----#####---------- ----#---#---------- ----#$--#---------- --###--$##--------- --#--$-$-#--------- ###-#-##-#---###### #---#-##-#####--..# #-$--$----------..# #####-###-#@##--..# ----#-----######### ----#######--------
Author: Thinking Rabbit 上面的XSB格式关卡就是下面的图片关卡
Below is the image of the above XSB level
这是答案:
(This is the solution in LURD format, l=left, u=up, etc. Uppercase letters stand for pushes.)
解题文件: BBB.LURD答案是LURD格式。代码: 全选
ullluuuLUllDlldddrRRRRRRRRRRdrUllllllluuululldDDuu lldddrRRRRRRRRRRRRlllllllluuulLulDDDuulldddrRRRRRR RRRRRllllllluuulluuurDDuullDDDDDuulldddrRRRRRRRRRR uRRlDllllllluuuLLulDDDuulldddrRRRRRRRRRRdRRlUlllll lllllllulldRRRRRRRRRRRRRuRDldR
l 或 L ==> 左
r 或 R ==> 右
u 或 U ==> 上
d 或 D ==> 下
小写字母是移动, 大写字母是推动。
LISP编程写出来的小游戏,虽然画面简单,但是同样很有趣味性。于是有了编个
迷宫智力游戏的想法。其实这个游戏创意很多年前就有一了一点思路。
虽然个人对 EMACS LISP的领悟有限,但如果能力和精力允许,可能会先写出一点粗糙的东西看一看。
如果有编程高手或游戏玩家有兴趣的,也可以来共同实现这个游戏,非常欢迎您的加入。
* 版权和授权声明:
一、本迷宫游戏创意的版权属于本人;
二、基于本迷宫游戏创意,制作用于非商业目的游戏开发,可以免费使用本创意进行软件开发及其它衍生项目,
但请提前以电子邮件方式或其它法律认可的通信方式联系本人进行授权认可,也算是对我的一种尊重和鼓励
(基本上只要是网友自愿开发的,给我打个招呼就可行了,不会有其它限制);
三、基于本迷宫游戏创意,开发用于商业用途的游戏及相关衍生项目,不管开发的是收费软件还是免费软件,
都需要以电子邮件方式或其它法律认可的通信方式联系本人进行授权认可,否则视为侵权;
四、未尽事宜或有其它建议,请联系本人;
*** 版权和授权声明的原意:
* 自已能对游戏的规则性和原则性进行有效掌控,不致于被某些软件厂家抄袭然后声称是他们自家想出来的,
然后为了吸引游戏玩家把游戏规则改得乱七八糟让人恶心;
* 保证游戏开发厂商都有机会按这个创意开发自家版本的游戏,减少垄断和版权纠纷,利于游戏推广和玩家体验;
* 也有一些个人私心在里面,你懂的;
1. 游戏简介
在10X10的四方房间里,各有上下左右四扇门。玩家从入口进入,穿个可通过的门,找到藏在某个房间里的宝物,然后成功走出来,即为过关。
1.1 机关设计:房间里的门有各种状态:从门的左侧或右侧敲门(knock),可能会有不同的效果(可打开或不可打开),穿过(throught)这扇门后,再从门的左侧或右侧原路返回时,也可能会有不同的效果(可打开或不可打开)。即门的机关有多种状态:
*正面左侧敲门:可打开(active door),不可打开(fixed door);
*正面右侧敲门:可打开,不可打开;
*背面左侧敲门:可打开,不可打开;
*背面右侧敲门:可打开,不可打开;
*门的状态未知(unkown door);
*门的状态可能随时改变(如有触发机关(alternative door),或可随机控制改变(controled door));
提示:某扇门能打开或通过,并不代表进入的房间是安全的:
安全房间(safe room):房间能进能出;
死亡之屋(dead room): 房间进去后,从哪个门都不返回;
*** 为了游戏考虑,房门状态可简化设计,只分可通过,不可通过两种状态;
1.2 宝物(Gift)设计
宝物藏在某个随机的房间里,也可能被某个玩家找到并移放到另一个房间里;
1.3 情报(Infomation)设计
情报分为普通情报(normal infomation)和绝密情报(top secret infomation)两种。情报的来源分多种情况:系统提供;过路人,队友,对手留下的;商人出售的;或玩家自己创建的。
普通情报提供了某段路程的通行方案,但可能某几步的走法缺失,甚至是错误的,玩家需要仔细判断情报中每一步的真伪;
绝密情报可信度和价值要更高一点,但也可能是残缺的通行方案,也可能某几步是错误的,同样需要玩家判断,不能完全依赖或相信情报;
1.4 房间编号和房门符号设计
房间从左到右按字母A-Z编号,然后是AA,AB...,以此类推;
房间从上到下按数字1, 2, 3...编号;
房间代码即为A1, A2...AA1, AA2...
房间和房门上可以带有不同的符号标记,如数字,字母,玛雅文字,某种LOGO, 甚至是某个品牌或产品的广告词和广告LOGO,增加游戏的趣味性。
* 房间布局设计图
代码: 全选
A B C D E F G H I J
|===|===|===|===|===|===|===|===|===|===|
1
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
2 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
3 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
4 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
5 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
6 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
7 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
8 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
9 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
10 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
2. 游戏模式
* 标准模式(Normal Mode): 可以得到某些情报;
* 谎言模式(Lie Mode): 得到的情报(如捡到的,或是从奸商那买到的),哪怕是绝密情报,仍然会出现多处错误!
(如同真实的社会,谎言和骗子无处不在,需要玩家擦亮眼睛,保持清醒的认识,用心解读);
* 灾难模式(Disaster Mode): 会出现死亡之屋(dead room),进去后无法再出来,只能GAME OVER(除非有死亡之屋的钥匙,或者 被BOSS或高级角色改变了敲门位的打开属性才能脱离困境);
* 疯狂模式(Crazy Mode): 房门的通行状态可能因为打开过而触发改变(如某个房间有2人,第一个人成功通过北门后,
即触动了机关,北门状态马上改变为不可打开,第2个人原路无法再从北门通过。
通行方法是团队整体通过北门);或者被某些机关控制改变(这个人可能是BOSS或者对手,
也可能是系统随机变换);
3. 代码和文件格式设计
3.1 迷宫情报文件 (*.mi = Mize Information)
代码: 全选
/* Mi */
version="1.0"
;;; *.mi = Mize Information file
[profile]
id=""
;
;;; 普通或绝密情报
level="normal/top-sectet"
;
;;; 情报来源: 未知/自己/过路人/朋友/队友/对手或敌人/小贩
source="unknown/myself/passby/friends/team/opponent/vendor"
;
;;; 情报价值:0/1/2/3/4/5=未知/很差/差/一般/好/非常好
worth="0/1/2/3/4/5"
;
;;; 情报完整性: full=全程,part=某段, multi=多段;
complete="full/part/multi"
;
;;; 情报完美度/有多少错误: 1=完全可信;0=未知;-1/-2/-...负号后面的数字代表错误个数;
prefect="1/0/-1/-2/-..."
player=myself
timestamp="2012/06/06, 12:00"
tag="play001"
description="my path 1"
[region]
;;; 情报通行区间
?@A1 N@A2, ?@D5
[path]
;;; 通行路线
;
;;; 门的方位
;; N = northern/up 北门/上
;; S = southern/down 南门/下
;; W = western/left 西门/左
;; E = eastern/right 东门/右
;; ? = unknown 方位门未知
;
;;; 1 从西门进入A1房间
1=W@A1
;
;;; 2 走南门进入A2房间
2=S@A2
;
;;; 3 走西门进入B2房间
3=W@B2
;
;;; 4 走南门进入B3房间
4=N@B3
;;; 5 走东门进入A3房间
5=E@A3
;;; 6 走北门进入A2房间(又回到了A2房间)
6=N@A2
;
;;; 中间房间的走法残缺未知,现在跳转到其它房间;
;;; 这种标记方式可用于标记某个房间有宝物,或者有危险,或者需要特别注意;
;;; 现在已经在G5房间,但不能确定是从哪个房间哪个门进来的;
A1=?@G5
;
A2=E@F5
A3=?@?
A4=?@?
A5=?@?
A6=?@?
;
;;; 现在又回到F5房间了
;
;; 想办法到达D5房间,这个房间有宝物 (Gift);
B1=?@D5
;
;;; 想办法到达I10房间,从这里可以成功走出去;
C1=@I10
C2=N@EXIT
[import]
G1=*@D5
;
;;; C7/G2房间里有情报(Information)
I1=*@C7
I2=G2
;
;;; H3房间里有小贩(Vendor),也许能从他们手上获得情报;
V1=H3
;
;;; H4房间里有游戏帮助员(NPC),也许能从他们手上获得情报;
N1=H4
[danger]
;;; 以下房间有危险,通行时请小心
;;; 从任意入口进入F8房间都可能有危险
1=*@F8
;
;;; F8房间可能有危险,但不知道从哪几个门进去才会出现危险(也许从其它门进F8房间是安全的);
;1=?@F8
;
;;; 从北门进入F8房间有危险
;1=N@F8
;
;;; 从东/南/西/北门进入F8房间都有危险
;1=NSWE@F8
;;;
[disable]
;;; 走过的无效路线,记录在 [disable] 字段内,至少知道哪些路段是行不通的;
player=myself
timestamp=2012/06/06, 12:00
tag=play001
description=my wrong path 1
A1=?@G5
;
A2=E@F5
A3=?@?
A4=?@?
A5=?@?
A6=?@?
* 行走路线及代码含义如下:
^ v < > : 分别代表通行方向:上/下/左/右;
字母 o : 代表经过的房间;
字母 G: 代表房间有宝物(Gift);
字母 I: 代表房间有情报(Information);
字母 K: 代表房间有钥匙(Key), 可以用它来打开死亡之屋的某个敲门位. 每把钥匙只能使用一次;
字母 V: 代表房间有小贩(Vendor);
字母 N: 代表房间有游戏帮助员(NPC);
感叹号 !: 代表死亡之屋(dead room), 进去后就无法再出来,应避开;
EXIT: 代表安全出口;
房间内还可增添其它身份的人或状态,如
F = Friends 朋友;
T = Team members 队友;
O = Opponents 对手或敌人;
...
代码: 全选
A B C D E F G H I J
|===|===|===|===|===|===|===|===|===|===|
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
1 --> o . . . . . . . . . .
---- +-v-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
2 . o > o . . . . . I . . . .
---- +-^-+-v-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
3 . o < o . . . . . . V . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
4 . . . . . . . . N . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
5 . . . . G . . o < o . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
6 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
7 . . . I . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
8 . . . . . . ! . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
9 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+
10 . . . . . . . . . . .
---- +-.-+-.-+-.-+-.-+-.-+-.-+-.-+-.-+-|-+-.-+
.
EXIT
3.2 迷宫地图文件
代码: 全选
/* MM */
;;; *.mm = Mize Map file
version="1.0"
id=""
tag=""
description=""
tag[zh_CN]=""
description[zh_CN]=""
[layout]
;;; 前面是房间号
;;; 第一个数值代表房间状态:0为默认值。G代表有宝物,I代表有情报。
;;; 其它代码参考 .mi 情报文件中相关内容, 同一房间可以有多种状态同时存在;
;;;
A1=0,00001111
;A1=GI,11111111
;;; 每个门的代码,如在每个房间内有四种/八种敲门位置,按顺时针方向分别编号为1-4号敲门位/1-8号敲门位;
;;; 0代表敲门位无法开门,1代表可以开门。2代表每通过这个敲门位一次(不管是进还是出),马上切换为不可进入,
;;; 再通过(当然只能从背面进来)又变成可以通过。2的主要作用是利用这种变化躲避对手或BOSS的追赶;
;;; 4代表可以被控制改变(如BOSS或高级角色)。8的作用是表明该敲门位的状态未知。 0/1/2/4/8可以叠加出现多种属性。
;;; 1+2+4+8 = 16进制数字 F (即只要是大于8的数值,都表示该敲门位的状态暂时未知。)
;;; 如 "A1=GI,73111111" 中7/3的含义:
;;; 第一个数字7:7=1+2+4,即1号敲门位: 当前状态为可以打开,但是进去后,
;;; 跟在后面的人因为2的原因却无法追过来;但是如果追赶你的是BOSS,那就没那么好了,因为BOSS可能因为4的原因打开敲门位);
;;; 7后面的第二个数字3:代表2号敲门位。效果与1号敲门位前面的功能基本相同,不同的是BOSS也无法从这个敲门位进入;
;;; +---4---+
;;; . .
;;; 3 o 1
;;; . .
;;; +---2---+
;;; +-7-.-8-+
;;; 6 1
;;; . o .
;;; 5 2
;;; +-4-.-3-+
;;; 提示:某扇门能打开或通过,并不代表进入的房间是安全的:
;;; 安全房间(safe room):房间能进能出(但可能只有从其中某个敲门位才能进来或出去);
;;; 死亡之屋(dead room): 房间进去后,从哪个门都不返回(除非有死亡之屋的钥匙,或者BOSS改变了死亡之屋里敲门位的属性,变成了可以通行的活门);
;;; 八阵图:生(safe)、伤(hurt)、休(abiosis)、杜(trap)、景(hopeful)、死(dead)、惊(shock)、开(alive)八门