豊橋市の鍼灸・指圧マッサージ小浜治療院

小浜治療院トップページ > 趣味に関して 目次 > アルゴリズム じゃんけん

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でも簡単にいけます。
そこまで使わないかもしれませんが。

皆さんの助けになれれば幸いです。

小浜治療院トップページに戻る