前回の続きです。

C#でババ抜きをつくる

コンピュータにカードを引かせてみる

順番はユーザーが一番最初にカードを引きます。そしてそのあと他のプレイヤーがカードを引いていきます。

1が0のカードを引く
2が1のカードを引く
3が2のカードを引く
4が3のカードを引く
5が4のカードを引く
0が5のカードを引く

これなら自分はインデックス(添字)が一番大きいプレイヤーからカードを引き、それ以外のライバルたちは自分よりインデックス(添字)が1小さいプレイヤーからカードを引けばよいということになります。

ところがあがった人はゲームから抜けていくので、単純にPlayersの添字だけをみてはうまく動いてくれません。

自分があがっているときとそうでないときで処理をわけました。自分があがったらライバル同士で終わるまで戦わせます。

これは自分があがる前におけるライバルの動作をメソッドにしたものです。

すでにあがっているプレイヤーもいるかもしれないので、まずはまだあがっていないプレイヤーを集めます。そしてPlayersのインデックスが大きい側が小さい側のカードを引きます。ユーザーのインデックスは0なのでとくにややこしいことはありません。

ババ抜きではカードを1枚だけ持っているときにカードを引き、ペアができてあがることができるだけでなく、ペアができてカードを捨てた結果、残り1枚になり、次のプレイヤーに引かせてあがることができる場合もあります。

どちらにでも対応できるようにカードを引いたり引かせたプレイヤーのカード数を確認して、あがりの処理をおこなっています。

あがりの処理として、IsFinishedプロパティをtrueにすることと順位を表示することなどがあります。

次に自分があがってしまったあとの処理です。この場合、基本的にインデックスが大きい側が小さい側からカードを引くことになるのですが、一番インデックスが最小のものは最大のものからカードを引くことになります。

順位を表示する

カードの持ち数がゼロになったらあがりなので順位を表示します。また最下位はカードの持ち数がゼロにできないので最下位のひとつ上の順位が確定した段階でビリが確定することになります。

PlayerFinishedメソッドはRivalsTurnメソッドのループ文のなかで呼ばれるので二重に呼ばれてしまうことがあります。そこであがったプレイヤーを格納するリストを作成して二重に格納できないようにしています。これで順位が二重に表示されることはありません。

それからPlayerFinishedメソッドで使用したフィールド変数はゲーム開始時に初期化するようにしましょう。