面白いゲームとは(1) ~IT登竜門から学ぶゲーム性~

はじめに
初めまして、EO(八王子)に所属しているMと申します。
現在、ブログチームを通して、RPGの開発を行っております。
そこで、今回は私がRPGの開発を行うこととなったきっかけであるCoinCollectorの改造についてお話させていただきます。
改造するにあたり「ゲーム性」を意識しましたので、それについて工夫点を共有させていただきます。
Coin Collectorとは
IT登竜門受講者がプログラミング課題によって1週間という期間で開発するミニゲーム。
ゲーム開発に適したPythonを使い、プログラミングの学習を目的として作成する。
◀最終的に完成するゲーム画面
上下左右キーを入力してプレイヤーを
動かし、ランダムに配置されたコインを取得していく
工夫点
工夫点は以下の10点(+おまけ1点)である。
1. コインの移動
コインが勝手に初期位置から移動する機能を追加した。
コインの移動方法はプレイヤーキャラクターと同じだが、自動で移動、方向転換させる必要がある。
そこでコインが移動する方向を決定するためにコインの配置に使用したランダム関数を使用した。
2. 敵の配置
敵を配置して、プレイヤーキャラクターが敵に触れるとゲームオーバーになる機能を追加した。
敵の描画と移動はコインと全く同じなので割愛する。
複数の敵が登場するが、敵の情報は配列(※1)で管理している。
配列による管理はコインも同じなのでこちらも割愛する。
3. 制限時間の実装
制限時間を実装した。
制限時間は60秒にしており、カウントが60になるとゲームオーバーとなる。
前職の経験から時間の計測や呼び出しの機能を使えば簡単に実装ができると考えた。
結果として、時間計測の書式を調べるだけで実装できた。
4. 背景の実装
文字通り、黒塗りの背景から画像を差し替える。
ゲームの画面と同じ大きさの画像を用意して「最初」に描画する。
これはレイヤーのように後に描画したものが手前に表示されるような挙動をするためであり、IT登竜門内の黒塗り背景と同じように最初に描画する必要がある。
5. 得点の実装
得点を実装した、コインを取得した際にスコアが加算されクリア時にスコアが表示される。
制限時間を実装したこともあり、ゲーム性を増す目的で得点の計算に時間を用いた(早くコインを獲得するという競技性が生まれる)。
具体的な計算方法はコイン取得時に40から現在の経過時間を引いたものを得点としてスコアに加算、最高スコアは100。
6. ステージの実装
ステージを1~3に分ける。
ステージによる変化として、敵の数と敵の移動速度が変化する。
基本的にはその2点のみなので処理は全ステージ共通。
ステージによって敵の描画数と移動速度に用いる変数の値を変えることでステージの難易度上昇を変化させている。
このように同じ処理でも変数の値を変えることでコードを短くすることは重要である。
7. 音楽の実装
ゲームに演出を加える際に必要不可欠なBGMを実装した。
BGMスタート、ストップの方法を調べることで、ステージ間で異なるBGMを流すようにしている。
8. プレイヤーキャラクターが画面外へ移動するのを拒否
IT登竜門内で作成するCoin Collectorの仕様ではプレイヤーキャラクターが画面外に移動できる。
それを阻止するためにプレイヤーキャラクターが画面外の座標に行かないように、座標を超えようとした場合に移動の処理をしないようにした。
9. 難易度の実装
ゲーム開始時に難易度を選んで、その難易度によって敵の数と移動速度が変化する。
実装の方法はステージの実装と同じなので割愛する。
10. 攻撃手段の実装
敵を実装することによりゲーム性を増すことに成功したが、それでも敵から逃げるだけという状態である。
これだけでは面白くなったとは言いづらい。
事実高難易度モードでは敵の動作がプレイヤーより速いために、敵から逃げられずにクソゲーのような様相を呈していた。
そこで「敵を実装したなら、敵を攻撃する手段も実装すればよくね?」という考えに至り、攻撃手段を実装した。
攻撃方法については、最後の移動の入力方向に対して「攻撃判定」となるオブジェクトをプレイヤーキャラクターの眼前に出すという方法で
その判定と敵の判定が触れると、敵の動きを一定時間キャンセルすると同時に敵のHPを減らす、その際に敵のHPが0ならその敵の描画をやめるという方法である。
この「敵の動きを一定時間キャンセルする」という点がポイントである。
敵を倒せなくとも少しの間だけでも動きを止めることは、「敵を倒すことが目的でない」本ゲームにおいてプレイヤーに大きなリターンを与える。
また、飛び道具も実装した。
これは単純に1方向に攻撃判定オブジェクトを前進させるだけである。
なお、飛び道具というものは遠方から敵を攻撃できる低リスクの攻撃である。
そのため、「リスクとリターン(※2)」という考え方に則り通常の攻撃より威力を低く「飛び道具だけで制限時間内にすべての敵を倒し切るのはほぼ不可能」というバランス調整をしている。
因みに近接攻撃、飛び道具共に画像はコインの使いまわしである。

