Stage 1 プログラムの機能を考える
1-2 石の操作を考える
プレーヤーがやるリバーシの操作はとても単純です。石を置けるマスを一つ選んで指定するだけですから。なのでプレーヤーに要求する操作はないに等しいのであまり考えなくていいのですが、問題はコンピューターにやらせる操作です。計算しかできないこの堅物に
自分の石に突き当たるまで石をひっくり返して
もしひっくり返せる石がなかったらそのマスに石は置けないよ
なんて言ったところで理解してくれるわけがないので、そこは骨を折らなければいけません。ではどのようにルールを教え込むか。
~~~~~~~~~~~~~~~
ここは後出し感が出てしまうことを承知の上で私の答えを出してしまいます。再起処理を使うんです。
再起処理ってアレやろ、ほら、アレ...
そうですね。アレです。
いや、わかんねえこと察して教えろよ
関数の返り値を同じ関数にするような処理ですね。例えば数学でいう「互いに素」を判定する関数なんかで使います。ユークリッドの互除法を適用するために再起処理を施していますね。
def isCoprime(a :int, b :int):
if b == 1:
return True
elif a % b == 0:
return False
else:
return isCoprime(b, a%b)
やめろよ数学なんて、そんな言葉聞きたくもねーよ
上記の例で言えば「もし b が 1 でなく a % b != 0 であれば、isCoprime(b, a % b) の結果を返り値としよう」ということになります。
~~~~~~~~~~~~~~~
無駄話が過ぎましたね。
石を裏返せるか判断するルールを再起処理で
- 隣の石を見る
- もし同じ色なら、もう一つ隣の石を見る
- もし石がなかったら、裏返せない
- もし相手の石があったら、裏返せる
というふうに。何言ってるかわかりますか?わからないですよね。
わかんねぇな
ではこの説明は Stage 4 にとっておきましょう。
~~~~~~~~~~~~~~~
ところで石の色ってどうすればいいでしょうか。
白か黒かの二択だろ
何も心配するこたねーよ
いやいや、それをどうやって表すかですよ。
このコードでは「黒が 1, 白が -1, 石がなければ 0」として、board[row][column] の値にしてしまいます。割と定石チックなので、すんなり理解していただけるかと思われます。
また放任主義かよ
まあ、わりかしいつも通りでしょ?