PentaPiece 製作過程 その2

Home PC-6001mkII Program etc

 このページでは、PentaPieceのV1.0作成過程を書いています。

PentaPiece 製作過程 製作過程


2015/08/12〜14:付加表示
 敵の強さ調整は後回しにして、表示関係を作りこむ事にする。

 まずは、得点表示だ。空白にピースを置いた時と敵の陣地を置いた時に得点表示を行う。NegaToggの時と同様に、得点表示専用の変数および表示処理を用意する。こういう時に、過去に作り上げた資産(というか考え方)が流用できるのは大きな利点だ。

画像

 とりあえず作ったが、表示中に敵のターンも終わって次の自分のターンが始まっている、といったように表示のタイミングは今一つだ。この辺りも考えていかねば。

 あと敵がピースをどこに置いたかもわかるようにしたいので、ピースを置く際にピース位置を枠表示する処理を追加する。合わせて処理の各段階を分けるため、処理モードを追加する。とりあえず以下のような感じで。
  • mode=0:自ピース移動
  • mode=1:自ピース枠表示+ウェイト0.5秒
  • mode=2:得点表示
  • mode=3:敵思考
  • mode=4:敵ピース枠表示+ウェイト0.5秒
 若干のタイミングの調整はするだろうが、概ねこんな感じで行こうと思う。

 ところでだ。この時点で規定サイズ6000バイトを大きくオーバーしている。まだする事はあるけど、まずはこの時点でダイエットするか。

 start.ax:7,343/6,000バイト

2015/08/15:ダイエットその1
 さて、サイズ削減だ。

 まずは、敵思考のデバッグ表示部分をコメントアウトする。これだけで、約300バイトの削減。

 次に、同じ計算部分を変数化して使い回す。
今回の場合、「(mch*4 + mrot) * 5」が2か所で使われていた。これだと、変数化(+36)と使い回し(-24 x 2)で差し引き-12バイト。重複数が少ないと効果も薄いが、サイズ削減に関して言えば使いどころは案外多い。

 あとは、いつも行っている部分について削減を行う。
  • 配列変数初期化部分の省略
    配列変数を読む処理の前に値を書き込むという事さえ守れば、最初にdimで初期化しなくてもエラーにはならない。ただ、その「暗黙のルール」を忘れてエラーが出る事もあるが。
  • 引数の省略
    color 0,0,64 → color ,,64 のような感じ。
  • 変数代入の省略
    x = (ptr \ 9) * 60: y = (ptr / 9) * 60: pos x, y
    → pos (ptr \ 9) * 60, (ptr / 9) * 60 のような感じ。
  • 不要となった処理や変数の削除
 その他、処理内容の変更でサイズ削減をしていった結果、6,291バイトまで削減できた。まだ削減は必要ではあるが、作りこみの続きをしようか。

 start.ax:6,291/6,000バイト

2015/08/16:スコア登録
 これまでほとんど手を付けていなかった、スコア登録処理を作るとするか。

 その前に、登録する情報を考えねば。今回は個人の成績ではなくチームの成績を重視したいのと、あとで様々な集計をしたい。という事で、以下のように色々情報を詰め込んでみた。
  • 8バイト x 4:色別総得点(緑黄青赤 x 16進数8バイト)
  • 8バイト x 4:色別プレイ回数(緑黄青赤 x 16進数8バイト)
  • 8:今回プレイの得点
  • 1:今回プレイ色(0〜3)
  • 1:今回敵色(0〜3)
  • 8:今回プレイの日付(YYYYMMDD)
 ちょっと詰め込み過ぎかもしれないが、まあこんな所で。まあ、最終的にはもう少し詰め込んでいるのだが。

 合わせて、タイトル画面も少し変える。タイトル画面からEnterキーでゲームスタートしていた部分を、ボタンクリックで始めるようにする。タイトルは、もう少し後回しで。

画像

 音が入っていないが、これで概ねやりたい部分は作り終わった。しかし…これは本当に6,000バイトに収まるのか?

 start.ax:6,799/6,000バイト

2015/08/17:タイトル
 話は前後するが、今回もタイトルを何にするか悩んでいた。

 5に関連して、語感が良くて、頭脳ゲーム的な無機質な感じで、そして検索であまりヒットしないもの。「侵略」や「陣取り」「勢力」といった単語を英語にしてみるも、今一つピンとこない。

 「テンタクルズ」ならぬ「ペンタクルズ」だとどうかと思ったが、検索すると似た名前でイカの映画が出てきた。むう、ちょっとイメージと違うな…。

 もっと無機質に、5つ一組のピースを使うという事で、ペンタピースなんかどうだろうか。再度検索してみると、今度はなぜかポケモンが検索された。とはいえ、モンスター名などの固有名称ではなさそうだし大丈夫かな。とりあえず「ペンタピース」で仮決定しよう。

