二十一点经销商AI中的非工作嵌套循环

时间:2015-04-19 15:51:04

标签: javascript infinite-loop nested-loops

我在经销商的AI上寻找关于我的javascript功能的建议,这是相当简单和不言自明的,并且遵守既定的规则集。代码是使用单独的软值和硬值计算器实现的 - 一旦绘制卡就会发生,以便在GUI游戏性框架内呈现这两个值。

关键目的是在经销商的手牌未能超过17并且在满足这些先决条件的情况下将循环打到获胜状态函数时连续添加牌。在a<4循环中使用for是随机的,因为其他解决方案被拒绝了。

以前的实验

  1. while循环。结果是产生一个无限循环死胡同。

  2. SummerOfGOTOProject。完整版和迷你版都在编译器上返回了错误。

  3. 感知问题

    尽管这两个值在通过dealerStrategy函数后都会更新(在使用continue命令之前使用console.log提取信息后确认),但由于某些奇怪的原因,新卡片正在添加到经销商处。用手忽略其他回路部件上的兼容条件。

    var dealerValue = {initial: 0, soft: 0, hard: 0};
    var dealerCards = [];
    var playerValue = {initial: 0, soft: 0, hard: 0};
    var playerCards = [];
    var firstDeck = [];
    var origValue = 0;
    
    function shuffle(o) {
      for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
      return o;
    }
    
    function createShuffledDeckNumber(array, x) { 
      for (var i = 0; i < 4*x; i++) {
      array.push(1,2,3,4,5,6,7,8,9,10,11,12,13);
       } 
      shuffle(array);
    }
    
    function checkDeckDrawOneDealer() {
      if (firstDeck.length === 0) {
        createShuffledDeckNumber(firstDeck, 1);//Creates a number of normal shuffled decks.
        dealerCards.push(firstDeck[0]);
        dealerValue.soft = calculateHand(firstDeck[0], dealerValue.soft, 0);
        dealerValue.hard = calculateHand(firstDeck[0], dealerValue.hard, 1);
        firstDeck.shift();
    
      }else{
        dealerCards.push(firstDeck[0]);
        dealerValue.soft = calculateHand(firstDeck[0], dealerValue.soft, 0);
        dealerValue.hard = calculateHand(firstDeck[0], dealerValue.hard, 1);
        firstDeck.shift();
      }
    }
    
    function dealerStrategy(dS, dH) {
      for (var a = 0; a < 3; a++){  
        if (dH == dS) {
          if (dH >= 17 && dH <= 21) {break;}
          else if (dH < 17) {checkDeckDrawOneDealer(); continue;}
          else if (dH > 21) {break;}
        }
        else if (dH < dS) {
          if (dS <= 21) {
            if (dS >= 17 && dS <= 21) {break;}
            else if (dS < 17) {checkDeckDrawOneDealer(); continue;}
          }
          else if (dS > 21) {
            if (dH >= 17 && dH <= 21) {break;}
            else if (dH < 17) {checkDeckDrawOneDealer(); continue;}
            else if (dH > 21) {break;}
          }
        }
      }
    }
    
    for (i = 0; i < 5; i++) {
      console.log(i);
      dealerCards = [];
      dealerValue.soft = 0;
      dealerValue.hard = 0;
      checkDeckDrawOneDealer();
      checkDeckDrawOneDealer(); 
      dealerStrategy(dealerValue.soft, dealerValue.hard, playerValue.soft, playerValue.hard); 
      console.log("dealerCards",dealerCards);
      console.log("dS:", dealerValue.soft,"dH:", dealerValue.hard);
    }
    

1 个答案:

答案 0 :(得分:1)

dealerStrategy中,您传递dSdH并使用它们来确定行为。当您在循环中绘制其他卡时,dSdH的值永远不会更新,因此无论您绘制什么卡,下一循环的行为都将与第一个相同。< / p>