Head First C#(赛狗日)

实验背景:

 

人:Joe、Bob和AI希望参见赛狗赌博。最初,Joe有50元,Bob有75元,AI有45元。每次比赛前,他们都会各自决定是否下注以及所押的赌金。直到比赛前,他们都可以改变赌金,但是一旦比赛开始,赌金就再不能更改了。

 

赌场:赌场会跟踪每个人持有的现金,以及每个人下注的对象。每次下注至少5元。一场比赛中,赌场对每个人只取一次赌金;也就是说每个人不得重复下注。赌场会检查下注的人确实有足够的现金支付他的赌金,所以如果没有钱来作赌资这个人就不能下注。

 

下注:每次下注都会“翻倍或全陪”,要求最低5元,而且每个人对一只狗最多下注15元。

 

比赛:有4只狗在直道上比赛。比赛胜者是第一只穿过终点线的狗。

 

书中给出的作为参考的类图:

根据这些类图得到如下代码:

namespace 赛狗日
{
    public partial class frmDogRace : Form
    {
        private Guy[] guys;//人物类集合
        private Greyhound[] greyhounds;//狗类集合

        public frmDogRace()
        {
            InitializeComponent();

            greyhounds = new Greyhound[]
           {
               new Greyhound(picDog1){Index=1},
               new Greyhound(picDog2){Index =2},
               new Greyhound(picDog3){Index =3},
               new Greyhound(picDog4){Index=4},
           };

            guys = new Guy[]
            {
             new Guy(){ Name="Joe", Cash=50, MyRadioButton=rad0,MyLabel=labJoe},
             new Guy(){ Name="Bob", Cash=75, MyRadioButton=rad1,MyLabel=labBob},
             new Guy(){ Name="AI", Cash=45,MyRadioButton=rad2,MyLabel=labAI},
            };

            InitialForm();
        }

        /// <summary>
        /// 初始化数据
        /// </summary>
        public void InitialForm()
        {
            foreach (Guy guy in guys)
            {
                guy.ClearBet();
                guy.UpdateRadio();
            }
        }

        private void radJoe_Click(object sender, EventArgs e)
        {
            labName.Text = ((RadioButton)sender).Tag.ToString();
            labName.Tag = ((RadioButton)sender).Name.ToString().Substring(((RadioButton)sender).Name.ToString().Length-1, 1);
        }

        private void btnBets_Click(object sender, EventArgs e)
        {
            int i=int.Parse( labName.Tag.ToString());
            Guy guy = guys[i];
            if (!guy.PlaceBet(int.Parse(numAmount.Value.ToString()), int.Parse(numDog.Value.ToString())))
            { MessageBox.Show(guy.Name+"赌金不足,无法下注","提示"); }
        }

        private void btnRun_Click(object sender, EventArgs e)
        {
            //比赛开始后将不能下注
            btnBets.Enabled = false;
            while (true)
            {
                foreach (Greyhound greyhound in greyhounds)
                {
                    if (greyhound.Run())
                    {
                        MessageBox.Show(greyhound.Index.ToString() + "号猎犬赢得比赛!");
                        EndRace(greyhound.Index);
                        return;
                    }
                    else
                    {
                        //暂停循环,刷新窗体
                        Application.DoEvents(); 
                    }
                }
            }
        }

        /// <summary>
        /// 比赛结束需要进行的操作
        /// </summary>
        private void EndRace(int Winner)
        {
            foreach (Greyhound greyhound in greyhounds)
            {
                greyhound.TakeStartingPosition();           
            }
            foreach (Guy guy in guys)
            {
                guy.Collect(Winner);
            }
            btnBets.Enabled = true;
        }
    }

    /// <summary>
    /// 狗类
    /// </summary>
    public class Greyhound
    {
        public int Index;//狗的号码
        public int StartingPosition =25;//图片起始坐标
        public int RacetrackLength = 455;//路程
        public PictureBox MyPictureBox;//图片控件
        public int Location = 0;//以完成路程
        public Random Randomizer;//速度随即生成变量

        public Greyhound(PictureBox picturebox)
        {
            this.MyPictureBox = picturebox;
        }

        /// <summary>
        /// 狗开始跑
        /// </summary>
        /// <returns>是否获得第一</returns>
        public bool Run()
        {
            Randomizer = new Random();
            int speed = Randomizer.Next(1,20);
            Point p = MyPictureBox.Location;
            p.X += speed;
            Location += speed;
            System.Threading.Thread.Sleep(100);
            MyPictureBox.Location = p;
            if (Location >= RacetrackLength)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 回复原位
        /// </summary>
        public void TakeStartingPosition()
        {
            this.MyPictureBox.Location = new Point(this.StartingPosition,MyPictureBox.Location.Y);
            this.Location = 0;
        }
    }

    /// <summary>
    /// 人物类
    /// </summary>
    public class Guy
    {
        public string Name;//姓名
        public Bet Mybet=new Bet ();//赌注信息
        public int Cash;//剩余现金

