Head First C#Lab1赛事的一天称为方法未执行

时间:2012-08-31 08:41:42

标签: c# winforms

我遇到了我创建的greyhound应用程序的问题。当我使用单选按钮选择谁下注(Say Bob)并将他的下注金额加到10号狗上时(参见图片#1)当我点击下注时,更新'Bob没有下注任何下注'带有description()方法的标签我得到一个错误(见图2)

image #1

image #2

应该发生的事情就是“bob没有下注任何赌注”它现在应该是“bob在狗#4上下注10美元。我已经确定这是由于投注者返回NULL而失败,但我无法理解为什么这是Bettor引用包含下注者姓名的Guy类的时候。

在比赛结束时,如果Bob赢了,他就注意到了,所以PayOut()或Collect()方法也不起作用。

以下是我的3个课程和我的Form1.cs

Greyhound.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Drawing;
using System.Windows.Forms;

namespace A_Day_at_the_Races
{
    public class Greyhound
    {
        public int StartingPosition; //Where my PictureBox starts
        public int RacetrackLength; // How long the racetrack is
        public PictureBox MyPictureBox = null; //My PictureBox object
        public int Location = 0; // My Location on the racetrack
        public Random Randomizer; // An instance of Random

        public bool Run()
        {
            //1. Move forward either 1,2,3 or 4 spaces at random
            int moveforward = Randomizer.Next(1, 4); // declare an int called 'moveforward' will move forward 1,2,3 or 4 spaces at random

            //2. Update the position of my PictureBox on the form
            Point p = MyPictureBox.Location; // current location of the picture of the greyhound
            p.X += moveforward;
            MyPictureBox.Location = p;

            //3. Return true if I won the race
            if (p.X >= RacetrackLength)
                return true;
            else
                return false;
        }

        public void TakeStartingPosition()
        {
            //Reset my location to the start line
            //MyPictureBox.Location.X = StartingPosition;

            StartingPosition = 0;
        }
    }
}

Guy.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace A_Day_at_the_Races
{
    public class Guy
    {
        public string Name; // The guy's name
        public Bet MyBet = null; // An instance of bet() that has how much he's betting
        public int Cash; // How much cash he has
        // these last two fields are the guy's GUI controls on the form
        public RadioButton MyRadioButton; // My RadioButton
        public Label MyLabel; // My Label

        public void UpdateLabels()
        {
            //1.Set my label to my bet's description, 
            if (MyBet == null)
                MyLabel.Text = Name + " hasnt placed any bets";
            else
                MyLabel.Text = MyBet.GetDescription();

            //2.Set the label on my radio button to show my cash ("Joe has 43 dollars")
            MyRadioButton.Text = Name + " has " + Cash + " bucks";
        }

        public void ClearBet()
        {
            //1.Reset my bet so it's zero
            MyBet = null;
        }

        //1.Place a new bet and store it in my bet field
        //2.Return true if the guy had enough money to bet
        public bool PlaceBet(int Amount, int Dog)
        {
            this.MyBet = new Bet();

            if (Cash >= Amount)
            {
                Cash = Cash - Amount;
                MyLabel = new Label();
                MyBet.Amount = Amount;
                MyBet.Dog = Dog;
                UpdateLabels();
                return true;
            }
            else
            {
                return false;
            }
        }

        public void Collect(int Winner)
        {
            if (MyBet != null)
                //1.Ask my bet to pay out (hint use the bet object to do the work)
                Cash += MyBet.PayOut(Winner);
        }
    }
}

Bet.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace A_Day_at_the_Races
{
    public class Bet
    {
         public int Amount; // The amount of cash that was bet
         public int Dog; // The number of the dog the bet is on
         public Guy Bettor; // The guy who placed the bet

         public string GetDescription()
         {
             if (Amount > 0)
                 return Bettor.Name + " bets " + Amount + " bucks on dog #" + Dog;
             else
                 return Bettor.Name + " hasnt placed a bet";
         }

         public int PayOut(int Winner)
         {
             if (Winner == Dog)
                 return Amount;
             else
                 return -1 * Amount;
         }
    }
}

Form1.cs的

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace A_Day_at_the_Races
{
    public partial class Form1 : Form
    {
        Guy[] Bettors;
        Greyhound[] Dogs;
        Guy CurrentBettor;

        public Form1()
        {
            InitializeComponent();
            Random Randomizer = new Random();

            //initialise all my guys and dogs
            Bettors = new Guy[3];
            Dogs = new Greyhound[4];

            //guys
            Bettors[0] = new Guy();
            Bettors[0].Name = "Joe";
            Bettors[0].MyRadioButton = joeRadioButton;
            Bettors[0].MyLabel = joeBetLabel;
            Bettors[0].Cash = 50;
            Bettors[0].UpdateLabels();

            Bettors[1] = new Guy();
            Bettors[1].Name = "Bob";
            Bettors[1].MyRadioButton = bobRadioButton;
            Bettors[1].MyLabel = bobBetLabel;
            Bettors[1].Cash = 75;
            Bettors[1].UpdateLabels();

            Bettors[2] = new Guy();
            Bettors[2].Name = "Al";
            Bettors[2].MyRadioButton = alRadioButton;
            Bettors[2].MyLabel = alBetLabel;
            Bettors[2].Cash = 45;
            Bettors[2].UpdateLabels();


            int StartPosition = pictureBoxDog1.Location.X;
            int distance = pictureBox1.Width;
            for (int i = 0; i < 4; i++)
            {
                Dogs[i] = new Greyhound();
                Dogs[i].Randomizer = Randomizer;
                Dogs[i].RacetrackLength = distance;
                Dogs[i].Location = Dogs[i].StartingPosition = StartPosition;
            }

            Dogs[0].MyPictureBox = pictureBoxDog1;
            Dogs[1].MyPictureBox = pictureBoxDog2;
            Dogs[2].MyPictureBox = pictureBoxDog3;
            Dogs[3].MyPictureBox = pictureBoxDog4;

            CurrentBettor = Bettors[0];
        }

        private void RaceButton_Click(object sender, EventArgs e)
        {
            int winner = 0;
            int num_winners = 0;

            while (num_winners == 0)
            {
                for (int i = 0; i < Dogs.Length; i++)
                {
                    if (Dogs[i].Run())
                    {
                        num_winners++;
                        winner = i + 1;
                    }
                }
                Application.DoEvents();
                System.Threading.Thread.Sleep(3);
            }

            if (num_winners > 1)
                MessageBox.Show("We have " + num_winners + " winners");
            else
                MessageBox.Show(" Dog #" + winner + "wins!");

            for (int i = 0; i < Dogs.Length; i++)
            {
                Dogs[i].TakeStartingPosition();
            }

            for (int i = 0; i < Bettors.Length; i ++)
            {
                Bettors[i].Collect(winner);
                Bettors[i].ClearBet();
                Bettors[i].UpdateLabels();
            }

            numericUpDownBet.Value = numericUpDownBet.Minimum;
            numericUpDownDog.Value = numericUpDownDog.Minimum;
        }

        private void joeRadioButton_CheckedChanged(object sender, EventArgs e)
        {
            SetBettor(0);
        }

        private void bobRadioButton_CheckedChanged_1(object sender, EventArgs e)
        {
            SetBettor(1);
        }

        private void alRadioButton_CheckedChanged_1(object sender, EventArgs e)
        {
            SetBettor(2);
        }

        private void BetsButton_Click(object sender, EventArgs e)
        {
            CurrentBettor.PlaceBet((int)numericUpDownBet.Value, (int)numericUpDownDog.Value);
            CurrentBettor.UpdateLabels();
        }
        private void SetBettor(int index)
        {
            CurrentBettor = Bettors[index];
            NameLabel.Text = CurrentBettor.Name;
            if (CurrentBettor.MyBet != null)
            {
                numericUpDownBet.Value = CurrentBettor.MyBet.Amount;
                numericUpDownDog.Value = CurrentBettor.MyBet.Dog;
            }
            else
            {
                numericUpDownBet.Value = numericUpDownBet.Minimum;
                numericUpDownDog.Value = 1;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            minimumBetLabel.Text = "Minimum Bet $5.00";
        }

        private void ResetButton_Click(object sender, EventArgs e)
        {
            pictureBoxDog1.Location = new Point(61,32);
            pictureBoxDog2.Location = new Point(61,84);
            pictureBoxDog3.Location = new Point(61,131);
            pictureBoxDog4.Location = new Point(61,181);
        }
    }
}

Form1.Designer.cs

namespace A_Day_at_the_Races
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
            this.pictureBox1 = new System.Windows.Forms.PictureBox();
            this.pictureBoxDog1 = new System.Windows.Forms.PictureBox();
            this.pictureBoxDog2 = new System.Windows.Forms.PictureBox();
            this.pictureBoxDog3 = new System.Windows.Forms.PictureBox();
            this.pictureBoxDog4 = new System.Windows.Forms.PictureBox();
            this.RaceButton = new System.Windows.Forms.Button();
            this.minimumBetLabel = new System.Windows.Forms.Label();
            this.joeRadioButton = new System.Windows.Forms.RadioButton();
            this.bobRadioButton = new System.Windows.Forms.RadioButton();
            this.alRadioButton = new System.Windows.Forms.RadioButton();
            this.BetsLabel = new System.Windows.Forms.Label();
            this.joeBetLabel = new System.Windows.Forms.Label();
            this.bobBetLabel = new System.Windows.Forms.Label();
            this.alBetLabel = new System.Windows.Forms.Label();
            this.NameLabel = new System.Windows.Forms.Label();
            this.BetsButton = new System.Windows.Forms.Button();
            this.numericUpDownBet = new System.Windows.Forms.NumericUpDown();
            this.label1 = new System.Windows.Forms.Label();
            this.numericUpDownDog = new System.Windows.Forms.NumericUpDown();
            this.ResetButton = new System.Windows.Forms.Button();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog1)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog2)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog3)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog4)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBet)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDog)).BeginInit();
            this.SuspendLayout();
            // 
            // pictureBox1
            // 
            this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
            this.pictureBox1.Location = new System.Drawing.Point(12, 12);
            this.pictureBox1.Name = "pictureBox1";
            this.pictureBox1.Size = new System.Drawing.Size(602, 201);
            this.pictureBox1.TabIndex = 0;
            this.pictureBox1.TabStop = false;
            // 
            // pictureBoxDog1
            // 
            this.pictureBoxDog1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBoxDog1.Image")));
            this.pictureBoxDog1.Location = new System.Drawing.Point(22, 21);
            this.pictureBoxDog1.Name = "pictureBoxDog1";
            this.pictureBoxDog1.Size = new System.Drawing.Size(75, 21);
            this.pictureBoxDog1.TabIndex = 1;
            this.pictureBoxDog1.TabStop = false;
            // 
            // pictureBoxDog2
            // 
            this.pictureBoxDog2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBoxDog2.Image")));
            this.pictureBoxDog2.Location = new System.Drawing.Point(22, 70);
            this.pictureBoxDog2.Name = "pictureBoxDog2";
            this.pictureBoxDog2.Size = new System.Drawing.Size(75, 22);
            this.pictureBoxDog2.TabIndex = 2;
            this.pictureBoxDog2.TabStop = false;
            // 
            // pictureBoxDog3
            // 
            this.pictureBoxDog3.Image = ((System.Drawing.Image)(resources.GetObject("pictureBoxDog3.Image")));
            this.pictureBoxDog3.Location = new System.Drawing.Point(22, 120);
            this.pictureBoxDog3.Name = "pictureBoxDog3";
            this.pictureBoxDog3.Size = new System.Drawing.Size(75, 24);
            this.pictureBoxDog3.TabIndex = 3;
            this.pictureBoxDog3.TabStop = false;
            // 
            // pictureBoxDog4
            // 
            this.pictureBoxDog4.Image = ((System.Drawing.Image)(resources.GetObject("pictureBoxDog4.Image")));
            this.pictureBoxDog4.Location = new System.Drawing.Point(22, 170);
            this.pictureBoxDog4.Name = "pictureBoxDog4";
            this.pictureBoxDog4.Size = new System.Drawing.Size(75, 24);
            this.pictureBoxDog4.TabIndex = 4;
            this.pictureBoxDog4.TabStop = false;
            // 
            // RaceButton
            // 
            this.RaceButton.Location = new System.Drawing.Point(468, 269);
            this.RaceButton.Name = "RaceButton";
            this.RaceButton.Size = new System.Drawing.Size(146, 73);
            this.RaceButton.TabIndex = 5;
            this.RaceButton.Text = "Race!";
            this.RaceButton.UseVisualStyleBackColor = true;
            this.RaceButton.Click += new System.EventHandler(this.RaceButton_Click);
            // 
            // minimumBetLabel
            // 
            this.minimumBetLabel.AutoSize = true;
            this.minimumBetLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.minimumBetLabel.Location = new System.Drawing.Point(9, 241);
            this.minimumBetLabel.Name = "minimumBetLabel";
            this.minimumBetLabel.Size = new System.Drawing.Size(0, 13);
            this.minimumBetLabel.TabIndex = 6;
            // 
            // joeRadioButton
            // 
            this.joeRadioButton.AutoSize = true;
            this.joeRadioButton.Location = new System.Drawing.Point(12, 269);
            this.joeRadioButton.Name = "joeRadioButton";
            this.joeRadioButton.Size = new System.Drawing.Size(85, 17);
            this.joeRadioButton.TabIndex = 7;
            this.joeRadioButton.TabStop = true;
            this.joeRadioButton.Text = "radioButton1";
            this.joeRadioButton.UseVisualStyleBackColor = true;
            this.joeRadioButton.CheckedChanged += new System.EventHandler(this.joeRadioButton_CheckedChanged);
            // 
            // bobRadioButton
            // 
            this.bobRadioButton.AutoSize = true;
            this.bobRadioButton.Location = new System.Drawing.Point(12, 293);
            this.bobRadioButton.Name = "bobRadioButton";
            this.bobRadioButton.Size = new System.Drawing.Size(85, 17);
            this.bobRadioButton.TabIndex = 8;
            this.bobRadioButton.TabStop = true;
            this.bobRadioButton.Text = "radioButton1";
            this.bobRadioButton.UseVisualStyleBackColor = true;
            this.bobRadioButton.CheckedChanged += new System.EventHandler(this.bobRadioButton_CheckedChanged_1);
            // 
            // alRadioButton
            // 
            this.alRadioButton.AutoSize = true;
            this.alRadioButton.Location = new System.Drawing.Point(12, 317);
            this.alRadioButton.Name = "alRadioButton";
            this.alRadioButton.Size = new System.Drawing.Size(85, 17);
            this.alRadioButton.TabIndex = 9;
            this.alRadioButton.TabStop = true;
            this.alRadioButton.Text = "radioButton2";
            this.alRadioButton.UseVisualStyleBackColor = true;
            this.alRadioButton.CheckedChanged += new System.EventHandler(this.alRadioButton_CheckedChanged_1);
            // 
            // BetsLabel
            // 
            this.BetsLabel.AutoSize = true;
            this.BetsLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.BetsLabel.Location = new System.Drawing.Point(164, 241);
            this.BetsLabel.Name = "BetsLabel";
            this.BetsLabel.Size = new System.Drawing.Size(32, 13);
            this.BetsLabel.TabIndex = 10;
            this.BetsLabel.Text = "Bets";
            // 
            // joeBetLabel
            // 
            this.joeBetLabel.AutoSize = true;
            this.joeBetLabel.Location = new System.Drawing.Point(164, 269);
            this.joeBetLabel.Name = "joeBetLabel";
            this.joeBetLabel.Size = new System.Drawing.Size(35, 13);
            this.joeBetLabel.TabIndex = 11;
            this.joeBetLabel.Text = "label1";
            // 
            // bobBetLabel
            // 
            this.bobBetLabel.AutoSize = true;
            this.bobBetLabel.Location = new System.Drawing.Point(164, 293);
            this.bobBetLabel.Name = "bobBetLabel";
            this.bobBetLabel.Size = new System.Drawing.Size(35, 13);
            this.bobBetLabel.TabIndex = 12;
            this.bobBetLabel.Text = "label1";
            // 
            // alBetLabel
            // 
            this.alBetLabel.AutoSize = true;
            this.alBetLabel.Location = new System.Drawing.Point(164, 317);
            this.alBetLabel.Name = "alBetLabel";
            this.alBetLabel.Size = new System.Drawing.Size(35, 13);
            this.alBetLabel.TabIndex = 13;
            this.alBetLabel.Text = "label1";
            // 
            // NameLabel
            // 
            this.NameLabel.AutoSize = true;
            this.NameLabel.Location = new System.Drawing.Point(9, 359);
            this.NameLabel.Name = "NameLabel";
            this.NameLabel.Size = new System.Drawing.Size(0, 13);
            this.NameLabel.TabIndex = 14;
            // 
            // BetsButton
            // 
            this.BetsButton.Location = new System.Drawing.Point(54, 354);
            this.BetsButton.Name = "BetsButton";
            this.BetsButton.Size = new System.Drawing.Size(75, 23);
            this.BetsButton.TabIndex = 15;
            this.BetsButton.Text = "Bets";
            this.BetsButton.UseVisualStyleBackColor = true;
            this.BetsButton.Click += new System.EventHandler(this.BetsButton_Click);
            // 
            // numericUpDownBet
            // 
            this.numericUpDownBet.Location = new System.Drawing.Point(135, 357);
            this.numericUpDownBet.Minimum = new decimal(new int[] {
            5,
            0,
            0,
            0});
            this.numericUpDownBet.Name = "numericUpDownBet";
            this.numericUpDownBet.Size = new System.Drawing.Size(72, 20);
            this.numericUpDownBet.TabIndex = 16;
            this.numericUpDownBet.Value = new decimal(new int[] {
            5,
            0,
            0,
            0});
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(214, 359);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(113, 13);
            this.label1.TabIndex = 17;
            this.label1.Text = "bucks on dog number ";
            // 
            // numericUpDownDog
            // 
            this.numericUpDownDog.Location = new System.Drawing.Point(334, 356);
            this.numericUpDownDog.Maximum = new decimal(new int[] {
            4,
            0,
            0,
            0});
            this.numericUpDownDog.Minimum = new decimal(new int[] {
            1,
            0,
            0,
            0});
            this.numericUpDownDog.Name = "numericUpDownDog";
            this.numericUpDownDog.Size = new System.Drawing.Size(79, 20);
            this.numericUpDownDog.TabIndex = 18;
            this.numericUpDownDog.Value = new decimal(new int[] {
            1,
            0,
            0,
            0});
            // 
            // ResetButton
            // 
            this.ResetButton.Location = new System.Drawing.Point(468, 349);
            this.ResetButton.Name = "ResetButton";
            this.ResetButton.Size = new System.Drawing.Size(146, 41);
            this.ResetButton.TabIndex = 19;
            this.ResetButton.Text = "Reset";
            this.ResetButton.UseVisualStyleBackColor = true;
            this.ResetButton.Click += new System.EventHandler(this.ResetButton_Click);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(626, 410);
            this.Controls.Add(this.ResetButton);
            this.Controls.Add(this.numericUpDownDog);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.numericUpDownBet);
            this.Controls.Add(this.BetsButton);
            this.Controls.Add(this.NameLabel);
            this.Controls.Add(this.alBetLabel);
            this.Controls.Add(this.bobBetLabel);
            this.Controls.Add(this.joeBetLabel);
            this.Controls.Add(this.BetsLabel);
            this.Controls.Add(this.alRadioButton);
            this.Controls.Add(this.bobRadioButton);
            this.Controls.Add(this.joeRadioButton);
            this.Controls.Add(this.minimumBetLabel);
            this.Controls.Add(this.RaceButton);
            this.Controls.Add(this.pictureBoxDog4);
            this.Controls.Add(this.pictureBoxDog3);
            this.Controls.Add(this.pictureBoxDog2);
            this.Controls.Add(this.pictureBoxDog1);
            this.Controls.Add(this.pictureBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog1)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog2)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog3)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.pictureBoxDog4)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDownBet)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDog)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.PictureBox pictureBox1;
        private System.Windows.Forms.PictureBox pictureBoxDog1;
        private System.Windows.Forms.PictureBox pictureBoxDog2;
        private System.Windows.Forms.PictureBox pictureBoxDog3;
        private System.Windows.Forms.PictureBox pictureBoxDog4;
        private System.Windows.Forms.Button RaceButton;
        private System.Windows.Forms.Label minimumBetLabel;
        private System.Windows.Forms.RadioButton joeRadioButton;
        private System.Windows.Forms.RadioButton bobRadioButton;
        private System.Windows.Forms.RadioButton alRadioButton;
        private System.Windows.Forms.Label BetsLabel;
        private System.Windows.Forms.Label joeBetLabel;
        private System.Windows.Forms.Label bobBetLabel;
        private System.Windows.Forms.Label alBetLabel;
        private System.Windows.Forms.Label NameLabel;
        private System.Windows.Forms.Button BetsButton;
        private System.Windows.Forms.NumericUpDown numericUpDownBet;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.NumericUpDown numericUpDownDog;
        private System.Windows.Forms.Button ResetButton;
    }
}

