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

Non-working nested loop in blackjack dealer AI

我正在寻找有关我在经销商 AI 上的 javascript 功能的建议,该功能相当简单且不言自明,并且遵守既定规则集。该代码是通过单独的软硬值计算器实现的——在抽取卡片后计算,以便在 GUI 游戏框架内呈现这两个值。

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

以前的实验

  1. While 循环。结果产生了死循环。

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

感知到的问题

虽然这两个值在通过 dealerStrategy 函数后都会更新(在继续命令之前使用 console.log 提取信息后确认),但由于某些奇怪的原因,新牌被添加到经销商的hand 忽略满足其他循环部分的兼容条件。

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 的值永远不会更新,因此无论您绘制什么卡片,下一个循环的行为将与第一个相同。