忍者ブログ

へぷたなすくろーる

RPGツクールのブログです。イベント講座とRGSS3スクリプト配布をやってます♪

Home > > [PR] Home > ゲーム製作記 > レポート:よん色リバーシが出来るまで

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

レポート:よん色リバーシが出来るまで


もうすぐフリゲ展が終わりますが
最後にはDEGICAさんによる各賞の発表があります。
今回この企画に参加したことでとても良い経験を得ることができました。
改めて主催者のとりあかさんと
支えてくださった全ての方に、感謝申し上げたいと思います。

後述するように「よん色リバーシ」は
1から10まで私の思惑を裏切る形で進んでいき
締め切りと妥協があったからこそ生まれ、日の目を見たものです。
一方でそこで使っている技術やノウハウは
これまでのゲーム製作、及びFSMやここでの講座など
私が試行錯誤して積み上げてきたものと言えると思います。

あとタレコミがありましたので紹介します。
http://togetter.com/li/722475
詳しく、しかも好意的に紹介や分析をして頂いてます。
これを読んで少し泣きそうになりました。
何か急に自分が「ゲーム製作者」になった実感がして。
本当にありがとうございました。

締めに、製作そして完成までをレポートします。
講座ではないですが、一応具体的な処理についても書いてます。
まあ特に需要はないと思うので、自己満足なのですが(笑)
推敲しても尚長いのでつづきからお読み下さい。

まずアイディアは約1年前に遡ります。
コンピュータゲームの長所を生かそうと考えて
アナログゲームでは煩雑になる4色オセロを考案しました。
ですが、すぐに頓挫しました。
というのも紙とペンでテストプレイをしたところ
まず1~2人が1ターンキルされて普通のオセロになると判明。
初期配置を増やしてみるなどしてみましたが解決に至らず
実際に形になることなく、お蔵入りしてしまいました。


その半年後くらいに、玩具屋で4色オセロの商品を発見します。
一番気になったのはルールでしたが、どうにも期待はずれでした。
「駒がない場合、好きな隣接マスに置ける」という一般的なものですが
そこで置けても次まで3手あるので、大抵はまた取られてしまいます。
従って、1手番に1駒置くという原則を曲げるルールが別に必要です。
(例えば逆転要素のイベントカードや、クイズ正解で手番を貰うなど)
それが悪いわけじゃないですが
オセロの持つ、1手で「ひっくり返る」攻防性であるとか
無敵の角地とそれを巡るにらみ合いの戦略性であるとかが薄いので
やっぱり4色のオセロは無理があった……と思われました。

時は流れ、フリゲ展の参加を決意しました。
そこで白羽の矢が立ったのが、同じく構想案を眠らせておいた
特殊ルール満載の、2人対戦型オセロです。(製作記に書いたもの)
ところが入浴中に突然4色オセロの解決ルールを「閃いて」しまい
割と良く出来たルールだったので、ついでに組み込もうと思っていたら
締め切りの関係でメインになって「よん色リバーシ」の完成に至るわけです。
因みにこの時点で、締め切り間際、ほぼ手付かずでした(笑)


さて、ツクールで全く関係ないボードゲームを1から自作する
というと非常に難しいと思われますが実はそうでもありません。
基本的に盤と駒がそのままマップとイベントで実装可能なのと
ターン制の非アクション性は、並列動作が不要で処理が一本道であり
しかもオセロは行動が1種類なので最初から筋道が見えてました。
(だからこそオセロを基にしたゲームを考案したわけです)

宣言通り、よん色リバーシでは殆どをイベントで作ってみました。
使用スクリプトは僅かに自作の5つだけです。

しかも厳密に代用不可なのは画面サイズを640*480にする1つのみで
これはたった1行のスクリプトです。(メニューや戦闘がないため)
Graphics.resize_screen(640, 480)
他のスクリプトは無くてもどうにかなる、代用可能なレベルで
またイベントでも変数の計算に関してはスクリプトを使い
複数の計算式を纏めたり、ループ計算を行ったりしていますが
これらも理論上、変数の操作やループを使って代用可能です。


以前の製作記に書いたとおり、基本的な実装は
ボードに見立てたマップに100の駒用イベントを配置する
というもので、原理はスロットのときと同じページ切り替え方式です。
これらは駒の「表示」を担うと同時に、駒がない=空きマスの場合には
決定キーで駒を配置する「処理」を併せて担当します。


