我遇到以下代码模拟卡片组的问题。
正确创建了牌组(1个阵列包含4个阵列(套装),每个阵列包含13个元素(面值))当我使用G.test()时;功能是正确拉动13张随机牌,但随后返回39x“空”(共52张)。
我讨厌寻求帮助,但是我一夜之间就把问题留了下来,然后一些我仍然找不到发生这种情况的原因。我很欣赏可以提供的任何和所有见解。
var G = {};
G.cards = [[], [], [], []];
G.newCard = function(v) { //currently a useless function, tried a few things
return v;
};
G.deck = {
n: function() { //new deck
var x; var list = [];
list.push(G.newCard("A"));
for (x = 2; x <= 10; x += 1) {
list.push(G.newCard(x.toString()));
}
list.push(G.newCard("J"), G.newCard("Q"), G.newCard("K"));
for (x = 0; x < G.cards.length; x += 1) {
G.cards[x] = list;
}
},
d: function() { //random card - returns suit & value
var s; var c; var v; var drawn = false; var n;
s = random(0, G.cards.length);
c = random(0, G.cards[s].length);
n = 0;
while (!drawn) {
if (G.cards[s].length > 0) {
if (G.cards[s][c]) {
v = G.cards[s].splice(c, 1);
drawn = true;
} else {
c = random(0, G.cards[s].length);
}
} else {
s = (s + 1 >= G.cards.length) ? 0 : s + 1;
n += 1;
console.log(s);
if (n >= G.cards.length) {
console.log(n);
return "Empty";
}
}
}
return {s: s, v: v[0]};
},
}; //G.deck
G.test = function() {
var x; var v;
G.deck.n();
for (x = 0; x < 52; x += 1) {
v = G.deck.d();
console.log(v);
}
};
答案 0 :(得分:0)
替换
for (x = 0; x < G.cards.length; x += 1) {
G.cards[x] = list;
}
与
for (x = 0; x < G.cards.length; x += 1) {
G.cards[x] = list.slice();
}
因为这会阻止G.cards[x]
的所有元素绑定到同一个(单个)数组实例。
如果所有元素都绑定到同一个实例,那么改变一个元素就等于改变所有元素。 list.slice()
创建list
的新副本,从而创建一个新数组实例以防止出现上述问题。
答案 1 :(得分:0)
我不会查看您的代码,但我构建了一个可以执行您想要的代码。我只为一个甲板而不是多甲板游戏构建了这个。有两个功能,一个将生成牌组,另一个将从牌组中抽出牌,基于你需要多少牌牌以及你想要每张牌多少张牌。一张卡片被绘制,它不会被重新绘制。我可以在http://kevinhng86.iblog.website发表一篇简短的文章,介绍如何在短期内处理计划工作或类似工作。
function random(min, max){
return Math.floor(Math.random() * (max - min)) + min;
}
function deckGenerate(){
var output = [];
var face = {1: "A", 11: "J", 12: "Q", 13: "K"};
// Heart Space Diamond & Club;
var suit = ["H", "S", "D", "C"];
// Delimitter between card identification and suit identification.
var d = "-";
for(i = 0; i < 4; i++){
output[i] = [];
for(ind = 0; ind < 13; ind++ ){
card = (ind + 1);
output[i][ind] = (card > 10) || (card === 1)? face[card] + d + suit[i] : card.toString() + d + suit[i];
}
}
return output;
}
function randomCard(deck, hand, card){
var output = [];
var randS = 0;
var randC = 0;
if( hand * card > 52 ) throw("Too many card, I built this for one deck only");
for(i = 0; i < hand; i++){
output[i] = [];
for(ind = 0; ind < card; ind++){
randS = random(0, deck.length);
randC = random(0, deck[randS].length);
output[i][ind] = deck[randS][randC];
deck[randS].splice(randC,1);
if(deck[randS].length === 0) deck.splice(randS,1);
}
}
document.write( JSON.stringify(deck, null, 2) );
return output;
}
var deck = deckGenerate()
document.write( JSON.stringify(deck, null, 2) );
document.write("<br><br>");
var randomhands = randomCard(deck, 5, 8);
document.write("<br><br>");
document.write("<br><br>");
document.write( JSON.stringify(randomhands, null, 2) );