javascript - 二十一点荷官 AI 中的非工作嵌套循环

标签 javascript infinite-loop nested-loops

我正在寻找有关经销商 AI 上的 javascript 功能的建议,该功能相当简单且不言自明,并且遵守既定的规则集。该代码是通过单独的软值和硬值计算器来实现的,一旦抽出一张牌就会发生,以便在 GUI 游戏框架中呈现可访问的两个值。

关键目的是,一旦庄家的牌数未能超过 17 点,就将其连续添加到庄家手中,并在满足这些先决条件时打破获胜条件函数的循环。使用a<4for循环有点随机,因为其他解决方案被拒绝。

之前的实验

  1. While 循环。结果产生了无限循环死胡同。

  2. GOTO 项目的夏天。完整版和迷你版都在编译器上返回了错误。

感知到的问题

尽管这两个值在通过 dealerStrategy 后都会更新函数(在继续命令之前使用 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);
}

最佳答案

dealerStrategy 中,您传入 dSdH 并使用它们来确定行为。当您在循环中抽出额外的牌时,dSdH 的值永远不会更新,因此无论您抽出什么牌,下一个循环的行为都将是与第一个相同。

关于javascript - 二十一点荷官 AI 中的非工作嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29732103/

相关文章:

javascript - 如何通过嵌入将父指令属性值传递到子指令范围?

javascript - querySelectorAll 获取下拉列表的选定值

javascript - 莫里斯图表不适用于 ajax 返回的数据

javascript - 无法检测JS中 'while loop'无限循环的原因

java - 我的嵌套 for 循环没有执行,我不知道为什么

javascript - 通过链接方法自定义指令解释。如何?

C++ 程序,输入无限循环

java - 使用推土机进行集合映射时无限循环

java - 嵌套循环内递增

foreach - 嵌套递增 foreach 循环