last updated : [99.4.27 (Tue) 22:44:47]
いったん決めて動いてしまうと後から変えるのはなかなか大変ですから、 充分に考察し、融通が効いて拡張性の高いフォーマットにする必要がある と考えています。
ここでまとめたものも、まだ、どのプログラムにも実装されていない叩き 台のようなものです。改良のアイデア等あればお願いします。
これは、製品版の名称、制作者、テーマなどで分類した「画面セット」の単位で まとめて、ディレクトリを掘って管理されています。
(例)perfect, yos_weekly, upside-down-scratch, ...
この画面セットのキーと面数を指定すれば画面データは一意に定まります。
(例) perfect #290, yos_weekly #31, upside-down-scratch #23, ...
(例)自力で解答済ならば、自動解答プログラムを起動できる
同様に、Mule版の解答データは"answer.[0-9]+"というファイル名で記録してい ます。これは、もとはといえば xsokobanのファイル名のつけ方に由来している のですが、screen.1 screen.2 screen.3 ... screen.10 screen.11 ... screen.100 screen.101
screen.1 screen.10 screen.100 screen.101 ... screen.2 ...のようになってしまう。
そこで、将来は、面数のほうはゼロを補って「.」の前の部分に含め、("010"等、 最大 3桁?)共通の拡張子を持つ形式へと移行する予定です。
しかしながら、いろいろなプログラムが従来のファイル名の形式を前提にしてい るというしがらみがあって、なかなか変更に踏み切れずに今までずるずるきてい ます……
「 」 空白 「#」 壁 「.」 格納地点 「$」 荷物 「@」 プレイヤー 「*」 格納地点上の荷物 「+」 格納地点上のプレイヤー
(画面イメージ) Title: タイトル Author: 作者 Limit: 手数制限 Comment: コメント Comment-End:
そのかわり、(可能ならば)画面セット名とレベル数を記録して、タイトル 等はロード時に画面データファイルを参照して得るようにする。画面セッ ト、レベル数を得られない場合はファイル名、画面データのソース等を記 録する。
付帯する情報は省略しても画面イメージだけは記録しておくのは、元の画 面データファイルが変更されたり削除されたりした時、あるいは別の環境 に持っていった時でも、単体だけで再生できるための保険として。
たとえば、ある動作が「荷物を押す動作」であるか「単なる移動」である かは、区別して記録しなくても初期配置と移動方向を追っていけば判別で きるが、荷物を押したトータルの回数を知りたい場合、異なるシンボルで 記録しておいた方がはるかに処理が簡単。
[初期画面イメージ] ---saved-image--- [セーブ時の画面イメージ] ---information--- status:cleared screen-set:perfect level:1 platform:XEmacs sokoban version:1.0 options:hint-level 3 player:hir time-stamp:Mon Jun 22 16:30:35 1998 moves:70 pushes:26 first-time-stamp:Mon Jun 22 16:41:02 1998 first-moves:72 first-pushes:26 ---trace-data--- [トレースデータ]
タグ: 値
という形で記録します。記録できるものは何でもありとして、プログラムが扱い 方を知らないものは単に無視します。
空行は意味を持ちませんが見やすくするために適宜挿入できます。
(例 1) screen-file:/tmp/work/screen.1
(例 2) screen-source:/home/hir/Mail/sokoban/117 region-beginning:2947 region-end:3409
platform: 倉庫番プログラムの名称 version: プログラムのバージョン options: 特筆すべきオプション(マウス簡易操作 ON/OFF、ヒントレベル等) player: プレイヤー名自動解答プログラムでは
solver: 自動解答プログラムの名称 version: プログラムのバージョン options: 起動時に与えたオプションという感じでしょうか。
フォーマットは自由です。可読性が高いように、空行で動作を区切った上 で一行あたり10手 or 20手程度に分割し、適宜コメントを入れた形が望ま しいですが、面倒な場合は一行に全部詰め込んでしまってもかまいません。
空行が意味を持つことに注意してください。データを見やすくするのと同時に、 実際の動作の区切りでもあります。
####### # @...# # #### ###$ # # #$# # # $ # # # ##### ##### ---saved-image--- ####### # @***# # #### ### # # # # # # # # # ##### ##### ---information--- status:completed screen-set:perfect level:1 time-stamp:Fri Mar 12 16:22:56 1999 moves:70 pushes:26 ---trace-data--- dDDllddrrUUUUluRRRlldddlldRdrUUUUluRRddrrrddllUdrruulLLulDDlddrUUUUluR
####### # @...# # #### ###$ # # #$# # # $ # # # ##### ##### ---saved-image--- ####### # @***# # #### ### # # # # # # # # # ##### ##### ---information--- status:completed screen-set:perfect level:1 time-stamp:Fri Mar 12 16:22:56 1999 moves:70 pushes:26 first-time-stamp:Mon Jun 22 16:41:02 1998 first-moves:72 first-pushes:26 ---trace-data--- ; $(3,3) -> *(6,1) ; @(3,1) -> +(5,1) ; 18 moves / 9 pushes ; total: 18 moves / 9 pushes "最初に運べる荷物はこれしかない" dDDllddrrU UUUluRRR ; $(2,5) -> *(5,1) ; +(5,1) -> +(4,1) ; 19 moves / 7 pushes ; 37 moves / 16 pushes (total) "二個目の荷物を片付ける" lldddlldRd rUUUUluRR ; $(5,4) -> *(4,1) ; +(4,1) -> @(3,1) ; 33 moves / 10 pushes ; 70 moves / 26 pushes (total) "最後の荷物/これは左のスペースを使って回して運ぶ" ddrrrddllU drruulLLul DDlddrUUUU luR
S式というのは"Symbolic Expression"の訳で、Lispで記述できるデータ構造の基 本となるものです(これはとてもおおざっぱな説明なので突っ込まないでくださ い……)。
ここまで説明してきた仕様でトレースデータを記述すると、実際にemacs-lisp (というかLisp)で読み込むプログラムでは、その処理はとても横着できるように なっています。
コメントは勝手に読み飛ばされるので何も考える必要はありません。空行を「マ ウスによる指示」を示すシンボルに変換した後、先頭と末尾にカッコを補って
( トレースデータ )として読むと、全体を一気に読み込めるようになっています(ずるい……)。あと は、移動シンボルを個々のシンボルに分解するだけです。
「任意の S式が置ける」ことによって具体的に何をやりたいかというと、現在よ りも記述力を高めて、トレースデータには何でも好きなものを組み込めるように しようということです。たとえば、現状でも
"メッセージ"によって一定時間メッセージを表示できますが、実際に使ってみると、断片的な 文章だけでは記述力が足りないと感じられます。そんなとき、画面の一部をマー クアップする関数を用意すれば、トレースデータに次のように記述することで、 一定時間、指定した領域を強調表示することができます。
(例)
--------------------------- cut here --------------------------- (sokoban-mark-region 'room-by-intial-relocation '((14 8) (15 8) (16 8) (14 9) (15 9) (16 9))) "これで前半の整理が終わって、この領域に荷物一個分の余裕ができた" (sokoban-unmark-region 'room-by-intial-relocation) --------------------------- cut here ---------------------------上の例で使っている関数の仕様は私が即席ででっちあげたものです。このように、 任意の S式を書いていいことにしておいて、それを実行時に評価すれば、なんで もありの世界になります。
つまり、現状で一定時間メッセージを表示する
"メッセージ"
は、
(sokoban-display-message "メッセージ")の省略形で、特例として文字列リテラルが出てきたときは上のように処理 するという約束にすぎません。あまり複雑にすると使いこなすのが面倒か もしれませんが、拡張が可能な枠組を用意しておくことは無駄ではないと 考えています。
本当は、トレースデータを編集するための、倉庫番トレースデータ編集モードを 作ろうという構想があったのですが、、、
* ... 内容が重要と思われるもの。
[sokoban-ML - No.00244] Re: VB版ついに完成! takaken * [sokoban-ML - No.00245] trace data format hir * [sokoban-ML - No.00246] Re: trace data format takaken [sokoban-ML - No.00247] Re: trace data format Twink * [sokoban-ML - No.00251] Re: trace data format hir [sokoban-ML - No.00252] mouse symbol in undo stack hir [sokoban-ML - No.00253] Re: mouse symbol in undo stack takaken [sokoban-ML - No.00254] Re: mouse symbol in undo stack hir [sokoban-ML - No.00290] authors of revenge etc. hir [sokoban-ML - No.00291] Re: authors of revenge etc. yoshio * [sokoban-ML - No.00294] trace data format (continued) hir * [sokoban-ML - No.00296] Re: trace data format (continued) takaken * [sokoban-ML - No.00299] Re: trace data format (continued) hir [sokoban-ML - No.00300] Re: trace data format (continued) takaken [sokoban-ML - No.00302] Re: trace data format (continued) yoshio [sokoban-ML - No.00304] download trouble etc. hir [sokoban-ML - No.00306] Re: download trouble etc. takaken [sokoban-ML - No.00307] euc code and snapshot function etc. hir [sokoban-ML - No.00308] ETC.... okiyasu [sokoban-ML - No.00312] snapshot function hir [sokoban-ML - No.00313] Re: ETC.... hir [sokoban-ML - No.00321] Re: 件名$,0[>o Twink [sokoban-ML - No.00322] Re: snapshot function takaken [sokoban-ML - No.00331] how to arrange etc. hir [sokoban-ML - No.00338] etc. hir [sokoban-ML - No.00345] Re: File name of screen yoshio [sokoban-ML - No.00351] 色々 okiyasu [sokoban-ML - No.00383] 環境問題 monry [sokoban-ML - No.00389] Re: 環境問題 takaken [sokoban-ML - No.00390] Re: 環境問題 hir [sokoban-ML - No.00454] 面データのファイル名について monry [sokoban-ML - No.00457] Re: mic氏からのメール yoshio [sokoban-ML - No.00460] Re: 面データのファイル名について hir [sokoban-ML - No.00461] 倉庫番研究室あれこれ monry [sokoban-ML - No.00463] Re: 倉庫番研究室あれこれ takaken [sokoban-ML - No.00465] Re: 面データのファイル名について monry [sokoban-ML - No.00475] Re: 倉庫番研究室あれこれ monry [sokoban-ML - No.00765] Re: [prog] programs by yoshio yoshio [sokoban-ML - No.00766] Re: [prog] programs by yoshio hir [sokoban-ML - No.00767] comment extension etc. hir [sokoban-ML - No.00768] Re: [prog] programs by yoshio yoshio [sokoban-ML - No.00770] monry-light (4) etc. hir [sokoban-ML - No.00773] Re: monry-light (4) etc. yoshio [sokoban-ML - No.00845] Re: [prog] how to handle duplicated stages hir [sokoban-ML - No.00851] Mac 版「倉庫番セレクション」 097面 kazuo * [sokoban-ML - No.00852] Re: Mac 版「倉庫番セレクション」 097面 hir * [sokoban-ML - No.00854] Re: Mac 版「倉庫番セレクション」 097面 deepgreen * [sokoban-ML - No.00858] Re: [prog] standard data type yoshio * [sokoban-ML - No.00864] trace data format hir * [sokoban-ML - No.00865] Re: [prog] standard data type hir * [sokoban-ML - No.00900] [map] mic-scratch-99 ready hir * [sokoban-ML - No.00901] RE: [map] トレースデータ仕様 deepgreen * [sokoban-ML - No.00904] RE: [map] トレースデータ仕様 hir [sokoban-ML - No.00976] Sokoban HP 作成にあたってのお願い deepgreen
HTMLで書き始めてしまったのですが、plain textの方がよかったでしょうか。
英語版も用意したいところですが、余力あればということにさせてください……