PentaPiece 製作過程 その1

Home PC-6001mkII Program etc

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

PentaPiece 製作過程 製作過程


2015/08/01〜03:はじめに
 不意に、HSPプログラムコンテスト開始のツイートが流れてきた。もうそんな季節か。

 軽く応募要項を見たところ、今年もHSPTV部門は残っているようだ。ならば今年もHSPTV部門で作るしかあるまい。まだ何もネタはないけど。

 なにか時事ネタに沿った方が良いかな。今年の出来事といえば...うるう秒か。と考えを巡らせるが、どうもゲームとして成立するほど発展する気配が感じられない。

 むう、どこかにネタが落ちてないかな。

 それから2日たった朝、職場について始業前に軽く寝たあたりで、元ネタが舞い降りた。そうだ、スプラトゥーンだ。あの、チームで協力して領土を広げるという仕組みは使えるのではないだろうか。

 といっても多人数同時のアクションゲームを作るのは色々無理がある。でも何か他の形で実現できそうな気もするし、とりあえず、この方向で考えてみよう。

2015/08/03:やりたいこと
 テトリス風のピースを置いて陣取り合戦をする思考型ゲーム。こんなのでどうだ?
 とりあえず、できるかどうかはわからないけど、基本的なルールを考える。
  1. フィールドは6x6。
  2. ピースはテトリス風。4から5ブロック位で構成?
  3. CPUと交互でピースを置いていく。
  4. ピースは、既においている所に重ねておく事が出来る。ただし、最低1つは空白部分を埋めなければならない。
  5. 自分の色になっている所に重ねておくと、ピースのレベルが上がる。レベルは5段階程度?
  6. 自分とCPUの両方がブロックを置けない状態になった時に、合計得点が高い方が勝ち。
  7. 最初に、自分の色(緑黄青赤)を決める。CPUは、ゲームスタート時点で総得点が少ない色をある程度優先的に出す。
 まあ、例によって、最終的にはここから様々な変更があったわけだが。

2015/08/03〜04:ブロックパターン
 まずは、ブロックのパターンについて調べる。

 回転パターンは同一と考えると、4ブロックパターンはテトリスによくある7パターン。

画像


 5ブロックパターンは、...えーと、以下の18パターン。

画像

 合わせて25パターンか。6x6のフィールドで毎回必ず空白が1つ以上埋まる事を考えると、そんなにパターン数は必要ないか。プログラムサイズの制限もあるし、この時点で、5ブロックパターンを採用する。

 5ブロックパターンは、全て5x3の範囲内に収まる。つまり、5x3の15bitの情報があれば1パターンの回転パターンが出来上がる寸法だ。5bit部分の32種類を「0」(キャラクタ番号48)〜「O」(キャラクタ番号79)に割り振って、3文字の情報に変換する。


 回転パターンは、データを使い回す事を考えると、ブロックデータは3x18=54バイト。このデータを元に、5x5に展開するための処理を作成して、データが正しくできたか確認する。

画像

 まあ、こんな所か。
 start.ax:821/6,000バイト

2015/08/05〜06:ルール不備
 昨日は1パターンを5x5=25の配列変数に展開していたのだが、なんかムダじゃないか?

 5ブロックパターンなら1パターンあたり5つの情報で十分だろう、という事で、パターン内の5つのブロックを左上部分からの相対位置になるよう、パターン生成ルーチンを作り直した。

 最低1つは空白部分を埋めなければならない というルール、よくよく考えると、四隅しか空白がない状態で十字ピースが来たら置けないぞ!? うーむ、パスをする処理を入れる必要が出るのかな、サイズ的に処理を入れるのは辛そうだけど。まあ、後日考える事にしよう。

 あとは、画面表示を行うためにピースのキャラクタを考える。●に★を散らすような感じでどうかな?某ボールみたいだけど。

画像

 start.ax:1,530/6,000バイト

2015/08/08:ピース判定
 「空白部分を含まないと置けない」判定処理を作成する。

 簡易的にピースを移動する処理を作成し、ピースを置く位置に空白が含まれるか否かでカーソルの表示を変えるようにする。

