《Head First C#》小游戏 -赛狗日的理解

赛狗日是一个很简单的小游戏,我想总结一下自己对赛狗日游戏的理解,并不会将自己实现的全部代码搬运上来,只是提供思路,方便自己以后可以写出更加健壮且方便维护的代码。

游戏功能要求

人:每个开局都有一定的钱,他们会各自下注,在比赛开始之前可以随意下注,但是比赛开始,便不能更改。

赌场:每次下注至少5元,且每个人不能重复下注,赌场会检查他们是否有足够的钱下注。

下注:赢了可以自己下注的钱会翻倍收回,否则就会输掉这次的所有赌金。赌金要求最低不能低于5元,最高不能超过15元。

比赛:狗的比赛是随机。

我的思路

应该抽取出,那些应该可以形成对象,这些对象应该有什么能力。这样说可能会有些费解,所以不如设想一下,如果一个人要完成一个从下注->等待比赛结果->结算这样一个过程。
在这个过程中,哪些是方便成型的对象,首先是,下注的人,他方便抽取成一个对象。
public class Guy
{}
然后是用来比赛的狗。

public class Dog{}
那么结算应该如何算呢?如果还是没思路,不妨再细分一下,你有了下注的人,和用来下注的对象,也就是狗,现在你需要一个拥有结算功能的这样一个对象,这种对象大概有了方向以后,我们就给他命名为Beg,表示用来结算的对象

public class Beg{}
对象确定后,就有了大致的思路,现在我们需要给他们添加“标识”和“能力”,首先作为一个下注的人来说,他需要什么标识?第一个想到的是,名字,还有持有的钱,那么我们就先写上去,如果不对还可以再加或者修改。

public class Guy
{
  public string Name;
  public int Cash;
}
然后是能力,起码你需要会下注,这个是最先想到的,但是一说到下注,务必要谈及下注的狗和多少钱,那么这里就作为参数传递进去。可以下注是有要求的,有上限和下限,那么综合考虑,参数和返回值,返回值应该是一个bool了。

public class Guy
{
  public string Name;
  public int Cash;
  public bool PlaceBeg(int BegAmount,int DogToWin)
  { return false;}
}

我先将自己思路的代码贴上来,以免自己忘记

/// <summary>
    /// 狗
    /// </summary>
    public class Dog
    {
        public int StartingPosition; //开始的位置
        public int RacetrackLength; //跑道的长度
        public PictureBox MyPictureBox = null; //狗的图片
        public int Location = 0; //当前的位置
        public Random Randomizer;
        //用来生成狗的步长的随机数

        public bool Run()
        {
            //location 和 RacetrackLength 是否一样,如果一样, 那么就返回true
            //反之返回false
            /*
                如果那一只狗到了目的地,会返回一个信号,
             * 这个信号可以停止timer的运行,然后,讲最后的赢家传给结算Guy.Collect
             */

            return false;
        }
        public void TakeStatingPosition()
        { 
            //归零的方法
        }
    }

    /// <summary>
    /// 赌局的人
    /// </summary>
    public class Guy
    {
        public string Name;
        public Beg MyBeg;//倍率
        public int Cash;//我有多少钱

        //下面的是控制gui来获得界面上对哪一个狗下注
        public RadioButton MyRadioButton;
        public Label MyLabel;

        public void UpdateLabels()
        { 
            // MyLabel 等于赌注人的钱,用于更新标签
        }

        public void ClearBet() {
            //清空赔率
        }
        
        /// <summary>
        ///下注,如果下注的钱少于最低额度,那么就不能下注
        /// </summary>
        /// <param name="BetAmount"></param>
        /// <param name="DogToWin"></param>
        /// <returns></returns>
        public bool PlaceBet(int BetAmount, int DogToWin)
        {
            if (BetAmount < 5&&BetAmount>Cash) return false;
            MyBeg = new Beg { Amount=BetAmount,
                                Dog=DogToWin,
                                Bettor=this};
            return true;
        }

        /// <summary>
        /// 赛后结算
        /// </summary>
        /// <param name="Winner"></param>
        public void Collect(int Winner)
        { 
            //告诉我倍率情况,清空我的赔率,更新我的label
            /*
             传入赢的那只狗,然后对自己的beg对象,进行扣除或者奖励
             */
           Cash+=MyBeg.PayOut(Winner);
        }

    }

    /// <summary>
    /// 倍率
    /// </summary>
    public class Beg
    {
        public int Amount;//谁应该得的钱或者失去的钱
        public int Dog;//谁压的狗
        public Guy Bettor;//谁的赔率

        /// <summary>
        /// 得到比赛的结果,用文字表述
        /// </summary>
        /// <returns></returns>
        public string GetDescription()
        {
            if (Amount != 0)
            {
                return Bettor.Name + " 下注了 " + Dog + "号 狗 " + Amount + "$";
            }
            else
            {
                return Bettor.Name + "并没有下注";
            }
            
        }

        /// <summary>
        /// 对结果进行结算
        /// </summary>
        /// <param name="Winner"></param>
        /// <returns></returns>
        public int PayOut(int Winner)
        {
            if (Dog == Winner)
            {
                return Amount;
            }
            else
            {
                return -Amount;
            }
           
        }
    }
因为这个游戏需要用到图片,但是按照书上给的网址,登陆不上去,所以自己随便找了几张图凑合了下。

游戏虽小,但是是个锻炼的好机会,GUI的部分没有贴出来,下次再见。



猜你喜欢

转载自blog.csdn.net/CandyCCCation/article/details/79048729
今日推荐