画像

 まあ、仮決定は決定とほぼ同義なのだが。

2015/08/17〜19:ダイエットその2
 さて、どこから手を付けようか。

 まずは、カーソルの表示を変える。これまで、選択色+黒バックで表示していたものを、白色に変更する。合わせて、陣地とカーソルが重なった時の見づらさを軽減させるため、陣地の星部分を少し暗い色に変更する。これで33バイト削減。

 次、敵の思考ルーチンで8x8の場所のスコアを求める処理で2段階ループを行っていた所を1段階ループに変更する。これで48バイト削減。

 次!処理順序の変更を行う。数値変数の初期値が0なのを利用して、以下のように変更する事で16バイト削減する。
変更前変更後
repeat 18
 ptr = cnt * 20: n0 = cnt * 3
 repeat 5
  :
  ptr++
 loop
loop
repeat 18
 
 repeat 5
  :
  ptr++
 loop
 ptr += 15: n0 += 3
loop

 次!出現するピースの種類を事前にシャッフルしていた処理を削除し、都度rnd()で決定するように変更。これで180バイト減!

 他にも不要変数の削除等行い、合計で345バイト削減できた。まだ削減も半ばなのだが、ここからまた追加欲が出る事となる。

 start.ax:6,454/6,000バイト

2015/08/20:性格付け
 追加欲、それは敵の性格付け。

 せっかく敵の色が4色あるのだから色ごとに異なる性格を持たせた方が面白いのではなかろうか?
 今の敵の思考ルーチンでは、空白、陣地レベルアップ、自軍打消しの3項目の評価スコアを足し合わせ、ランダム値を足した値の最大値で敵の一手が決まる。このそれぞれの項目に重み付けを加えれば、性格っぽいものが作れるのではなかろうか。

 とりあえず目標として、こんな感じの性格付けを目指す。
  • 緑:守りが固い (レベルアップの割合が多め)
  • 黄:バランスが良い (ランダムの割合が少な目)
  • 青:足が速い (新規の割合が多め)
  • 赤:攻撃的 (自軍打消しの割合が多め)
 敵の強さ調節は後回しにして、評価スコアの重み付けの処理を組み込んだ。当然ながら、またプログラムサイズは大きくなった。あと700バイト…削減できるのか?

 start.ax:6,700/6,000バイト

2015/08/21〜28:ダイエットその3
 機能追加も行って満足したところで、またサイズ削減に勤しむ。
  • 数値文字列を数値に変換するには、「INT(〜)」より「0 + 〜」の方が省サイズ
  • 変数の負数表現「-v」より、0からの引き算「0 - v」の方が省サイズ
  • 変数への0代入「v = 0」より変数初期化「dim v」の方が省サイズ
  • 不要になったラベルを削除すると省サイズ
 といった事を繰り返し、少しずつサイズを削っていく。でも、このあたりまで来るとなかなかサイズも減らない。こうなったらやむを得ない…陣地の表示を簡素化するか。

 少し試行錯誤して、ベース色の●に水色がかった白の丸付き数字を重ねたものにした。

画像

 この時点で6,294バイト。残り500バイトを切った事で、少し希望が出てきた。だが、まだまだな事に変わりはない。

 さらに、地道なサイズ削減を行う。
  • タイトル画面のボタンの飛び先を一か所にし、statで押されたボタンを判定
  • ボタンの飛び先が一か所になったのでループ化
  • ピースを置いた時に表示する枠をmesで直接描画するよう変更
  • 未使用変数の削除
  • 一部ワーク変数を経由した処理を、ワーク変数を経由しないよう処理変更
  • 敵思考ルーチンの全面書き直し
 これで、ようやく6,000バイトを切った。
 start.ax:5,932/6,000バイト

2015/08/29〜30:V1.0完成
 地道な努力の甲斐あって、少し余裕が出来た。さて、何を付け足そうか。

 音を入れられればいいけれど、さすがに残り68バイトでは収まらない。うーむ、もう少しだけランキングの記録内容を充実させるか。

 この時点で、色毎の累計得点,色毎のプレイ回数、今回の選択色と敵の色、今回の得点、日付の情報をランキング情報として入れ込んでいるのだが、色別勝利数も追加するかな。という事で、色別プレイ回数の部分を2等分して勝利数の情報を入れ込む。

 案の定、また6,000バイトを超えてしまったので、また全体的にサイズ削減の見直しを行った。サイズ削減も必ずどこかに限界は来るものだが、意外となんとかなるものだ。

 なにはともあれ、これで完成!集計できるくらいにプレイデータが貯まればいいな。
 start.ax:5,989/6,000バイト


その1 PentaPiece 製作過程