◀上記の工夫点を実装した画面
左下にゾンビのようなオブジェクトが敵である。
右上のScore付近にある小さいコインのオブジェクトが飛び道具(攻撃手段)である。

◀上記の工夫点を実装した画面その2
ステージが進むことで背景が変わり、敵の数も増えている。
◀上記の工夫点を実装した画面その3
高難易度でゲームを進めた場合の画面。
画像では分からないが、敵の移動速度も速くなっている。
このドラゴンのような敵は・・・?
おまけ.変数の型宣言(※3)
工夫点ではないが、IT登竜門内で書いた既存のコードを含めて変数に対して型宣言を行った。
コーディング経験者として型の重要性は認識しているつもりであり、型宣言を行わないことに違和感を生じたため、修正を行った。
今後IT登竜門をきっかけとしてプログラムに興味を持ったのであれば、是非ともこの型宣言については意識しておくことを推奨する。
まとめ
結果として、工夫する過程で調べた内容は以下の4項目となった。
1. BGM実装
2. 時間の計測
3. 型宣言の方法
付け加えるとBGMの実装以外は書式の確認だけで済んでいる。
このように、IT登竜門の中で学習した内容だけでも工夫次第で多くの機能を実装できる。
面白さとは
今回自分が実装した機能でゲームとして、最低限の面白さを確保できたと思う。
攻撃により敵を足止めし、素早くコインを早く回収して高得点を目指す。
「逃げるコイン」「動き回る敵」というランダム性や難易度設定の要素も再現性が減り、ゲームの飽きの軽減に貢献していると考えている。
今回実装、工夫した内容はいずれもコンピュータゲーム黎明期から実装されている要素ばかりではある。
しかし、それこそがゲームを面白くするための「基本」であり、ゲーム性に不可欠な要素であるということが分かった。
敵という「リスク」に対しいかに対処し、早くコインを回収して高得点という「リターン」を得る。
この「リスクとリターン」という考え方がゲームを作るうえで大事だということがよく理解できた。
※1: データを入れる箱が並んでいる棚のようなもの。
箱には1、2、3・・・と順番がついており、その箱の中に同じ種類のデータ(文字や数字など)を入れることができる。
※2: 面白いゲームに不可欠な「ゲーム性」のこと。
リスクとはプレイヤーに降りかかる脅威(ミスの原因やデメリットとなる要素)。
リターンとは脅威を排除することにより褒美を得る、先に進めるなどプレイヤーが得る利益、もしくはそれを得るための過程。
リスクを冒してリターンを得る、リターンを得る過程のリスクを減らす工夫を行うといった駆け引きがゲームを面白さに直結する。
(ノベルゲームなど、このゲーム性が面白さに直結しないゲームも存在する)
※3: データを箱の中に入れる種類をあらかじめ決めておくこと。
あらかじめ入れておくデータの種類を決めておくことで、「『x-1』の減算をする際にxに数字を入れなければいけないところに『あ』を入れて『あ-1』になってしまう」というような間違いが減るため、安全なコードになる。
プログラミングを行う上で非常に重要な要素である。






