您的位置:首页 > 其它

万恶的中介

2016-01-08 14:01 127 查看
/// <summary>
/// 中介者模式 斗地主
/// </summary>
using System.Collections.Generic;

#region 主程序
public class 斗地主
{
ParterA pa = new ParterA();
ParterB pb = new ParterB();
ParterC pc = new ParterC();
ParterD pd = new ParterD();
ParterE pe = new ParterE();
ParterF pf = new ParterF();
public void Main()
{
//创建牌局
var mediator = new Mediator();
//加入玩家
mediator.Register(pa);
mediator.Register(pb);
mediator.Register(pc);
//开始游戏(发牌)
mediator.Start();
//抢地主
mediator.GrabLandowner(pa);
mediator.GrabLandowner(pc);
mediator.Win();
//结束

mediator.UnRegister(pb);
mediator.Register(pd);
mediator.Start();
mediator.GrabLandowner(pc);
mediator.Fall();

mediator.Register(pe);
mediator.Start();
mediator.GrabLandowner(pa);
mediator.Win();

mediator.UnRegister(pa);
mediator.Register(pf);
mediator.Start();
mediator.GrabLandowner(pf);
mediator.Win();

mediator.Start();
mediator.GrabLandowner(pf);
mediator.Win();
}
}
#endregion

/// <summary>
/// 一个牌局 (中介者)
/// </summary>
public class Mediator
{
private decimal count = 0;

/// <summary>
/// 份子钱
/// </summary>
private decimal persend = 100;

private List<Parter> parters = new List<Parter>();

private bool statu = false;

private Parter 地主 = null;

private int baseCount = 1000;

private int multiple = 1;

//参与人数
private int LimitParters = 3;

/// <summary>
/// 是否可以开始
/// </summary>
public bool CanStart
{
get { return this.parters.Count == this.LimitParters; }
}

/// <summary>
/// 倍率
/// </summary>
public int Multiple
{
get { return this.multiple; }
}

/// <summary>
/// 加入
/// </summary>
/// <param name="part"></param>
public bool Register(Parter part)
{
//已开始 不能进
if (this.statu) return false;
//人够了 不能进
if (this.CanStart) return false;
//没钱了 不能进
if (part.Count <= 0) return false;
this.parters.Add(part);
return true;
}

/// <summary>
/// 退出
/// </summary>
/// <param name="part"></param>
public bool UnRegister(Parter part)
{
//已开始 不能退
if (this.statu) return false;
this.parters.Remove(part);
return true;
}

/// <summary>
/// 地主赢
/// </summary>
public bool Win()
{
//未开始 不能操作
if (!statu) return false;
foreach (var parter in parters)
{
if (this.地主 == parter)
{
parter.Win(baseCount * (parters.Count - 1) * multiple);
}
else
{
parter.Fall(baseCount * multiple);
}
}
this.End();
return true;
}

/// <summary>
/// 地主输
/// </summary>
public bool Fall()
{
//未开始 不能操作
if (!this.statu) return false;
foreach (var parter in parters)
{
if (this.地主 == parter)
{
parter.Fall(this.baseCount * this.multiple * (parters.Count - 1));
}
else
{
parter.Win(this.baseCount * this.multiple);
}
}
this.End();
return true;
}

/// <summary>
/// 抢地主 每抢一次倍率翻倍
/// </summary>
/// <param name="part"></param>
public bool GrabLandowner(Parter part)
{
if (!this.statu) return false;
multiple = this.地主 == null ? 1 : multiple * 2;
this.地主 = part;
return true;
}

/// <summary>
/// 开始牌局
/// </summary>
public bool Start()
{
//不满足开始条件 不能开始
if (!this.CanStart) return false;
this.multiple = 1;
this.statu = true;
this.地主 = null;
foreach (var part in parters) {
part.Place(persend);
count += persend;
}
return true;
}

/// <summary>
/// 结束牌局
/// </summary>
public void End()
{
this.statu = false;
//检查用户状态
for (var i = 0; i < parters.Count; i++)
{
if (parters[i].Count <= 0)
{
//没钱了 踢出游戏
this.UnRegister(parters[i]);
i--;
}
}
}
}

/// <summary>
/// 玩家
/// </summary>
public class Parter
{
/// <summary>
/// 玩家初始金额
/// </summary>
private decimal count = 5000;

public decimal Count { get { return count; } }

/// <summary>
/// 游戏局数
/// </summary>
private int times = 0;

public void Win(decimal count)
{
this.count += count;
}
public void Fall(decimal count)
{
this.count -= count;
}

/// <summary>
/// 场地费
/// </summary>
/// <param name="count"></param>
public void Place(decimal count)
{
times++;
this.count -= count;
}
}

#region 用户们
public class ParterA : Parter
{
}

public class ParterB : Parter
{
}

public class ParterC : Parter
{
}

public class ParterD : Parter
{
}

public class ParterE : Parter
{
}

public class ParterF : Parter
{
}
#endregion
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: