以前、C# WindowsFormsで殺しの七並べを作りました。今回はオンラインで他の人と対戦できるようにASP.NET coreで対戦型の殺しの七並べをつくります。
簡単なルール説明だけしておきます。普通の七並べは横につながっているカードしか出せませんが、このゲームは縦や斜めでもつながっていればカードを出すことができます。通常の七並べと同様、ローカルルールがたくさんありますが、ジョーカーは使わないのが一般的です。またいわゆる「トンネル」ルールもありません。パスの回数制限ですが、今回ここで作成するものはないものとします。
「殺し」の七並べではカードが殺される場合があります。それはカードが他のカードに囲まれた場合です。ただ囲めばどんな場合でも殺せるわけではなく条件があります。複数のカードの場合は四角く囲われていなければ死にません。
下の図ではクローバーの6が死んでいます。
複数のカードは四角く囲んだ場合だけ殺すことができます。
下の図の下部ではクローバーの5と6、上部ではスペードの5と6、ハードの5と6が死んでいます。
下の図のような囲み方では殺すことはできません。
順位ですが、殺されたカードの枚数がもっとも少ない人が優勝です。殺されたカードの枚数が同じ場合は先に上がった人が上位です。
ではさっそく作ってみましょう。このゲームは途中参加と途中退却が可能です。名前空間はKillSevenとします。
Constクラスの定義
定数を定義するConstクラスを示します。
プレイヤーの総数は5とし、ゲーム開始ボタンがクリックされたら10秒間待機してからゲームが開始されます。ゲームに参加している人の数がPLAYER_MAXに満たない場合はコンピュータが自動で着手をします。
1 2 3 4 5 6 7 8 9 |
namespace KillSeven { public class Const { public const int PLAYER_MAX = 5; // プレイヤーの総数 public const int SECONDS_TO_START_MAX = 10; // ゲーム開始ボタンがクリックされて実際に始まるまでの秒数 public const int SECONDS_TO_HAND_MAX = 20; // プレイヤーが考えることができる一手当たりの秒数 } } |
Cardクラスの定義
カードを管理するためのCardクラスを定義します。
Suitプロパティはトランプに書かれているマークです。クローバーなら0、ダイヤは1、ハートは2、スペードは3です。Numberプロパティはカードに書かれている番号(1~13)です。スペードのAであれば Suit == 3、Number == 1です。PlayerNumberプロパティはこれを所有する(カードが出されたあとは所有していた)プレイヤーの番号(0~)です。殺されたカードの枚数を数えるときに必要になります。Randomプロパティはカードをシャッフルするときに使う乱数を格納します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
namespace KillSeven { public class Card { public int Suit { set; get; } public int Number { set; get; } public int PlayerNumber { set; get; } public int Random = 0; public Card(int suit, int number) { Suit = suit; Number = number; } } } |
Playerクラスの定義
プレイヤーの状態を管理するためのPlayerクラスを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
namespace KillSeven { public class Player { public Player(string name, string id) { Name = name; ConnectionID = id; Ranking = -1; } public string ConnectionID = ""; // ASP.NET SignalRで使われる接続の一意のID public List<Card> Cards = new List<Card>(); public List<Card> DeadCards = new List<Card>(); public string Name { set; get; } // プレイヤー名 public int Number { set; get; } // プレイヤーの番号(0 ~ PLAYER_MAX-1) public int Ranking { set; get; } // 上がった順位(1~PLAYER_MAX:最初は順位は不明なので-1にする) public int TrueRanking { set; get; } // 本当の順位 public int SecondsToHand { set; get; } // 手番のときの残り時間 public int CardsCount { get { return Cards.Count; } } // 手持ちのカード数。0になったら上がり public int DeadCardsCount { get { return DeadCards.Count; } } // 殺されたカードの枚数(少ないほうが上位) } } |
では、次回に続きます。