小浜治療院トップページ > 趣味に関して 目次 > アルゴリズム じゃんけん
RPGやシミュレーションゲームを作るうえで、必ず出てくるのが「3すくみ」だと思う。
AはBに勝ち、
BはCに勝ち、
CはAに勝つ。
こんな関係。
平たく言えば、グー・チョキ・パーのじゃんけんの仕組みだ。
これを使うと、剣に斧が勝ち、斧に弓矢が勝ち、弓矢に剣が勝つ、なんてファンタジー設定に利用できる。
これをプログラムでやろうとすると、素直に作るなら、
自分がAとして、Aが勝つとき、負けるとき、あいこのとき、の条件分岐を設定し、
次は自分がBとして、Bが勝つとき、負けるとき、あいこのとき、の条件分岐も設定し、
最後に自分がCとして、Cが勝つとき、負けるとき、あいこのとき、の条件分岐を設定する。
出てくる項がABCの3つならばこれでもいいと思うけれども、ABCのほかにDが追加されて4つになったり、
4どころか5にも6にもなったら、大変さが等比級数的に増えていく。
そこで、3すくみのアルゴリズムがある。
まず、グーを1、チョキを2、パーを3とし、この数値をaとする。
a
グー =1
チョキ=2
パー =3
自分のaから相手のaを引き、その数値をbとする。
自分が勝つパターンを例とすると、
自分 相手 自-相 =b
グー と チョキ 1 -2 =-1
チョキと パー 2 -3 =-1
パー と グー 3 -1 = 2
項数はグー・チョキ・パーなので3だ。
bに3を足す。
自分 相手 自-相 =b b+3
グー と チョキ 1 -2 =-1 2
チョキと パー 2 -3 =-1 2
パー と グー 3 -1 = 2 5
b+3を項数の3で剰余算を行い、その数値をCとすると、
自分 相手 自-相 =b b+3 C=(b+3)%3
グー と チョキ 1 -2 =-1 2 2
チョキと パー 2 -3 =-1 2 2
パー と グー 3 -1 = 2 5 2
となり、自分が勝つときはCがすべて同じ数字の2になる。
ついでに、負ける時と、あいこの時を行うと、
負け
自分 相手 自-相 =b b+3 C=(b+3)%3
グー と パー 1 -3 =-2 1 1
チョキと グー 2 -1 = 1 4 1
パー と チョキ 3 -2 = 1 4 1
あいこ
自分 相手 自-相 =b b+3 C=(b+3)%3
グー と グー 1 -1 = 0 3 0
チョキと チョキ 2 -2 = 0 3 0
パー と パー 3 -3 = 0 3 0
となる。
これは項数がいくつになっても維持される。
ファイナルファンタジー11の属性の設定で行うと、
火>氷>風>土>雷>水>火>…の6属性(6すくみ)になります。
勝ち
自分 相手 自-相 =b b+6 C=(b+6)%6
火1 氷2 1-2 =-1 5 5
氷2 風3 2-3 =-1 5 5
風3 土4 3-4 =-1 5 5
土4 雷5 4-5 =-1 5 5
雷5 水6 5-6 =-1 5 5
水6 火1 6-1 = 5 11 5
こんな感じ。
これは勝ち負けで自分に隣接した相手だけではなく、数個飛ばした相手もCの数字で特定できます。
例えば6属性の反対側になる関係性(火と土)のような場合、
反対側
自分 相手 自-相 =b b+6 C=(b+6)%6
火1 土4 1-4 =-3 3 3
氷2 雷5 2-5 =-3 3 3
風3 水6 3-6 =-3 3 3
土4 火1 4-1 = 3 9 3
雷5 氷2 5-2 = 3 9 3
水6 風3 6-3 = 3 9 3
こんな感じで。
このアルゴリズムで、3すくみだけでなく、10でも20でも簡単にいけます。
そこまで使わないかもしれませんが。
皆さんの助けになれれば幸いです。