【问题标题】:Blackjack javascript game infinite loop二十一点 javascript 游戏无限循环
【发布时间】:2015-06-18 18:08:33
【问题描述】:

我创建了一个非常简单的二十一点游戏,它将洗牌数组的第一个值存储到相应玩家的数组中,将它们作为实际手牌处理。出于某种奇怪的原因,我似乎无法找到一种方法来多次执行代码的核心部分而不会出现无限循环。目前,我只尝试运行用于多个语句的相当常见的“for”命令,但在这里似乎不起作用。

原始形式的程序如下...

var dealerCards = [];
var playerCards = [];
var firstDeck = [];

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 (i = 0; i < 4*x; i++) {
  array.push(1,2,3,4,5,6,7,8,9,10,11,12,13);
   } 
  shuffle(array);
}

function drawCard(playersHand, playerSoft, playerHard) {
  playersHand.push(firstDeck[0]);
  firstDeck.shift();
}

function checkDeckDrawOne(playersHand) {
  if (firstDeck.length === 0) {
    createShuffledDeckNumber(firstDeck, 1);
    drawCard(playersHand);
  }else{
    for (i = 0; i < 1; i++) {
      drawCard(playersHand);
    }
  }
}

for (i = 0; i < 4; i++) {
dealerCards = [];
playerCards = [];
checkDeckDrawOne(dealerCards);
checkDeckDrawOne(dealerCards); 
checkDeckDrawOne(playerCards);
checkDeckDrawOne(playerCards);
console.log("dealerCards",dealerCards,"playerCards",playerCards);
console.log("firstDeckDrawn", firstDeck, "Number", firstDeck.length);
}

附加说明;

假定的目标可能是执行计算,通过根据每个玩家数组中存储的有限数量的值模拟连续计算轮次的效果来找出获胜者。虽然,在模拟实际玩二十一点的真实生活环境时,我尝试了一系列不同的事情,但这个版本似乎就是这样做的,它还让程序员能够引入像 KO 或 HiLo 这样的计数系统。整个事情背后的主要逻辑相当简单;每当执行涉及抓牌的命令时,都会订购 x 洗牌的牌组,除非牌组至少有一张牌。

思考我为什么要费心在这样的游戏中创建多个回合是相当公平的。原因是,我想创建一个自动播放器应用程序,为我提供已处理数据的百分比。

【问题讨论】:

  • 可以加个小提琴

标签: javascript arrays loops blackjack


【解决方案1】:

您在函数 checkDeckDrawOne() 中的变量 i 具有全局范围,这意味着它会更改主循环中 i 的值:

for (i = 0; i < 4; i++) {
dealerCards = [];
playerCards = [];
checkDeckDrawOne(dealerCards);
checkDeckDrawOne(dealerCards); 
checkDeckDrawOne(playerCards);
checkDeckDrawOne(playerCards);
console.log("dealerCards",dealerCards,"playerCards",playerCards);
console.log("firstDeckDrawn", firstDeck, "Number", firstDeck.length);
}

改变这个:

for (i = 0; i < 1; i++) {
  drawCard(playersHand);
}

到这里:

for (var i = 0; i < 1; i++) {
  drawCard(playersHand);
}

虽然你为什么在这里需要一个循环是令人费解的。

【讨论】:

  • 你说得对,我在那里不需要。原来我正在尝试绘制多张卡片,但由于卡片计数算法的问题而完全放弃了它。从来没有想过这个特定的块会导致问题,随后不介意重新检查它。感谢您在这方面帮助我。
  • 你的'for'循环实际上实现了什么?
猜你喜欢
  • 2012-10-16
  • 1970-01-01
  • 2015-08-16
  • 2023-03-21
  • 2020-05-18
  • 1970-01-01
  • 2012-09-21
  • 2015-08-02
  • 2014-10-22
相关资源
最近更新 更多