七並べプログラムのアルゴリズム


七並べプログラムでは、カードが出せるかの判定と、敵CPUターンの処理のアルゴリズムを解説します。

1.カードが出せるか判定する


Excelファイルでは、「CheckCard」関数でカードが出せるかの判定を行っています。

なお、出そうとしているカードは所持していることが前提です。

 

大まかなアルゴリズムは以下の通り。

  1. 出そうとしているカードと同じマークについて考える。
  2. 既に出されているカードを見て、出そうとしているカードの数から7のカードの方向にカードが続いているか調べる。
    つまり、7より小さい場合は右方向を、7より大きい場合は左方向を見ていく。
  3. 7のカードまで続いていれば( = 既に出されていれば)そのカードは出せる。途切れていれば出せない。

ここで、隣のカードが出ていれば、出せるカードだと判断してもよいのではないか、と思った人もいるかもしれません。

確かに、最初の方はこのルールでも大丈夫なのですが、次第に問題が発生する場合があります。

あるプレーヤーのパス回数が上限に達した場合、そのプレーヤーは失格となるため、プレーヤーの残りのカードがばら撒かれますよね。つまり、本来出せないカードにもかかわらず、カードが置かれてしまうのです。この場合、隣にカードがあるけれども、出せないカードが出てきます。

 

以下の図の例を見てみてください。

 

出されたカードが図の状況で、プレーヤーは、全マークの3を持っているとします(あくまで例え話)。

スペードは、4 ~ 7まで続いているため、3を出すことができます。

ハートとクラブは、7まで続いていないので、3は当然出せません。

では、ダイヤはどうでしょうか。隣の4のカードはありますが、7まで続いていません。恐らく、ダイヤの4と5はパスの上限達成時でばら撒かれたものでしょう。この場合、ダイヤの6が出るまで3を出すことはできません。

 

つまり、隣のカードだけではなく、7までカードが続いているかを確認する必要があるのです。

2.敵CPUターンの処理


Excelファイルでは、「EnemyTurn」プロシージャで敵CPUターンの処理を行っています。

 

CPUは、出せるカードが見つかった場合、すぐにそのカードを出すようにしています。

しかし、その一方で、CPUが出すカードは完全ランダムとしています。

 

ランダム性を実現するためには、調べるカードのマークの優先順位もランダムである必要があります。

Excelファイルでは、その優先順をセル[B14:Y17]の部分に全て挙げています。

4マークの順列なので、4 ! = 4 × 3 × 2 × 1 = 24通りですね。

この24通りからランダムで選ぶことにより、ランダムな優先順位を実現しています。

 

また、7より小さい数から調べるか、大きい数から調べるかもランダムにしています。

つまりCPUは、24 × 2 = 48通りの中から、出し方をランダムで選んでいるのです。

 

そして、全てのマークを調べても出せるカードが見つからなかった場合、パスを選択します。

七並べプログラムの構成


今回のプログラムは構成が大変複雑なので、各ステップのプログラムの呼び出し構成図も載せておきます。