        public RadioButton MyRadioButton;
        public Label MyLabel;

        /// <summary>
        /// 下注更新显示信息
        /// </summary>
        public void UpdateRadio()
        {
            MyRadioButton.Text = string.Format("{0} has {1} bucks",this.Name,this.Cash.ToString());
        }

        /// <summary>
        /// 重置赌注为0
        /// </summary>
        public void ClearBet()
        {
            MyLabel.Text=string.Format("{0} has't placed a bet",this.Name);
            Mybet.Amout = 0;
        }

        /// <summary>
        /// 下注
        /// </summary>
        public bool PlaceBet(int Amout, int Dog)
        {
            if (Amout > this.Cash)
                return false;
            this.Mybet.Amout = Amout;
            this.Mybet.Dog = Dog;
            this.Mybet.Bettor = this;
            MyLabel.Text= Mybet.GetDescription();
            return true;
        }

        /// <summary>
        /// 清算结果
        /// </summary>
        public void Collect(int Winner)
        {
            this.Cash += this.Mybet.PayOut(Winner);
            UpdateRadio();
            ClearBet();
        }
    }

    /// <summary>
    /// 赌注类
    /// </summary>
    public class Bet
    {
        public int Amout;//下注数量
        public int Dog;//猜哪只狗
        public Guy Bettor;//下注者

        /// <summary>
        /// 获得下注信息
        /// </summary>
        public string GetDescription()
        {
            return Bettor.Name + " bets " + Amout.ToString() + " bucks on dog #" + Dog.ToString();
        }

        /// <summary>
        /// 清算赛跑结果
        /// </summary>
        public int PayOut(int Winner)
        {
            if (Winner == Dog)
            {
                return Amout;
            }
            else
                return -Amout;
        }
    }   
}


最后得到的软件运行效果图如下:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 《Head First C》是一本由大卫·格里芬(David Griffiths)和保罗·巴里(Paul Barry)合著的C语言编程入门教程。与一般的编程书籍不同,《Head First C》尝试采用非传统的、有趣的方式来阐述C语言编程基础,使初学者能够更容易地理解和掌握这门语言。 该书内容涵盖了C语言的基本语法、数据类型、运算符、控制结构、函数、数组等方面的知识。在讲解这些知识点时,书中采用了许多大量图解、示例代码、练习题等形式,帮助读者更深入地了解和掌握编程的基本概念和技巧。 此外,《Head First C》还介绍了一些编程的最佳实践,如调试技巧、内存管理等方面的知识,以及如何使用C语言编写程序中的常见问题。这些内容对于初学者来说非常有用,可以帮助他们在编程中更加规范和高效。 总而言之,《Head First C》是一本非常适合初学者入门的C语言编程书籍。它不仅讲解全面,而且内容有趣,对于初学者来说既易于理解又容易上手。如果你想要学习C语言编程,并且想要找一本好的入门书籍,那么《Head First C》肯定是一本值得推荐的书籍。 ### 回答2: 《Head First C》是一本由MIT学院和耶鲁大学教育背景的作者所编写的C语言学习教材,旨在通过生动有趣的图表、插图、问题和实践展示C语言的基础。这本书的特点是利用了大量的视觉元素,其中包括强调、颜色和图标,以吸引读者的注意力和加强记忆。作者通过讲解文字和图片,以及需要学习的主要工具和技术,帮助读者理解C语言的重点概念、语法和数据类型,同时提供了较丰富的示例代码以供实践。 《Head First C》不仅适用于初学者学习C语言,同时也适合有一定经验的开发人员用于回顾和提高技能。本书分为15章,涵盖了从C语言的基础知识到高级主题的内容。其中也包括了大量真实世界中的示例,使读者了解在实际应用中如何利用C语言编写程序。通过本书的学习,读者将可以系统性地学习C语言,丰富自己的编程经验,提高自己的编程技能。 总之,《Head First C》是本富有启发性和诙谐幽默的学习教材,可以帮助读者快乐地学习C语言,同时学到一些有趣的编程技巧,成为优秀的程序员。 ### 回答3: Head First C是一本面向初学者的C语言学习指南,由Kathy Sierra和Bert Bates撰写而成。它以一种简单易懂且生动有趣的方式,引导读者了解C语言的核心概念和基础知识,并提供了丰富的实例和练习,帮助读者增强对C语言的理解和掌握。 本书被广泛认为是一本优秀的教学材料,其中融入了最新的教学技巧和原则。相对于传统的教材,Head First C通过图表、概念映射和故事情节等手段来讲解C语言,以便更深入、更生动地吸引读者。 其重点涵盖了C语言的基础语法、数据类型、指针、函数等各个方面。此外,Head First C还指导读者使用GCC编译器、调试程序和阅读C代码的能力,这些对于日后的编程工作非常重要。 总的来说,Head First C是一本适合所有想要深入了解C语言的读者的好书,既可以作为日常学习的参考,也可以作为初次学习编程的工具书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值