管理は100の変数に加え、セルフスイッチを併用して補います。
このため自前の「セルフスイッチ操作ぷらす」を利用し
また100のイベントを変更毎にコピペで増やすのは大変なので
専用のイベント複製のスクリプトを組んであります。
が、結局コモンイベントを使ったので必要性は薄かったです。
むしろ途中で機能不全が発覚したりと足を引っ張りました。
(この辺は拡張性を見据えた仕様なので、無駄とは違いますが)

そして「カーソル」はカーソルの歩行グラを使ったプレイヤーです(笑)
要はRPGでマップをうろうろして、村人に話しかけるのと同じで
プレイヤーにカーソルを操作させ、空きマスを選択させる構造です。
また駒を置くアルゴリズムですが、これも難しく考える必要はなく
とどのつまりはアナログゲームで人がやることと同じなんです。

普通は駒を置いた場所を目で追って、同じ色を探しますね。
4色オセロなら、同じ色が無い場合は第三色も探します。
見つけたら、その場所までの駒を反転(自分の色に)します。
それを上から順に8方向行う……これが人がやってる手順です。

さてコンピュータの場合、目がないので「情報」を与えます。
例えば100のイベントを対応する100の変数で管理しているので
あるマスの変数を見れば、そこが空きか何色の駒なのか分かります。

またプレイヤーかイベントの座標を取得できるので
そこからどのマスか判別でき、そして上記の対応変数を割り出せます。

後は私の十八番ですが、条件分岐(変数)とラベルループを使い
カーソル地点から1つ上のマスを判定して
・同じ色なら反転に移る
・違う色なら次のマスを判定する
・空きマスなら判定を止める
こういう感じで、まず同色反転、次に他色反転と8方向判定します。
後は反転がないならマスの選択からやり直し
反転があったなら次のプレイヤーにターンを回す、これだけです。


この時点でアナログライクなゲームの基礎は完成です。
なので次は演出と勝利条件を追加していきます。
具体的には顔グラ、総得点、反転アニメーションの追加です。
総得点は駒と同じイベント、顔グラフィックは単純にピクチャです。


関連処理を行うタイミングは、駒の設置の後(=合間)で
便宜上これを「ターン間処理」と名付けてコモンイベントにします。
ターン間処理→プレイヤーに操作を返す(ターン処理)→ターン間処理
ここで行う処理は関連しあうため、順番には気をつける必要があります。
因みに管理しやすいように(使いまわしも見据えて)適時
各処理を別のコモンイベントにして呼び出す形にしています。


まず他の処理で使う「総得点」と空きマス数を
管理変数を集計して割り出し、変数に格納しておきます。
この総得点はそのままマップのイベントと連動して表示されます。
更にこれらを使って勝敗判定を行います。
空きマス数が0か、3人の総得点が0の場合でゲーム終了となり
最も総得点が高いプレイヤーの勝利、複数いる場合はドローです。

その次はプレイヤーのターンを次に廻して
ターン関係の変数やカーソルを変更します。そして顔グラ処理です。
イメージ的にはターン変更が最後に来そうなものですが
顔グラ変更では「次の手番プレイヤー」に枠を表示するので
条件分岐でピクチャ変更をする前にターン移行が必要なのです。


この時点で見た目は一気に「ゲームらしく」なりました。
最後にプレイアビリティを向上するため、処理に梃入れします。
まず、ターン処理でマスを選んでから行っていた判定を
先に全てのマスに対して一括判定するようにします。
(ピクチャ変更の後に「予測得点演算」を追加)

これはプレイヤー操作時に「ガイド」を表示するためです。
先に判定を行うことで、打てるマス=反転が起きるマスを調べます。
また可否ではなく「数」で取得し、AI処理への布石としています。
そして打てるマスが無い場合は、パスする処理を繋げます。

そして最大の山場であるAI処理です。
パス判定に付随させて
・パスの場合は次のプレイヤーへ移行して再度ターン間処理
・そうでなく、次のプレイヤーがCPUモードならAI処理へ
・どちらでもないなら、プレイヤーへ操作を返す
という形で条件分岐を組みます。

肝心のAIの思考ルーチンですが、今回のものは非常に簡単です。
高度な次ターン以降の予測は行わず「今の盤面だけ見て」判断します。
マップ毎に、マスの重要度を点数化した表が用意されています。
これにより「角を優先的に取る」ような思考が可能になります。
更に予測反転数(どれだけ反転できるか)と乱数を加味します。

