Preciso criar um objeto com os possíveis naipes e números (faces). Esse objeto tem que ter setters e getters, além de um método shuffle que determina naipe e face (como se tirassem carta aleatória do baralho). O código abaixo está dando o erro “naipe is not defined”. Podem me ajudar?
<!DOCTYPE html>
<html>
<head>
<title>Testes</title>
<script>
/*Write a constructor function for a Card object with properties of suit (diamonds, hearts, spades, or clubs) and face (ace, 2, 3 ...king). Add methods to set the values of suit and face. Can you include a shuffle method to set the suit and face properties to represent a random card from the deck? (Hint: Use the Math.random() method*/
function Card(){
this.naipe = ['paus', 'ouros', 'copas', 'espadas'];
this.face = ['A', 'K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2'];
this.setNaipe = function(){
this.naipe = naipe;
}
this.setFace = function(){
this.face = face;
}
this.shuffle = function(){
this.naipe = naipe[Math.floor(Math.random() * naipe.length)];
this.face = face[Math.floor(Math.random() * naipe.length)];
}
}
var carta = new Card();
carta.shuffle();
alert('Naipe ' + carta.naipe);
alert('Face ' + carta.face);
</script>
</head>
<body>
</body>
</html>
O problema é que na funçao shuffle, você está referenciando naipe, sem usar o “this.” antes. Se colocar o “this.” antes seu código vai funcionar a primeira vez.
Na segunda vez que tentar usar a funçao shuffle, os array com todos naipes e faces foram transformados no valor do primeiro shuffle.
2 curtidas
Realmente foi a falta do this que ocasionou o problema alterei o seu código para teste. Segue código modificado.
<!DOCTYPE html>
<html>
<head>
<title>Testes</title>
<script>
function Card(){
this.naipe = ['paus', 'ouros', 'copas', 'espadas'];
this.face = ['A', 'K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2'];
this.setNaipe = function(){
this.naipe = naipe;
}
this.setFace = function(){
this.face = face;
}
this.shuffle = function(){
var rando = Math.random();
var n = Math.floor(rando * this.naipe.length);
var f = Math.floor(Math.random() * this.naipe.length);
this.naipe = this.naipe[n];
this.face = this.face[f];
}
}
function viraCarta(){
var carta = new Card();
carta.shuffle();
alert('Naipe ' + carta.naipe);
alert('Face ' + carta.face);
}
</head>
<body>
<button onclick="viraCarta();">CLICK</button>
</body>
</html>
1 curtida
Seu código ainda tem bug… se precisar usar shuffle novamente, o array não existe mais e foi isso que o @AbelBueno tentou explicar…
Você precisa ter as listas “vivas” no código o tempo todo…
function Card(){
this.naipes = ['paus', 'ouros', 'copas', 'espadas'];
this.faces = ['A', 'K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2'];
this.naipe = null;
this.face = null; //sim, js aceita nulo!!!
this.setNaipe = function(naipe){ //faltou passar o param...
this.naipe = naipe;
}
this.setFace = function(face){ //faltou passar o param...
this.face = face;
}
this.shuffle = function(){
this.naipe = this.naipes[Math.floor(Math.random() * this.naipes.length)];
this.face = this.faces[Math.floor(Math.random() * this.faces.length)]; //estava naipe antes, errado!!!
}
}
Assim você pode usar shuffle quantas vezes quiser…
var carta = new Card();
carta.setNaipe('ouros');
carta.setFace('10');
carta.shuffle();
alert('Naipe ' + carta.naipe);
alert('Face ' + carta.face);
carta.shuffle();
alert('Naipe ' + carta.naipe);
alert('Face ' + carta.face);
2 curtidas