ドボンのローカルルールのなかにはドボンでしか上がりを認めないというものもあります。カードを1枚しか持っていないときに順番が回ってきたら積み札から1枚引かないといけません。ドボン以外では上がることが許されないのです。
ではそのようなルールを設定することもできるようにしてみましょう。(ドボンシリーズだけでけっこう引っ張れそうな気がしてきたと思うのは私だけ?)
まず設定のクラスに新しいメンバーを加えます。
1 2 3 4 5 6 7 8 9 10 11 |
static public class Config { // カードが出せないとき取らされるカードは1枚だけにする static public bool IsDrawCardOnlyOne = true; // そのカードが出せるときは出せる static public bool IsAllowPutDrawCard = true; // 上がれるのはドボンだけ static public bool IsOnlyDobon = true; } |
それから設定のダイアログとダイアログのクラスに書き加える必要があります。
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
public partial class ConfigDialog : Form { public ConfigDialog() { InitializeComponent(); buttonOK.DialogResult = DialogResult.OK; buttonOK.Click += ButtonOK_Click; } private void ConfigDialog_Load(object sender, EventArgs e) { if(Config.IsDrawCardOnlyOne) cbIsDrawCardOnlyOne.Checked = true; else cbIsDrawCardOnlyOne.Checked = false; if(Config.IsAllowPutDrawCard) cbIsAllowPutDrawCard.Checked = true; else cbIsAllowPutDrawCard.Checked = false; // 追加された部分 if(Config.IsOnlyDobon) cbIsOnlyDobon.Checked = true; else cbIsOnlyDobon.Checked = false; } private void ButtonOK_Click(object sender, EventArgs e) { if(cbIsDrawCardOnlyOne.Checked) Config.IsDrawCardOnlyOne = true; else Config.IsDrawCardOnlyOne = false; if(cbIsAllowPutDrawCard.Checked) Config.IsAllowPutDrawCard = true; else Config.IsAllowPutDrawCard = false; // 追加された部分 if(cbIsOnlyDobon.Checked) Config.IsOnlyDobon = true; else Config.IsOnlyDobon = false; } private void cbIsDrawCardOnlyOne_CheckedChanged(object sender, EventArgs e) { if(cbIsDrawCardOnlyOne.Checked) cbIsAllowPutDrawCard.Enabled = true; else cbIsAllowPutDrawCard.Enabled = false; } } |
設定をファイルとして保存するときも追加が必要な箇所があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class ConfigObject { public void CopyToFile() { IsDrawCardOnlyOne = Config.IsDrawCardOnlyOne; IsAllowPutDrawCard = Config.IsAllowPutDrawCard; IsOnlyDobon = Config.IsOnlyDobon; // 追加 } public void CopyFromFile() { Config.IsDrawCardOnlyOne = IsDrawCardOnlyOne; Config.IsAllowPutDrawCard = IsAllowPutDrawCard; Config.IsOnlyDobon = IsOnlyDobon; // 追加 } public bool IsDrawCardOnlyOne = true; public bool IsAllowPutDrawCard = true; // 追加部分 上がれるのはドボンだけ static public bool IsOnlyDobon = true; } |
まずはプレイヤーがカードを出すメソッドについて書き直す必要がありそうです。
これまでのルールではプレイヤーがカードを取らなければならないときは限定されていました。これからはそうでもないので積み札がなくなっている可能性があるときにはそのときの処理が必要です。
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
public class Player { public CardEx PutCard(Card card, List<Card> shuffledCards) { // 積み札がなくなったらすでに出されているカードを使う。 if(shuffledCards.Count == 0) _form1.ShuffleCard(card); // カードが1枚だけのときは必ずカードを取る if(Config.IsOnlyDobon) { if(Cards.Count == 1) { Card addCard = shuffledCards[0]; shuffledCards.RemoveAt(0); Cards.Add(addCard); PlayerPanel.Invalidate(); _form1.Text = Name+ "はカードが1枚しかないのでカードを取るしかありません"; System.Threading.Thread.Sleep(500); return null; } } // 出せるカードを求める List<Card> canPutCards = GetAblePutCards(card); // 実際に出されたカード CardEx putCard = null; if(canPutCards.Count > 0) { // 出せるカードが1枚のときはそのカードを // 複数あるときはそのなかの1枚を出す(省略) } else { // 出せるカードがないときの処理 // 設定によって異なる(省略) } if(putCard.Number == 12) { // Qが出せる場合、複数のカードを出すか?(省略) } putCard.player = this; return putCard; } } |
ライバルのターンの動作を定義しているRivalsTurnのなかでPutCardメソッドがnullを返すことがあるので適切な処理をする必要があるというのは前回とおなじです。
1 2 3 4 5 6 7 |
public partial class Form1 : Form { bool RivalsTurn(int firstRival) { // 変化はない } } |
またRivalsTurnが終わったら自分のカードを調べて出せるカードがあるか確認して、ない場合は自動で処理をしています。これがCheckPrevMyTurnメソッドです。
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
public partial class Form1 : Form { bool CheckPrevMyTurn() { // 積み札がなくなったらすでに出されているカードを使う。 if(ShuffledCards.Count == 0) _form1.ShuffleCard(CenterCard); // Aが出ているときはスキップされる(省略) // 2が出されていたら2を出すか2のn乗枚のカードをとる(同上) // 自分の番だが持っているカードは1枚だけではないのか? // カードが1枚だけのときは必ずカードを取る if(Config.IsOnlyDobon) { if(Players[0].Cards.Count == 1) { Card addCard = ShuffledCards[0]; ShuffledCards.RemoveAt(0); Players[0].Cards.Add(addCard); Players[0].PlayerPanel.Invalidate(); Text = "1枚しかないのでカードを取るしかありません"; System.Threading.Thread.Sleep(500); return RivalsTurn(1); } } // ここから後は以前の処理と同じです。 // 出せるカードがない場合は1枚だけカードを取るのか // カードがみつかるまで引き続けるのか if(Config.IsDrawCardOnlyOne) { // 出せるカードがない場合は1枚だけカードを取る } else { // ない場合は出せるカードを引くまでカードを取り続ける } } } |