Contents
点数計算は地方によってさまざま
ドボンでは誰かが上がったときに残されたカードで点数計算をおこないます。ただ点数の付け方にはこれまたローカルルールがあります。とくに相手にカードを取らせる「2」やどんなカードに対しても出すことができる「8」には高い点数がつけられる傾向があります。
ここでは
役札(A, 2, 8, J)は20点
絵札(Q, K)は10点
その他(3, 4, 5, 6, 7, 9, 10)は数字通りの点数
という計算法にしていますが、なかにはもっと過酷なものもあるそうです。
【パーティーゲーム】ギャンブル・ドボンのすすめ | 沼の底ブログ
ここでは
「絵札」=10
「2」=50
1の位は四捨五入する
というルールになっています。「2」は50点。厳しいルールです。
さらにドボンされた場合は(自身の手札 + ドボンしたプレイヤーの手札)を四捨五入後、さらに3を掛けるという鬼ルールです。
それからこんな計算法もあるそうです。
誰かからドボンした場合、それ以外のプレイヤーは普通に計算しますが、ドボンされた場合は敗者の点数は自分の手札のカードの数字の合計ではなく、「敗者以外の点数の中で最も悪い点数の2倍」というルールもあります。ドボン返しによる敗者の点数は、最悪の点数の2倍ではなく6倍です。これも鬼ルールですね。
では点数の計算法は各自で自由に設定できるようにします。
各カードの点数を自由に設定できるようにする
ドボンの場合は「自分のカードの○倍」または「他のプレーヤーの最悪点の○倍」、ドボン返しの場合はさらに倍率を変えることができるように設定ダイアログを変更します。
下記のようなユーザーコントロールを作成して貼り付けています。「10」と書かれている部分をカードの番号に変更して点数を設定できるようにしています。
ユーザーコントロールCardPointはこのようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public partial class CardPoint : UserControl { public CardPoint() { InitializeComponent(); } public void InitControl(string str, int point) { label1.Text = str; numericUpDown1.Value = point; } public int GetPoint() { return (int)numericUpDown1.Value; } } |
ConfigクラスとConfigObjectクラスの追加部分
ではConfigクラスとConfigObjectクラスの追加部分を示します。
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 |
static public class Config { // カードの点数 static public int CardPoit1 = 20; static public int CardPoit2 = 20; static public int CardPoit3 = 3; static public int CardPoit4 = 4; static public int CardPoit5 = 5; static public int CardPoit6 = 6; static public int CardPoit7 = 7; static public int CardPoit8 = 20; static public int CardPoit9 = 9; static public int CardPoit10 = 10; static public int CardPoit11 = 20; static public int CardPoit12 = 10; static public int CardPoit13 = 10; // ドボンされたときの倍率 static public int DobonExtend = 2; static public int AntiDobonExtend = 3; static public bool IsUseWorstDobon = false; static public bool IsUseWorstAntiDobon = false; // その他の部分は前回と同じ } |
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 78 79 80 |
public class ConfigObject { public void CopyToFile() { CardPoit1 = Config.CardPoit1; CardPoit2 = Config.CardPoit2; CardPoit3 = Config.CardPoit3; CardPoit4 = Config.CardPoit4; CardPoit5 = Config.CardPoit5; CardPoit6 = Config.CardPoit6; CardPoit7 = Config.CardPoit7; CardPoit8 = Config.CardPoit8; CardPoit9 = Config.CardPoit9; CardPoit10 = Config.CardPoit10; CardPoit11 = Config.CardPoit11; CardPoit12 = Config.CardPoit12; CardPoit13 = Config.CardPoit13; // ドボンされたときの倍率 DobonExtend = Config.DobonExtend; AntiDobonExtend = Config.AntiDobonExtend; IsUseWorstDobon = Config.IsUseWorstDobon; IsUseWorstAntiDobon = Config.IsUseWorstAntiDobon; // その他の部分は前回と同じ } public void CopyFromFile() { Config.CardPoit1 = CardPoit1; Config.CardPoit2 = CardPoit2; Config.CardPoit3 = CardPoit3; Config.CardPoit4 = CardPoit4; Config.CardPoit5 = CardPoit5; Config.CardPoit6 = CardPoit6; Config.CardPoit7 = CardPoit7; Config.CardPoit8 = CardPoit8; Config.CardPoit9 = CardPoit9; Config.CardPoit10 = CardPoit10; Config.CardPoit11 = CardPoit11; Config.CardPoit12 = CardPoit12; Config.CardPoit13 = CardPoit13; // ドボンされたときの倍率 Config.DobonExtend = DobonExtend; Config.AntiDobonExtend = AntiDobonExtend; Config.IsUseWorstDobon = IsUseWorstDobon; Config.IsUseWorstAntiDobon = IsUseWorstAntiDobon; // その他の部分は前回と同じ } // カードの点数 public int CardPoit1 = 20; public int CardPoit2 = 20; public int CardPoit3 = 3; public int CardPoit4 = 4; public int CardPoit5 = 5; public int CardPoit6 = 6; public int CardPoit7 = 7; public int CardPoit8 = 20; public int CardPoit9 = 9; public int CardPoit10 = 10; public int CardPoit11 = 20; public int CardPoit12 = 10; public int CardPoit13 = 10; // ドボンされたときの倍率 public int DobonExtend = 2; public int AntiDobonExtend = 3; public bool IsUseWorstDobon = false; public bool IsUseWorstAntiDobon = false; // その他のフィールド変数は前回と同じ } |
ConfigDialogクラスの追加部分
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 78 |
public partial class ConfigDialog : Form { public ConfigDialog() { // コンストラクタは変更なし } private void ConfigDialog_Load(object sender, EventArgs e) { // 追加部分 cardPoint01.InitControl("A", Config.CardPoit1); cardPoint02.InitControl("2", Config.CardPoit2); cardPoint03.InitControl("3", Config.CardPoit3); cardPoint04.InitControl("4", Config.CardPoit4); cardPoint05.InitControl("5", Config.CardPoit5); cardPoint06.InitControl("6", Config.CardPoit6); cardPoint07.InitControl("7", Config.CardPoit7); cardPoint08.InitControl("8", Config.CardPoit8); cardPoint09.InitControl("9", Config.CardPoit9); cardPoint10.InitControl("10", Config.CardPoit10); cardPoint11.InitControl("J", Config.CardPoit11); cardPoint12.InitControl("Q", Config.CardPoit12); cardPoint13.InitControl("K", Config.CardPoit13); numericUpDownDobon.Value = Config.DobonExtend; numericUpDownAntiDobon.Value = Config.AntiDobonExtend; if(Config.IsUseWorstDobon) cbUseWorstDobon.Checked = true; else cbUseWorstDobon.Checked = false; if(Config.IsUseWorstAntiDobon) cbUseWorstAntiDobon.Checked = true; else cbUseWorstAntiDobon.Checked = false; // 追加部分以外は変更なし } private void ButtonOK_Click(object sender, EventArgs e) { // 追加部分 Config.CardPoit1 = cardPoint01.GetPoint(); Config.CardPoit2 = cardPoint02.GetPoint(); Config.CardPoit3 = cardPoint03.GetPoint(); Config.CardPoit4 = cardPoint04.GetPoint(); Config.CardPoit5 = cardPoint05.GetPoint(); Config.CardPoit6 = cardPoint06.GetPoint(); Config.CardPoit7 = cardPoint07.GetPoint(); Config.CardPoit8 = cardPoint08.GetPoint(); Config.CardPoit9 = cardPoint09.GetPoint(); Config.CardPoit10 = cardPoint10.GetPoint(); Config.CardPoit11 = cardPoint11.GetPoint(); Config.CardPoit12 = cardPoint12.GetPoint(); Config.CardPoit13 = cardPoint13.GetPoint(); Config.DobonExtend = (int)numericUpDownDobon.Value; Config.AntiDobonExtend = (int)numericUpDownAntiDobon.Value; if(cbUseWorstDobon.Checked) Config.IsUseWorstDobon = true; else Config.IsUseWorstDobon = false; if(cbUseWorstAntiDobon.Checked) Config.IsUseWorstAntiDobon = true; else Config.IsUseWorstAntiDobon = false; // 追加部分以外は変更なし } private void cbIsDrawCardOnlyOne_CheckedChanged(object sender, EventArgs e) { // このイベントハンドラへの変更はなし } } |
点数計算
誰かがドボンしたときドボン返しはあるのか、ドボン返しは誰でもできる場合、最終的な勝者と敗者は誰なのかをOnDobonメソッドのなかで判定していました。ここからゲームの勝者と敗者が決まります。
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 |
public partial class Form1 : Form { // 最後にドボンしたプレイヤー(勝者) Player LastDobon = null; // 最後にドボンされたプレイヤー(敗者) Player LastDoboned = null; // ひとつのゲームでドボンされた回数(2以上ならドボン返しがあった) 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 + " の負けです"); LastDobon = doboned; LastDoboned = dobon; } else { dobon.Dobon(doboned); MessageBox.Show(dobon.Name + " の勝ち、" + doboned.Name + " の負けです"); LastDobon = dobon; LastDoboned = doboned; } } } } |
点数計算が終わったら忘れずに値をクリアしておきます。
1 2 3 |
LastDobon = null; LastDoboned = null; DobonPlayers.Clear(); |
これで点数計算のときに
LastDobon == nullならドボンで上がったわけではない。
DobonPlayers.Count > 1のときはドボン返しがあった。
ということがわかります。
点数計算はCalcScoreメソッドでおこなわれます。
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 78 79 80 81 82 83 84 85 86 |
public partial class Form1 : Form { void CalcScore() { Player winner = Players.First(x => x.Cards.Count == 0); Player[] others = Players.Where(x => x.Cards.Count > 0).ToArray(); Player lastDobon = LastDobon; Player lastDoboned = LastDoboned; foreach(Player other in others) { int minusScore = 0; foreach(Card card in other.Cards) { if(card.Number == 1) minusScore += Config.CardPoit1; if(card.Number == 2) minusScore += Config.CardPoit2; if(card.Number == 3) minusScore += Config.CardPoit3; if(card.Number == 4) minusScore += Config.CardPoit4; if(card.Number == 5) minusScore += Config.CardPoit5; if(card.Number == 6) minusScore += Config.CardPoit6; if(card.Number == 7) minusScore += Config.CardPoit7; if(card.Number == 8) minusScore += Config.CardPoit8; if(card.Number == 9) minusScore += Config.CardPoit9; if(card.Number == 10) minusScore += Config.CardPoit10; if(card.Number == 11) minusScore += Config.CardPoit11; if(card.Number == 12) minusScore += Config.CardPoit12; if(card.Number == 13) minusScore += Config.CardPoit13; } // 1ゲームにおける変動 other.Score = -minusScore; } // ドボンで上がられた(ドボン返しなし) if(DobonPlayers.Count == 1) { if(Config.IsUseWorstDobon) { int worst = Players.Where(x => x != LastDoboned).Min(x => x.Score); LastDoboned.Score = worst * Config.DobonExtend; } else LastDoboned.Score *= Config.DobonExtend; } // ドボン返しで上がられた if(DobonPlayers.Count > 1) { if(Config.IsUseWorstAntiDobon) { int worst = Players.Where(x => x != LastDoboned).Min(x => x.Score); LastDoboned.Score = worst * Config.AntiDobonExtend; } else LastDoboned.Score *= Config.AntiDobonExtend; } // 勝者以外の負け点の合計が勝者の得点となる winner.Score = - others.Sum(x => x.Score); // ゲームごとのスコアからトータルスコアを計算する foreach(Player player in Players) { player.TotalScore += player.Score; } // フィールド変数をクリア LastDobon = null; LastDoboned = null; DobonPlayers.Clear(); } } |
失礼いたします。
ConfigDialogクラスのcardPoint01~13の宣言がされていない為、エラーになってしまいます。
小見出し「各カードの点数を自由に設定できるようにする」の下にダイアログがありますが、
「下記のようなユーザーコントロールを作成して貼り付けています。」といって貼り付けているユーザーコントロールがcardPoint01~13です。
赤枠で3つだけ囲っていますが、これらのコントロールひとつひとつがcardPoint01~13です。
ということに気づけといわれても無理ですね。
読者目線で文章を書かないといけないのにわかりにくい書き方になってすみません。