基本的にこれだけですが、味付け(重み付け)を変えることで
強さと性格(行動パターン)の違う複数のAIタイプを演出しています。
「徒競走」は目先の反転数を重視し、乱数幅も大きい初心者AIです。
意図的に弱く作られていますが、総得点は稼ぐので
最終的になんやかんやで勝つというビギナーズラックも持ってます。

「組体操」は点数表を重視する堅実なAIです。
的確に角を取ってきますが、堅実すぎて手が読みやすいという
初心者にしか勝てない中級者にありがちな弱さを抱えています。

「騎馬戦」はバランス型の実力派AIです。
程々に点数表を重視しつつ、大きく取れるチャンスは逃しません。
最も盤面を見ているAIなので安定して強いです。

「リレー」はターン数で行動を変化させる戦略型AIです。
序盤は反転数を無視して展開し、中盤に騎馬戦AIにシフト
そして終盤は反転数を稼ぐというセオリー通りの動き。

「借物走」は完全ランダムAIです。
まず勝てませんが、場を荒らしてくるので
メンバーに1人紛れていると意外な試合展開を引き起こします。

AIが自分の手を決定したら、次は具体的な行動処理です。
まずCPUが行動している「演出」の為にカーソル移動します。
これは目的地の座標からカーソルの座標を減算すれば
例えばX座標の差が3なら、左に3マス移動すれば良いので
後はX方向とY方向それぞれ、-9~9の範囲で条件分岐します。

今回は盤面が10*10でしたので、移動の滑らかさを優先しましたが
範囲が広い場合は1マス移動をループさせる方法が適しています。

移動後の反転処理自体はプレイヤーのものと同じなので割愛。
それと、アニメーションやCPUのカーソル移動を
サブキーで早送りできるように小物スクリプトを追加しました。


これで晴れてゲーム部分は完成したわけですが
実際に出展できる形にするのは「ここからが本番」でした。
(確かこの時点で締め切りをオーバーしていたはずです)

メニュー画面は、説明文なども含めてピクチャで作りました。

基本は条件分岐「Input.trigger?」でキー入力を検知し
それに応じてラベルジャンプで別のラベルに飛ぶ
未入力ならラベルジャンプで同じラベルにループ
マップ移動と同じ感覚でラベル移動をします。


その過程でピクチャを表示するのと
変数を操作してゲーム設定を調整していきます。
このラベル&ピクチャ方式は、正統派のイベント技ですが
暗算に近いこいつを一発で完成させたのは我ながら驚きです。
(普通はどこかミスして盛大にバグるのがお約束)


適当なタイトル画面ですが非常に時間が掛かっています。
絵心がないので描いては消し、描いては消し、最終的に
徹夜明けテンションのままストーリーをぶち込むという暴挙にて完成。
タイトル画面を変えるスクリプトは5分で出来ました(笑)

時間がなくて消化不良だったのはステージですかね。
基準のムーンステージ以外を作りこめなかったのは心残りです。
よん色リバーシの中で一番拡張性のある部分だったので。


レポートは以上となります。
この様にボードゲームは1から作る必要はあれど
非アクション・ターン制なので並列処理は不要で
基本は一本道の処理なので管理しやすく、比較的作りやすいです。

アルゴリズムやルーチンに関しても、その難しさは
何をやってよいのかという点が大きいと思うので
「したいことは何か」→「必要なものは何か」を書き出し
とりあえず簡単なものを作っていくのがオススメです。

ある程度先を見据えて、どんな処理にするか「想定」しておき
それを意識した変数などを用意しておけばすんなり作れます。
言葉にすると難しいですが……要は慣れと勘ですね(笑)
例えば、今は2択だが後々3択以上になるかも?という場合は
スイッチのon / offの代わりに変数の1以上 / 0以下を使っておく。
今は変数が10個必要だが、後々もう1セット欲しくなるかも?という場合は
最初から変数20個分のスペースを確保しておく。
変数を増やす容量なんて微々たる物なので節約しなくて良いです。

拍手[6回]

PR
-->
Responses0 Responses
  • お名前
  • タイトル
  • メールアドレス
  • URL
  • パスワード

ブログ内検索

アーカイブ

最新コメント

[01/20 NONAME]
[01/16 NONAME]
[12/30 NONAME]
[12/13 NONAME]
[12/01 NONAME]

プロフィール

バナー

HN:奈々(なな)
RPGツクールVXAceを中心に製作を行っています。 スクリプト、イラスト、ドット絵など広くちょこちょこ手を出していますので、 できる範囲で他のツクーラーさんのお手伝いができたらなと思っています。