順位をつける

殺しの七並べの場合、先にあがれば上位なのかというと違います。殺されたカードが少ない方が上位です。カードが同数のときは先にあがったほうが上位です。またパスを4回してしまって脱落した場合は先に脱落した人が下位になります。

もっとはやくつくるべきだったPlayerクラス

ゲームが終わったら順位をつけます。

そのためにPlayerというクラスをつくります。本当はこのクラスを先につくっておけばよかったのですが、順序が逆になってしまいました。普通の七並べではプレーヤーの情報はそんなに多くなかったのでクラスをつくって管理する必要がなかったからです。

遅ればせながらクラスをつくってデータを格納します。

あがったときの処理と脱落したときの処理に少し付け足します。あがったときの時刻、リタイアしたときの時刻を取得すれば先にあがったのは誰か、先にリタイアしたのは誰かがわかります。

あがったり脱落したプレーヤーをPlayersのなかに格納し、全員がゲームから抜けたときにLINQのメソッドを使えば簡単に順位をつけることができます。

あがったときやリタイアしたときに成績を登録する

あがったときはプレーヤー番号とあがった時刻と殺されたカードの枚数をPlayerクラスのコンストラクタに渡して成績を登録します。

まずはあがったときのメソッドを示します。

以下はパスを4回してしまってリタイアしたときのメソッドです。

OnRivalsTurnメソッドを一部変更

それからライバルターンに関するメソッドも変更する必要があります。

カードがないので強制パス?

カードが殺されて手持ちのカードがなくなった場合、出せるカードは持っていないので強制的にパスになってしまいます。これではいけないので順番が回ってきたときにカードがない場合はアガリにします。実際のルールでもカードが殺されて手持ちのカードがゼロになったときも、その状態ではあがれず、つぎに順番が回ってきたときにアガリになるそうです。(これもローカルルールかも)

ところがいまのままではライバルのターンが終わると出せるカードがあるかどうか判断して、ないのであれば自動的にパスにしています。「カードを1枚も持っていないので出せるカードがない、だからパス」では困ります。

またライバルも自分のカードが殺されることで手持ちがゼロになったとき、Playersリストに自分の成績を登録する機会がありません。これではゲームが終わっても結果が表示されないという問題がおきます。

ゲームセットになったら順位をつける

ゲームセットになったらOnGameSetメソッドが呼ばれます。これまでに集めた情報を利用して順位をつけます。途中でリタイアした人はあがることができた人より順位は下です。また殺されたカードが少ない順に並べますが、同じ場合はあがった時刻で順位を決めます。OrderBy~ThenByというのは便利です。

実際に遊んでみてわかったことは12枚殺しや8枚殺しはけっこうな確率で起きやすいということ。終盤になってカードが大量死することもかなりの割合でおきます。