Contents
ドボン返しが何回もおきる?
今回はドボン返しは誰でもできるように作りかえます。
ドボン返しできるかどうかを判定するメソッドはOnDobonです。これまではこのような内容になっていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public partial class Form1 : Form { void OnDobon(int dobonNumber, Player dobon, Player doboned) { if(doboned.Cards.Sum(x => x.Number) == dobonNumber) { doboned.AntiDobon(dobon); MessageBox.Show("ドボン返しで" + doboned.Name + " の勝ち、\n" + dobon.Name + " の負けです"); } else { dobon.Dobon(doboned); MessageBox.Show(dobon.Name + " の勝ち、" + doboned.Name + " の負けです"); } } } |
これまではドボン返しができるのはドボンされたプレーヤーだけなので簡単な処理ですみました。
ところが誰でもドボンができるようになると(しかも一番ドボンの対象になるのは一番上に置かれたカードとなると)ドボン返しが何回もおきる可能性があります。
そこでフィールド変数で最後にドボンしたプレイヤーとされたプレイヤーがわかるようにしました。この両者が勝者と敗者になります。
またドボン返しは複数回おこなわれるかもしれないのでメソッドを再帰呼び出しすることで処理をしています。
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 partial class Form1 : Form { // ドボンしたプレイヤーに関する情報 // 最後にドボンしたのは誰か? = 勝者 Player LastDobon = null; // 最後にドボンされたのは誰か? = 敗者 Player LastDoboned = null; // すでにドボン、ドボン返しをしたプレイヤー // カードは出してしまったのでドボン返しはできない List<Player> DobonPlayers = new List<Player>(); void OnDobon(int dobonNumber, Player dobon, Player doboned) { if(Config.IsAntiDobonEveryone) { LastDobon = dobon; LastDoboned = doboned; DobonPlayers.Clear(); DobonPlayers.Add(dobon); // ドボンしたプレイヤー以外なら誰でもドボン返しができる // ドボン返しは複数回おこなわれるかもしれないので再帰呼び出しとする OnDobon1(dobonNumber, dobon, doboned); LastDobon.Dobon(LastDoboned); MessageBox.Show(LastDobon.Name + " の勝ち、\n" + LastDoboned.Name + " の負けです"); } else { // ドボン返しはドボンされたプレイヤーでないとできない設定の場合 // ここから下はこれまでと変わらず string reason = ""; if(doboned.CanDobon(dobonNumber, ref reason)) { doboned.AntiDobon(dobon); MessageBox.Show("ドボン返しで" + doboned.Name + " の勝ち、\n" + dobon.Name + " の負けです"); } else { dobon.Dobon(doboned); MessageBox.Show(dobon.Name + " の勝ち、" + doboned.Name + " の負けです"); } } } } |
ドボン返しの再帰呼び出し
これが再帰呼び出しされるメソッドです。
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
public partial class Form1 : Form { void OnDobon1(int dobonNumber, Player dobon, Player doboned) { // すでにドボンしたプレイヤーはドボンできない Player[] players = Players.Where(x => x != dobon).Except(DobonPlayers).ToArray(); foreach(Player player in players) { string reason = ""; if(player.CanDobon(dobonNumber, ref reason)) { LastDobon = player; LastDoboned = dobon; if(player == Players[0]) { DialogResult dr = MessageBox.Show("ドボン返しできます。ドボンしますか?\n" + reason, "", MessageBoxButtons.YesNo); if(dr != DialogResult.Yes) continue; if(Config.IsAntiDobonTopCard) { int dobonNumber1 = 0; DobonTopNumberDialog dlg = new DobonTopNumberDialog(); dlg.vs = Players[0].Cards.Select(x => x.Number).Distinct().ToList(); if(dlg.ShowDialog() == DialogResult.OK) { dobonNumber1 = dlg.TopNumber; // カードを出す CardEx topCard = (CardEx)dobon.Cards.First(x => x.Number == dobonNumber1); topCard.player = Players[0]; // 場に出されているカードを変更する CenterCard = topCard; System.Threading.Thread.Sleep(500); } else continue; DobonPlayers.Add(Players[0]); OnDobon1(dobonNumber1, player, dobon); } else { DobonPlayers.Add(Players[0]); OnDobon1(dobonNumber, player, dobon); } } if(Config.IsAntiDobonTopCard) { int dobonNumber1 = player.Cards.Min(x => x.Number); MessageBox.Show(doboned.Name + "がドボン返しをしました。"); // カードを出す CardEx topCard = (CardEx)dobon.Cards.First(x => x.Number == dobonNumber1); topCard.player = player; // 場に出されているカードを変更する CenterCard = topCard; System.Threading.Thread.Sleep(500); DobonPlayers.Add(player); OnDobon1(dobonNumber1, player, dobon); } else { DobonPlayers.Add(player); OnDobon1(dobonNumber, player, dobon); } } } } } |
失礼いたします。
OnDobon、OnDobon1のメソッド内にて、
if (doboned.CanDobon(dobonNumber, ref reason))
または、
if (player.CanDobon(dobonNumber, ref reason))
ですが、dobonNumberがint型に対して、引数Card cardの為、エラーが発生してしまいます。
>OnDobon、OnDobon1のメソッド内にて、
>if (doboned.CanDobon(dobonNumber, ref reason))
>または、
>if (player.CanDobon(dobonNumber, ref reason))
>ですが、dobonNumberがint型に対して、引数Card cardの為、エラーが発生してしまいます。
元のコードが見当たらないため、ちょっとわかりません。
OnDobon、OnDobon1メソッドは最終回のページでCheckAntiDobon(CardEx card, Player dobon, Player doboned)メソッドとして書き換えています。
困ったことにhttps://lets-csharp.com/dobon-score-customization/でも間違ったOnDobonメソッドが出てきます。修正不能。
返事にならない返事で申し訳ありません。
これまでのコメント返しで最悪・・・の内容。