七並べプログラムでは、カードが出せるかの判定と、敵CPUターンの処理のアルゴリズムを解説します。
Excelファイルでは、「CheckCard」関数でカードが出せるかの判定を行っています。
なお、出そうとしているカードは所持していることが前提です。
大まかなアルゴリズムは以下の通り。
ここで、隣のカードが出ていれば、出せるカードだと判断してもよいのではないか、と思った人もいるかもしれません。
確かに、最初の方はこのルールでも大丈夫なのですが、次第に問題が発生する場合があります。
あるプレーヤーのパス回数が上限に達した場合、そのプレーヤーは失格となるため、プレーヤーの残りのカードがばら撒かれますよね。つまり、本来出せないカードにもかかわらず、カードが置かれてしまうのです。この場合、隣にカードがあるけれども、出せないカードが出てきます。
以下の図の例を見てみてください。
出されたカードが図の状況で、プレーヤーは、全マークの3を持っているとします(あくまで例え話)。
スペードは、4 ~ 7まで続いているため、3を出すことができます。
ハートとクラブは、7まで続いていないので、3は当然出せません。
では、ダイヤはどうでしょうか。隣の4のカードはありますが、7まで続いていません。恐らく、ダイヤの4と5はパスの上限達成時でばら撒かれたものでしょう。この場合、ダイヤの6が出るまで3を出すことはできません。
つまり、隣のカードだけではなく、7までカードが続いているかを確認する必要があるのです。
Excelファイルでは、「EnemyTurn」プロシージャで敵CPUターンの処理を行っています。
CPUは、出せるカードが見つかった場合、すぐにそのカードを出すようにしています。
しかし、その一方で、CPUが出すカードは完全ランダムとしています。
ランダム性を実現するためには、調べるカードのマークの優先順位もランダムである必要があります。
Excelファイルでは、その優先順をセル[B14:Y17]の部分に全て挙げています。
4マークの順列なので、4 ! = 4 × 3 × 2 × 1 = 24通りですね。
この24通りからランダムで選ぶことにより、ランダムな優先順位を実現しています。
また、7より小さい数から調べるか、大きい数から調べるかもランダムにしています。
つまりCPUは、24 × 2 = 48通りの中から、出し方をランダムで選んでいるのです。
そして、全てのマークを調べても出せるカードが見つからなかった場合、パスを選択します。
今回のプログラムは構成が大変複雑なので、各ステップのプログラムの呼び出し構成図も載せておきます。
あなたもジンドゥーで無料ホームページを。 無料新規登録は https://jp.jimdo.com から