4 个答案:

答案 0 :(得分:4)

PlaceBet方法中,您忘记设置Bettor属性:

            if (Cash >= Amount)
            {
                Cash = Cash - Amount;
                MyLabel = new Label();
                MyBet.Amount = Amount; // HERE
                MyBet.Dog = Dog; // HERE
                UpdateLabels();
                return true;

只需添加一行:

                MyBet.Bettor = this;

解释/理由:关键在于没有它,当“盖伊”创建“投注”时,投注不会知道谁创造了它。您的代码中没有任何地方设置Bettor字段,因此它永远不会被设置为有意义的东西。下注将仅保留此字段中的默认NULL值。由于我实际上没有阅读/追踪所有代码,我认为最简单的方法是让Bet从一开始就知道他的主人。

答案 1 :(得分:2)

在Guy.cs中,当你调用PlaceBet(...)并创建实例化赌注时,你需要设置:

this.MyBet.Bettor = this;

在此函数中,this指的是正在下注的Guy的实例。

您遇到的第二个问题是创建了Label的新实例,而实际上没有用新的实例替换表单上的Label。总之,修复PlaceBet(...)方法,如下所示:

public bool PlaceBet(int Amount, int Dog)
{
    this.MyBet = new Bet();

    if (Cash >= Amount)
    {
        Cash = Cash - Amount;

        // remove the following line
        // MyLabel = new Label();

        MyBet.Amount = Amount;
        MyBet.Dog = Dog;

        // insert this line...
        MyBet.Bettor = this;

        UpdateLabels();
        return true;
    }
    else
    {
        return false;
    }
}

答案 2 :(得分:1)

我刚刚在书中完成了这个练习......一直在进行。我查看了你的代码,看看你是如何处理这个问题的,我发现了一个相当大的错误,你如何处理支付更好的东西 - 在form1.cs,当你允许你的循环捕获多个赢家,你不会继续分发奖金除了最后一只获胜的狗

之外,任何人都可以使用Collect方法
while (num_winners == 0)
        {
            for (int i = 0; i < Dogs.Length; i++)
            {
                if (Dogs[i].Run())
                {
                    num_winners++;
                    winner = i + 1;
                }
            }
            Application.DoEvents();
            System.Threading.Thread.Sleep(3);
        }

        if (num_winners > 1)
 // you say that you have multiple winners right here but you never eval on 
 //it - winner is still set to one value above
            MessageBox.Show("We have " + num_winners + " winners"); 
        else
            MessageBox.Show(" Dog #" + winner + "wins!");

        for (int i = 0; i < Dogs.Length; i++)
        {
            Dogs[i].TakeStartingPosition();
        }

        for (int i = 0; i < Bettors.Length; i ++)
        {
            Bettors[i].Collect(winner);
            Bettors[i].ClearBet();
            Bettors[i].UpdateLabels();
        }

需要更改以纠正此问题并妥善分散投注:

1)使投注方案更加真实 - 当下注时 - 减去钱。您需要允许进行重新下注,以防万一有人想要在头版重做其中一个用户

