Making「FP3(仮)」その3

Home PC-6001mkII Program etc

 このページでは、基本機能の実装過程を書いています。

Making「FP3(仮)」 Top


2009/06/27:戻り値その2
 PLAY文で鳴らす部分を、BIOSルーチンを使ってマシン語化しようとしたが、あえなく玉砕した。
 PLAY文の文字列開始アドレスをHLレジスタに入れて1EB3Hコール、と書き写したメモにはあったのだが、その通りに実行すると、なぜか「?BS Error」になる。仕方ない、とりあえず元に戻すか...。

 さて続きだ。6/23で戻り値を決めたが、戻り値をBASICで処理するのに都合の良いように値を変更する。
戻り値内容
1岩 or フルーツを押した
2くっつき
3岩変化
4ドアが開いた
5面クリア
6手詰まり

 戻り値を元に音を鳴らしてみる。やっぱり、簡単な音でもあると無いとでは大違いだ。

 まだ肉付け部分は色々あるが、それよりも面を取り揃えないと。昔作った面と、新規作成の面を合わせて10面なので、あと6面は作らなきゃ。

2009/07/04:アンドゥ仕様
 パズルゲームで、もう一つ必要な要素があった。アンドゥだ。という事で、アンドゥの仕様を決める。

 決めるべき事は「どの範囲をアンドゥ用の情報として持つか」と「どこまでアンドゥさせるか」だ。アンドゥ用の情報としては、大きく以下の3通りがある。
  1. 一手ごとに押したキーの情報を記録
  2. 一手ごとに画面の差分情報を記録
  3. 一手ごとに画面全体の情報を記録
 方法1は情報量が少ないので、メモリの消費量を抑える事が出来る。反面、一手だけアンドゥしたい時は面のはじめの状態から一手前の状態までのキー操作を内部で再現させる必要がある。
 方法2は、一手動かした時の画面変化が少ない場合に情報量を抑えられる。今回のプログラムでは効果的な方法だ。
 方法3は、仕組みとしてわかりやすい。ただし、毎回画面データを取る事もあって、メモリ消費量は大きい。

 結局、採用しようと思うのは、方法3だ。理由は一番処理が楽そうだから(^^;)。

 次に、どこまでアンドゥさせるかを考える。アンドゥ用のデータを収めたいメモリ空間は、E800H 〜 EFFFH。一画面分の情報は64バイトなので、1024÷64=16回分記録できる事になる。16手だとちょっと心許ないので、移動ごとではなく岩やフルーツを押したタイミングで記録を行う事にする。

 処理の概要としては、現在のポインタを「▼」、アンドゥ限界ポインタを「■」とした時に以下のルールにそって処理を行う。
  1. 移動の度に、移動直前の状態を▼位置に保存する
  2. 移動時に岩/フルーツを押したときは、処理1の後▼のポインタを次に移動する。
  3. ▼のポインタ移動時に範囲を超えたら、またはじめの位置に▼のポインタを戻す。
  4. ▼のポインタ移動後と■のポインタが一致したら、■のポインタを次に移動する。
  5. ■のポインタ移動時に範囲を超えたら、またはじめの位置に▼のポインタを戻す。
  6. アンドゥ時は、▼のポインタを一つ戻し(範囲を超えたら最後の位置に戻す)、▼位置にある画面データを現在の画面にコピーし直す
  7. ただし、アンドゥ実行時に▼と■のポインタが一致したら、アンドゥは行わない
 これをもう少しわかりやすくすると、下表のような感じだ。
#状態アンドゥ用メモリ空間
・・・1415
1初期状態■▼  ・・・  
2初回の岩/フルーツ
を押す前の移動
■▼Undo0
(移動直前)
  ・・・  
3初回の岩/フルーツ
を押した
■Undo0
(移動直前)
 ・・・  
42回目の岩/フルーツ
を押す前の移動
■Undo0▼Undo1
(移動直前)
 ・・・  
