...

View Full Version : Custom objects causing me grief



jpalfree
08-08-2006, 09:49 PM
Hello, this is my first post here, and i have a tricky question.
I'm trying to make a javascript poker game (for fun) and have created my own classes to help: Card, Deck, Hand.

The Card class mainly just holds information about the rank and suit of the card.
example:
var c = new Card(2, 'h');
c.rank is 2
c.suit is 'h'

The problem is with the Deck object. It has an array called 'cards' that holds Card objects. I have a function called shuffle (to randomize the order of the cards in the array) and this function is causing the problem.

The problem can be illustrated by the following:


var d = new Deck();
alert(d.cards[0].rank); //this is ok. It outputs "2" since i create the
// 'cards' array from lowest to highest cards

d.shuffle();
alert(d.cards[0].rank);//This gives me 'undefined'. I have no idea why!


The code for the Deck object is here:


function Deck()
{
this.cards = new Array();//will hold Card objects
var suits = new Array();
suits[0] = "h";
suits[1] = "s";
suits[2] = "c";
suits[3] = "d";

var count;
for( count = 2; count <= 14 ; count++)
{
for( suit in suits )
{
var c = new Card(count, suits[suit]);
this.cards.push( c );
}
}
this.shuffle = D_shuffle;
this.drawCard = function(){ return this.cards.shift(); }
this.numCards = function() { return this.cards.length; }

//shuffle cards in Deck object
function D_shuffle()
{
var count;
this.cards = new Array();
var tmpdeck = new Deck();
for( count = tmpdeck.numCards(); count > 0; count-- )
{
this.cards.push( tmpdeck.cards.splice(rnd(count), 1) );
//function rnd(NUM) returns random number between 0 and NUM (not including NUM)
}
//even trying to access this.cards[0].rank from here gives 'undefined'
}
} //end of Deck object



I have a feeling it's something to do with the arrays but I don't know javascript well enough yet.
The full source code (.js file) is available here (please excuse the lack of in depth comments):
http://ganesh.ugrad.physics.mcgill.ca/~caffeine/poker/js/Poker.js
Absolutely any help would be greatly appreciated.
thanks.

Philip M
08-09-2006, 02:55 AM
I note that you are calling a function d.shuffle();
But the name of the function is
function D_shuffle()

JavaScript is case sensitive.

jpalfree
08-09-2006, 05:37 AM
I note that you are calling a function d.shuffle();
But the name of the function is
function D_shuffle()

JavaScript is case sensitive.

actually the constructor for the Deck object assignes D_shuffle to this.shuffle and in my example i created a Deck object called 'd', which may have been misleading.

Actually I solved the problem. For some reason I thought that the array function splice() returned the removed element. But it doesn't. And i was catching the return value of that function thinking it was returning the Card. I was wrong. I fixed it and now it's working nicely. :D

Thanks anyway, Philip M

jkd
08-09-2006, 07:46 AM
Careful how you shuffle. There are 52 cards to a deck, so consider some random ordering of the deck. There are 52 possibilities for the first card, 51 for the second, and so on. If you always randomly swap a card into positions 1-52, then there are 52^52 possibilities of how you shuffled, when in fact you should be getting only 52!. Now, if we're lucky, all the "repeated" distributions are uniformly distributed across the possibilities. However, 52^52 modulo 52! is 10777503050828868663485472229826764300032615709995954391232907575296, a rather large number. Dividing it by 52!, we get approximately 0.133619, or 13.36% of all possible deck configurations which *must* have some sort of bias to them.

In other words, always randomly selecting a position from 1-52 will generate a bias in your shuffling algorithm. You need to select 1-52 for the first card, then 2-52 for the second, then 3-52 for the third, and so on.



EZ Archive Ads Plugin for vBulletin Copyright 2006 Computer Help Forum