画像

 端への移動制限をまだつけていないので、本来置けない部分でも置ける判定をしてしまう。ピースの回転でも問題になるだろうし、画面端の自動調整も必要かな。
 start.ax:2,130/6,000バイト

2015/08/09:思考の試行 その1
 カーソルが画面内に収まるようにする処理を実装する。

 カーソルの一部が画面端に来たとき、画面上部なら下に、画面下部なら上に、画面左または右の場合はカーソルの現在値によって左または右にずらし、再度端判定する。これで概ね良さそうだ。

 次に、今回の肝とも言える敵の思考ルーチンだ。とりあえず、ピースの要素ごとに以下のように得点の損得勘定で計算し、合計にランダム値を足した値が一番大きいものを採用する事にする。
  • 空白を埋めると1点
  • 陣地がレベルアップすると、新レベルの二乗−旧レベルの二乗点
  • 陣地を取ると、相手のレベルの二乗+1点
 損得勘定処理を追加し終えて、テストプレイを行う。

画像


 それなりには動いているようだが、何度か試すと、まだエラーが出る。どこかつまらない間違いをしているんだろうけど、間違いを見つけるのは面倒そうだ。
 start.ax:3,975/6,000バイト

2015/08/10:思考の試行 その2
 敵の思考ルーチンを見直す事にする。

 空白が1つ以上ある場所にしかピースが置けないように処理を書いたはずだが、そうならない場合があるようだ。変数名が適当過ぎてプログラムが見渡しにくいので、この機会に変数名を整理する事にする。

 変数名を整理していくうちに、置いてはいけない場所にピースを置くバグも治ったようだ。変数名でも間違えていたのかな?

 こうして、最低限の動きができるようになったので、何度かテストプレイをする。

画像

 敵の動きは、概ね最初に考えた通りになっている。なのだが...なにか物足りない。

 ピースを置くときの自由度が大きいこともあるが、せっかく陣地のレベルを上げても、敵に一瞬で取られてしまう。最後にピースを置いた側が圧倒的に有利になるし、高レベルの陣地が早々に消されて全体的にちまちまとした展開になってしまう。

 なら、どうすればいいんだろう?とりあえず、フィールドの大きさを8x8と少し大きくしてみたが、面白さは改善されなかった。
 start.ax:4,633/6,000バイト

2015/08/11:思考の試行 その3
 やっぱり、ルール自身を変えないとダメか。という事で、散歩がてらルールを考える。

 なにかのお助けキャラを出すか?地形効果を入れるか?特定の条件で強くなるようにするか?どれもなにかしっくり来ない。もっとシンプルなルールでやりたいのだが。

 まずは、少し自由度を減らすか。ピースを置く条件を「空白を1つ以上含む」→「自軍の陣地を1つ以上含む」にしたらどうだろうか?じわじわと侵略していく感じになるはずなので、少し良さげかな。

 という事で実装してみる。このルールだと、最初に陣地がないと何も置けないので、初期状態で対角線上に1マスずつ陣地を配置した状態にする。

 よしできた。という事でテストプレイをする。

画像

 うーむ、少しだけ良くなったような気もするが、まだなにか足りない。
 start.ax:4,884/6,000バイト

2015/08/12:思考の試行 その4
 ここらで、気分を変えてタイトル画面を作成しよう。

 最終的には、ランキング情報を読んで色別総得点のグラフ化をしたい。という感じで作り始める。が、

画像

 仮の値で棒グラフを描いた時点で飽きた。その変わり新しいルールを思いついた。ピースの強さを入れよう。

 ピースが掛かっている陣地のうち一番高いレベルをピースの強さにし、ピースの強さが敵陣のレベル以上の場合にのみ敵陣を消せるようにする。あとは、得点にもピースの強さを掛け合わせるようにする。

 レベルを上げる必然性が出来た事もあって、戦略的なルールになったような気がする。
 start.ax:6,038/6,000バイト


PentaPiece 製作過程 その2