C#网络版斗地主——出牌权限的传递
2009-06-08 08:32:26 来源:WEB开发网本文是对C#网络版斗地主的开发总结。
出牌顺序如上图所示。
出牌权限可以用一个bool值表示
在Player类中,有一个属性:haveOrder表示玩家是否有权限出牌。
还需要考虑到一点,当一个玩家出牌后,其他玩家都要不起(pass),该玩家不能自己“要不起”自己,所以还需要一个bool类型的属性“IsBiggest”。
该属性表示自己出的牌最大。怎样保证该值的有效性呢?换句话说,最大的只能有一个。所以,每当自己出牌的时候,只要自己的牌比别人的牌大,就把该值设置为true。当该值为true时,向其他玩家发送信息表明自己的牌比你们的大,其他玩家收到信息后,把自己的IsBiggest属性设置为false;如此一来,就实现了出牌权限的正确传递。
具体实现方法如下:
本文需要Player类中的一些代码:
private bool _haveOrder;
public bool haveOrder
{
get
{
return _haveOrder;
}
set
{
_haveOrder = value;
}
}
private bool _isBiggest;
public bool isBiggest //
{
get
{
return _isBiggest;
}
set
{
if (value)//给IsBiggest赋值true时
{
if (DConsole.client != null) //当玩家为客户端时
{
DConsole.client.SendDataForServer("IamIsBiggest");//服务器这边是怎么处理的呢?请看下文.
_isBiggest = value;
}
if (DConsole.server != null)//如果玩家为服务器
{
DConsole.server.SendDataForClient("NoBiggest", 1);
DConsole.server.SendDataForClient("NoBiggest", 2);//告诉客户端,你不是Biggest,客户端如何处理?请看下文
_isBiggest = value;
}
}
else
{
_isBiggest = value;
}
}
}
public bool lead()//出牌方法
{
DConsole.leadPokers = leadPokers;
this.leadPokers.Clear();
foreach (int selectPoker in this.selectPokers) //迭代循环把已选中的牌添加到leadPokers
{
this.leadPokers.Add(this.pokers[selectPoker]);
}//以上代码是将选中的牌构造成一个PokerGroup对象
if (DConsole.IsRules(this.leadPokers))//验证选中的牌是否符合游戏规则,关于规则在以后的文章中详细讲解
{
if (DConsole.player1.isBiggest || DConsole.leadPokers > DConsole.leadedPokerGroups[DConsole.leadedPokerGroups.Count-1]) //玩家能出牌的两种情况是1、自己上轮出的牌是最大的,别人都要不起。2、自己本轮出的牌比别人的大。
{
if (DConsole.leadPokers.type == PokerGroupType.炸弹)//当牌组的类型为炸弹时,翻倍
{
DConsole.multiple *= 2;
}
if (DConsole.leadPokers.type == PokerGroupType.双王) //当牌组的类型为双王时,翻三倍
{
DConsole.multiple *= 3;
}
DConsole.player1.isBiggest = true;//只要自己的牌出出去了,就假设自己是最大的,一旦自己的牌被别人管上,就会被设置为false,具体请看下文
this.BakPoker(); //备份现有pokers,下次出牌时需要用到
foreach (int selectPoker in this.selectPokers) //在pokers里移除已经出过的牌
{
this.pokers.Remove(this.bakPokers[selectPoker]);
}
this.selectPokers.Clear(); //清空已选牌
return true;
}
else
{
this.leadPokers.Clear();
return false; //牌组比别人小就返回false
}
}
else
{
this.leadPokers.Clear();
return false; //不符合规则就返回false
}
}
更多精彩
赞助商链接