赛狗日是一个很简单的小游戏,我想总结一下自己对赛狗日游戏的理解,并不会将自己实现的全部代码搬运上来,只是提供思路,方便自己以后可以写出更加健壮且方便维护的代码。
游戏功能要求
人:每个开局都有一定的钱,他们会各自下注,在比赛开始之前可以随意下注,但是比赛开始,便不能更改。
赌场:每次下注至少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的部分没有贴出来,下次再见。