52回目の岩/フルーツ
を押した
■Undo0Undo1
(移動直前)
・・・  
615回目の岩/フルーツ
を押した
■Undo0Undo1
Undo2・・・Undo14
(移動直前)
716回目の岩/フルーツ
を押した
▼Undo0■Undo1
Undo2・・・Undo14Undo15
(移動直前)
817回目の岩/フルーツ
を押した
Undo16
(移動直前)

Undo1

Undo2
・・・Undo14Undo15
9アンドゥ1回目▼Undo16
(移動直前)
Undo1

Undo2
・・・Undo14Undo15
10アンドゥ15回目Undo16
(移動直前)
Undo1
■▼
Undo2
・・・Undo14Undo15
11アンドゥ16回目
(■▼が同じ位置に
あるのでアンドゥ不可)
Undo16
(移動直前)
Undo1
■▼
Undo2
・・・Undo14Undo15

 ...とりあえず処理の矛盾はないよな。という事で、この処理を実装することにする。

2009/07/06:16面
 7/4に考えたアンドゥ機能を実装する。合わせて、ようやく最低限の16面分が出来上がったので、データを入力する。

 ちなみに、面はどこで作ったかというと、携帯のメモ機能だ。これだと、電車の中でも作れるので便利だと思う。若干、面の検証が難しいのが難点だが...。

画面

 実際に面をプレイしながら、面データの入力ミスや面の順序の調整を行った。昔作った面も5面ほど入っているが、解法を忘れている事もあって少々解くのに時間がかかった。

 あとは、タイトルや面選択、面クリアといったその他処理だ。これでゴールが見えてきたかな?

2009/07/14:Fruit ...
 終盤の面くらいはもう少し難しくしたいなあ、と思い立ち、面の修正を行う。

 何度も同じ面を解いていると難易度がわからなくなってくるが、13面以降は一日空けると一部解き方を忘れる程度になったような気がする(トシのせいでない事を祈る)のでこの辺りにしておく。

 もう一つ、正式にタイトルを決めないといけない。出来れば、以下の条件に合うようにしたい。
  • 「FRUIT ???」か「フルーツ???」にする
  • 名前が内容にマッチしている
  • 現時点で検索したときの件数が少ない
  • 名称を略しやすい
 という事で、翻訳や辞書を参考に候補を出していく。

名称(英語)検索結果名称(日本語)検索結果
Fruit Junction124フルーツジャンクション1
Fruit Connect345フルーツコネクション0
Fruit Bond646フルーツボンド6
Fruit Join6370フルーツジョイン0
Fruit Gimmick158フルーツギミック6
Fruit Mystery3850フルーツミステリー132
Fruit Forest31800フルーツフォレスト1400
Fruit Mews5フルーツミューズ1450
Fruit Branch9370フルーツブランチ367
Fruit Joint523フルーツジョイント7
Fruit Fusion21300フルーツヒュージョン2
Fruit Paradox328フルーツパラドックス0
Fruit Ruins204フルーツルイン0
Fruit Jinx1フルーツジンクス3
Fruit Phantom192フルーツファントム2
Fruit Mirage208フルーツミラージュ2

 ...もうなにがなんだかわからなくなってきた。英語と略語の語感で、「フルーツミラージュ」にしようかな。でもまだ迷っている。

画面


2009/08/01:仕上げ
 実際にプレイしながら、面の難易度や操作性の調整を行う。アンドゥは、以前に16回分記録する事にしていたが、少し足りないように感じたので64回分まで拡張する。

 さて、あと残すはエンディングだ。とは思うものの、なかなかアイディアが出てこず、あっという間に2週間がたってしまった。仕方ない。埒が明かないので、作りながら考えよう。...ごにょごにょ...っと、こんなものかな?

 あとは、公開のためのドキュメントを整備する。

 作り始めから、実に3ヶ月が経ってしまったが、これでようやく完成だ。


その2 Making「FP3(仮)」