本文是對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
}
}