2013-03-23 24 views
0

我是新来的动作3.0,我试图做一副牌洗牌,我已经成功了这个,但我的问题是,我的牌正在重复,所以我有52张牌的同一张牌的副本洗牌。我正在尝试创建一个德州扑克游戏。actionscript 3.0如何将算法合并到我的代码中?

我发现这个讨论Randomize or shuffle an array但它并没有告诉我如何将Fisher-Yates算法合并到我的代码中。我已经尝试了几种不同的方法,这里提出了一些建议,以及在网络上的什么地方,没有任何工作(认为这个问题肯定是我缺乏经验)。

有人可以请给我一个如何将其纳入我的代码或链接到某个地方,将解释如何正确地做到这一点的例子。

在此先感谢。

保罗

package src.CardDeck 
{ 
    public class CardDeck 
    { 
     public var allCards:Array = []; 
     public var cardNames:Array; 
     public var cardValues:Array; 
     public var gameType:String; 
     public var drawnCards:uint = 0; 

     public function CardDeck(game:String) 
     { 
      gameType = game; 
      cardNames = ["Ace","Two","Three", 
         "Four","Five","Six", 
         "Seven","Eight","Nine", 
         "Ten","Jack","Queen","King"]; 
      if(gameType == "texasholdem") 
      { 
       cardValues = [1,2,3,4,5,6,7,8,9,10,10,10,10]; 
      } 
      makeSuit("Spade"); 
      makeSuit("Heart"); 
      makeSuit("Diamond"); 
      makeSuit("Club"); 
     } 

     private function makeSuit(suitString:String):void 
     { 
      var card:Object; 

      for(var i:uint = 0; i < cardNames.length; i++) 
      { 
       card = {}; 
       card.cardType = suitString; 
       card.cardName = cardNames[i]; 
       card.cardValue = cardValues[i]; 
       card.isDrawn = false; 
       allCards.push(card); 
      } 
     } 

     public function shuffle():Array 
     { 
      var shuffledArray:Array = [allCards.length]; 
      var randomCard:Object; 
      do 
      { 
       randomCard = getRandomCard(); 
       if(shuffledArray.indexOf(randomCard) == -1) 
       { 
        shuffledArray.push(randomCard); 
       } 
      } 
      while(shuffledArray.length < allCards.length) 
       return shuffledArray; 
     } 

     private function getRandomCard():Object 
     { 
      var randomIndex:int = Math.floor(Math.random()* allCards.length); 
      return allCards[randomIndex]; 
     } 
    } 
} 
+0

你的问题必须有数组,洗牌术语? – 2013-03-28 04:41:22

回答

5

错误注:

var shuffledArray:Array = [allCards.length]; 

使具有单个元件的阵列,其shuffledArray [0] = allCards.length。 其实你并不需要预先分配它只是说:

var shuffledArray: Array = []; 

这是经典的费雪耶茨版本:

public function shuffleFisherYates():Array { 
var shuffledArray:Array = []; 
var randomCardIndex: int; 
    do { 
     randomCardIndex = Math.floor(Math.random()* allCards.length); 
     shuffledArray.push(allCards[randomCardIndex]); // add to mix 
     allCards.splice(randomCardIndex,1); // remove from deck 
    }while(allCards.length); // Meaning while allCards.length != 0 
    return shuffledArray; 
} 

这里是Durstenfeld的(代替)版本:

public function shuffleDurstenfeld():Array { 
var swap:Object; 
var countdown:int = allCards.length-1; 
var randomCardIndex: int; 
    for(i = countdown; i > 0; i--){ 
     randomCardIndex = Math.floor(Math.random()* countdown); 
     swap = allCards[countdown]; 
     allCards[countdown] = allCards[randomCardIndex]; 
     allCards[randomCardIndex]= swap; 
    } 
    return allCards; // shuffled in place 
} 
+0

+很好。很好的示范Fisheryates和Durstenfeld – Baba 2013-04-25 10:16:06

0

假设你的洗牌代码没问题,我认为你看到重复卡片的原因是,在你的getRandomCard()方法中,你没有考虑拥有被绘制。你随机生成一个索引并将数组返回到数组中......但是该数组仍然在数组中,并且可能会再次随机生成相同的索引,从而导致返回相同的卡。

+0

我有很长的路要走,去学习面向对象。非常感谢lhsan现在编译没有错误,但你可以快速浏览http://stackoverflow.com/questions/15593171/1120-access-of-undefined-property-shuffledarray。感谢mitim洗牌没有错误,但我仍然在学习,所以你可以分解我的感谢。 – user2203250 2013-03-23 23:14:53

+0

你可以不用重复画卡片吗?还是原来的问题还存在? – mitim 2013-03-23 23:34:25

+0

在上面链接的其他问题中查看您的代码,看起来您正在洗牌工作(我自己快速查看了它)。我的原始答案意思是说你有一副牌,你想通过从1到52之间选择一个随机数来绘制一张牌。你这样做,但你只是在你的getRandomCard中检查那个牌的牌( ) 方法。你实际上并没有移除那张牌,以任何方式表明它已被抽到甲板上。因此,如果您碰巧再次选择相同的数字(可以通过Math.random()),您将得到相同的卡片结果。 – mitim 2013-03-23 23:47:57

相关问题