紮金花 遊戲開發細節與部分代碼

來源:互聯網
上載者:User

紮金花 遊戲開發細節與部分代碼,鬥地主遊戲中的牌型很多,演算法也各有不同,但我總覺得網上一些通用的演算法有點鋪天蓋地,所以,我決定自己來重新想一下演算法,總的來說,無論你出什麼處於,三帶二,炸,4帶一等,你總是有個主牌的,從牌只認張數,大小是無所謂的,所以,我將主牌清點出來應該就只有 對子,3條,炸彈,雙王,順子這五類,所以,在發牌或者拿到底牌後,我們直接將所有的主牌類型清理出來即可。

這是我希望開發的第一個紙牌類遊戲,鬥地主本身來說是一個有限使用者的回合制遊戲,核心邏輯與棋類遊戲並無多大的不同,但是因為並無多大的行棋演算法,所以位置顯得不那麼的重要。所以我決定還是用開發四國軍棋形成的flexchessapi來開發這個遊戲,如果flexchessapi不能勝任這個工作,我會考慮形成一個通用的flexcardapi來開發這個遊戲。這樣,我就能利用flexcardapi開發更多的遊戲,比如詐金花等。紮金花

核心邏輯開發完成後效果

 

好了,現在我們開始設計一些紙牌類的一般邏輯思考,放在一個靜態類如CardHelp.as中。。

1) 設計一幅牌 紮金花

我們對一幅牌的每一張牌應該給定一個值,每個值包括花色與本身的大小,這樣,我們就以一個3位元的值來代表一張牌,比如303代表紅花3,414代表黑桃A,這樣,我們就能夠設計出一幅牌的完整數組,不同的牌需要的完整數不同,比如紮金花是不要王,鬥地主是要王的,現在,我們設計一幅牌。

/**
   *鬥地主帶王的一幅完整的牌 
   * 在鬥地主中,2是比A還大的牌,我們不能叫102,就叫115吧。
   */  
  public static const CARDS_WITH_JOKER:Array=[115,103,104,105,106,107,108,109,110,111,112,113,114,215,203,204,205,206,207,208,209,210,211,212,213,214,315,303,304,305,306,307,308,309,310,311,312,313,314,415,403,404,405,406,407,408,409,410,411,412,413,414,518,519];

  /**
   *紮金花不帶王的一幅完整的牌
   */  
  public static const CARDS_NO_JOKER:Array=[102,103,104,105,106,107,108,109,110,111,112,113,114,202,203,204,205,206,207,208,209,210,211,212,213,214,302,303,304,305,306,307,308,309,310,311,312,313,314,402,403,404,405,406,407,408,409,410,411,412,413,414];

設計兩個協助方法

/**
   *獲得特定處於的花色
   * @param card
   * @return
   *
   */  
  public static function getHuaShe(value:int):int{
   return Math.floor(value/100);
  }
  /**
   * 獲得特定牌的原始值
   * @param card
   * @return
   *
   */  
  public static function getPureValue(value:int):int{
   return value%100;
  }

2)牌有了,我們開始設計一個發牌的函數

2.1)發一張牌,發牌函數相對比較簡單,直接從一幅牌的數組中取一張即可,注意的是,取完後應該將該牌刪除,以免下次再發一樣的牌。

/**
   * 獲得牌組中一張隨機的牌值
   * @param cards
   * @return
   *
   */  
  public static function getRadomCard(cards:ArrayCollection):int{
   if (cards.length==0) return -1;
   var key:int=Math.round(Math.random()*(cards.length-1));
   return cards.removeItemAt(key) as int;
  }

2.2)發一手牌,對鬥地主來說,一手牌就是17張,最後的三張就是底牌,在發牌的時候,我們考慮的是給牌排序,這樣,發完牌後就自動從大到小排列。

/**
   * 獲得一個隨機的一手牌。
   * @param cards 全部牌
   * @param num 牌的數量
   * @param sort 是否排序 紮金花
   * @return
   *
   */  
  public static function getRadomCards(cards:ArrayCollection,num:int,sort:Boolean=true):ArrayCollection{

   var temp:ArrayCollection=new ArrayCollection();
   do{
    var cardvalue:int=getRadomCard(cards);
    trace("產生牌:"+getDisplayName(cardvalue));
    if (!sort)
     temp.addItem(cardvalue);
    else
    {
     var added:Boolean=false;
     for (var i:int=0;i<temp.length;i++)
     {
      var value:int=temp.getItemAt(i) as int;
      if (cardvalue%100>value%100)
      {
       temp.addItemAt(cardvalue,i);
       added=true;
       break;
      }
     }
     if (!added)
     {
      temp.addItemAt(cardvalue,i);
     }
    }
    num--;
   }while(num>0);
   trace("排序後:"+temp.toString());
   return temp;
  }

3)進入鬥地主的邏輯,我們現在設計一個通用類叫 DoudizhuHelp.as。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.