in guy.cs
    public bool PlaceBet(int amount, int dog)
    {
        // place a new bet and store it in the bet field, return true if there is enough money
        if (amount > Cash)
        {
            MessageBox.Show("I don't have enough money for that bet!", Name + " says...");
            return false;
        }
        else
        {
            if (this.MyBet == null)
            {
                this.MyBet = new Bet() { Amount = amount, Bettor = this, Dog = dog };
                this.Cash -= amount;
                this.UpdateLabels();
                return true;
            }
            else
            {
                this.Cash += this.MyBet.Amount;
                this.MyBet = null;
                this.MyBet = new Bet() { Amount = amount, Bettor = this, Dog = dog };
                this.Cash -= amount;
                this.UpdateLabels();
                return true;
            }
        }
    }

2)现在已经丢失/提交了他们的钱,我们不必担心如果他们的狗没有获胜就向他们发送负面资金,Bet.cs支付方法可以更新如果获胜的狗匹配他们的赌注狗只能提供积极的回报。如果它没有,它什么也不返回。

    public int PayOut(int Winner)
    {
        // the parameter is the winner of the race. If the dog won, return the amount bet.
        // otherwise return nothing

        if (Winner == Dog)
        {
            int payout = Amount*2;
            return payout;
        }
        else
        {
            int payout = 0;
            return payout;
        }        
    }

3)现在我们可以在form1.cs中调整我们的方案来处理支付倍数(即使这从未真正发生过)

private void formButtonRace_Click(object sender, EventArgs e)
    {
        int winner = 0;
        int windog = 0;
        int count = 0;
        for (int i = 0; i < Bettors.Length; i++)
        {
            if (Bettors[1].MyBet != null)
            {
                count++;
            }
        }

        if (count == Bettors.Length)
        {
            while (winner == 0)
            {
                for (int i = 0; i < Dogs.Length; i++)
                {
                    if (Dogs[i].Run())
                    {
                        winner++;
                        windog = i + 1;
                        for (int i2 = 0; i2 < Bettors.Length; i2++)
                        {
                            Bettors[i2].Collect(i + 1);
                        }
                    }
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(3);
                }
            }
            if (winner > 1)
            {
                MessageBox.Show("Multiple winners!", "WOW");
            }
            else
            {
                MessageBox.Show("The winner was dog #" + windog);
            }
            for (int i = 0; i < Bettors.Length; i++)
            {
                Bettors[i].ClearBet(true);
            }
            for (int i = 0; i < Dogs.Length; i++)
            {
                Dogs[i].TakeStartingPosition();
            }
        }
        else
        {
            MessageBox.Show("Not all players have placed their bets!", "Wait wait!");
        }
    }

我的ClearBet传入bool的原因是因为如果按下重置按钮,我必须为每个Guy恢复下注。但是,如果比赛结束,我想重置它们而不返回投注。

这是我的代码中的那部分:

public void ClearBet(bool isRaceOver)
    {
        if (isRaceOver)
        // reset bet when race is over
        {
            MyBet = null;                
        }
        else
        {
            if (this.MyBet != null)
            {
                Cash += this.MyBet.Amount;
                this.MyBet = null;                 
            }
            else
            {
                this.MyBet = null;
            }                 
        }
        UpdateLabels();
    }

答案 3 :(得分:0)

在PlaceBet()方法中,您使用新的Label()覆盖MyLabel,因此表单上标签的原始上下文将丢失。

虽然您实际上正在更新标签,但它不是表单上的标签。

public bool PlaceBet(int Amount, int Dog)
        {
            this.MyBet = new Bet();

            if (Cash >= Amount)
            {
                Cash = Cash - Amount;
                MyLabel = new Label(); // remove this
                MyBet.Amount = Amount;
                MyBet.Dog = Dog;
                UpdateLabels();
                return true;
            }
            else
            {
                return false;
            }
        }