ゲーム設計時のアレコレ
こんにちは「つけらっとゲームス」プログラム担当のとちです。
今回は「ゲーム設計している際に色々考えているんですよー」とか、
「与えるダメージひとつとっても色々考えてますよー」というお話です。
ゲームをデザインする際には様々なことを考えながら仕様決定しています。
場合によっては作りながら仕様変更することもありますが、プログラムを打ちまくる前にある程度の方向性は決めておいた方が進めやすいんですよね。
というわけで、今回のテーマは武器性能、特にダメージ計算についてです。
アビスアンドダークシリーズを例にしてお話を進めて行きますね。
武器性能といえば与ダメージ!
アビスアンドダークの武器の性能で目立つデータは打撃力。
1度の攻撃命中でいくつのダメージを与えられるかの数値です。
序盤で戦士系のクラスならお世話になるであろう「ロングソード」の打撃力は、データ作成時に使用したエクセルデータを参照すると「9~14」となっいます。
すこし冒険を進めて手に入る剣「鋭利な剣」のダメージは「10~24」です。
使用者の筋力や、攻撃を受けたモンスター側の装甲によって実際に表示されるダメージは変化しますが、それ以上にダメージに幅があることがわかりますよね。
「ロングソード」であれば最小9、最大14なので「6パターン」あります。
実は、このデータを定義する際にわたしは非常に悩んでいました。
ダメージ範囲を純粋に(1)乱数関数で求めるか、それとも(2)擬似的にサイコロを使った乱数で求めるかで悩んでいたのです。
(1)乱数関数で求める
Excelだと「=RANDBETWEEN(9,14)」と入力すると「9~14」の中からランダムに数値を返答してくれます。
Unity(c#)、またはPythonで変数「TestDamage」に範囲内の値を求めるなら以下の通りですね。
--- Unity c# ---
using UnityEngine; // 冒頭にこれを入れておくと良いでしょう。
int TestDamage = Random.Range(9,15);
print(TestDamage);
// (※注意) Intの場合、最大値に+1しないといけない
--- Python ---
import random
TestDamage = random.randint(9,14)
print(TestDamage)
(2)擬似的にサイコロを使う
Excelだと「=RANDBETWEEN(1,6)+8」という感じです。
同じようにUnityやPythonだと以下の通りです。
--- Unity c# ---
using UnityEngine; // 冒頭にこれを入れておくと良いでしょう。
int TestDamage = Random.Range(1,7) + 8;
print(TestDamage);
// (※注意) Intの場合、最大値に+1しないといけない
--- Python ---
import random
TestDamage = random.randint(1,6) + 8
print(TestDamage)
同じじゃないの?
これは何が違うんでしょうか?
「ロングソード」に関していえば、別に何も変わりません。
では「鋭利な剣」で考えてみましょう。
「鋭利な剣」は最小10、最大24なので「15パターン」あります。
以下Excelで表現してみますね。
(1)の方法
=RANDBETWEEN(10,24)
(2)の方法
=RANDBETWEEN(1,6) + RANDBETWEEN(1,6) + RANDBETWEEN(1,5) + 7
(2)の3回目のRANDBETWEENの範囲が1~5なので六面サイコロでは通常再現できませんがスミマセン、そこはご了承ください。
さて、上記の2つの式は最小値と最大値が同じとなります。同じような感じがしますが全然違います。
(1)については10~24が満遍なく出るのに対して(2)は17を中心に最大値、最小値に近い数字はあんまりでません。
Excelの乱数(ランダム)関数を200回動かした結果を貼りますね。
これを見ると出現率の違いがハッキリとわかります。
(1)の方法
(2)の方法
おわりに
いかがでしょうか?
たぶん、TRPGなどのアナログゲームを普段から楽しんでいる方にとっては半ば常識的なことではあるんですが違いますよね。
わたし個人としては(2)の方が好きなんですが、アビスアンドダークを設計する時は(1)を採用しました。
どっちが「正しい」「間違っている」という話ではありません。
ただゲームを設計する段階で意外と難しい判断をしていたりするんですよね……
こういった作業にもご興味を持っていただけましたら嬉しいです。
ちなみにアビスアンドダーク以外にもこんなゲームをいじっている人です。
ご興味がございましたら以下の記事もご覧くださいませ~。
というわけで、また次回の記事でお会いしましょう~。
この記事が気に入ったらサポートをしてみませんか?