程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#網絡版斗地主——出牌權限的傳遞(1)

C#網絡版斗地主——出牌權限的傳遞(1)

編輯:關於C語言

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved