Pokerspel

Status
Niet open voor verdere reacties.

Scriptkiddi3

Nieuwe gebruiker
Lid geworden
2 apr 2008
Berichten
1
Dag programmeurs (in spe),

Ik ben bezig met een experimenteel javascript pokerprogramma. De bedoeling is om op een simpele manier willekeurige kaarten op tafel (5 stuks) en kaarten in de hand (2 stuks) te krijgen, en de computer daar dan de beste combinatie uit te laten kiezen.

Dat laatste aspect is echter moeilijker dan ik eerst had gedacht.

Ik laat de computer 7 verschillende kaarten willekeurig kiezen:

array[0]
array[1]
...
array[6]

Elke array is op zich nog eens een array, met 2 eigenschappen erin:

array[n][0] = 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A
array[n][1] = h, r, s, k

[0] is het getal (2 tot aas)
[1] is de soort (harten, ruiten, schoppen, klaveren)

De moeilijkheid is nu om te checken welke de hoogste combinatie is.
Ik wil de gewone Texas Hold'em volgorde gebruiken, zijnde van laag naar hoog:

high card
pair
double pair
3 of a kind
straight
flush
full house
4 of a kind
straight flush
royal flush

Voor info over deze kaartencombinaties verwijs ik je naar Wikipedia.


Nu zou ik aan de ervaren programmeurs willen vragen of ze me willen helpen een functie te schrijven:
Code:
function checkCombination(array){
// ...

output[0] = subarray; //de 5 beste kaarten uit de 7 die beschikbaar zijn
output[1] = combinationName; //de naam van de combinatie, bijvoorbeeld "straight flush"
return output;
}

Ik weet dat het een hele taak is, maar wel een uitdagende. Je moet er immers rekening mee houden dat een 'full house' tegelijk een 'high card', 'pair', 'double pair', '3 of a kind' en 'full house' is.

Zet hieronder eventuele bedenkingen, tips, stukken code, of andere dingen die me in dit project kunnen helpen. Een toekomstig student informatica is je dankbaar!

Scriptkiddie

P.S.: hieronder zet ik het volledige htmlbestand. Open het gerust eens in je browser om te zien hoe het pokerexperiment in zijn werk zou moeten gaan.

HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Poker - Scriptkiddie @ Helpmij.nl</title>
<script type="text/javascript">
function getCard(type){
a = "noNumber";
b = "noSuit";

if(type == "number"){
a = Math.round(Math.random()*13) + 2;
switch(a)
{  
case 11:
  a = "J";
  break;
case 12:
  a = "Q";
  break;    
case 13:
  a = "K";
  break;
case 14:
  a = "A";
  break;
case 15:
  a = 2;
  break;
}
return a;
}

if (type == "suit"){
b = Math.round(Math.random()*4);
switch(b)
{
case 0:
  b = "s";
  break;
case 1:
  b = "k";
  break;    
case 2:
  b = "h";
  break;
case 3:
  b = "r";
  break;    
case 4:
  b = "s";
  break;
}
return b;
}
}

function checkUnique(array){
ok = 1;
maxindex = array.length -1;
for (x=0; x<=maxindex; x++){
for (y=0; y<=maxindex; y++){
	if (x != y){
	if ((array[x][0] == array[y][0]) && (array[x][1] == array[y][1])){
		ok = 0;
	}
	}
}
}
return ok;
}

function burnandturn(){
if (document.getElementById('button').value != 'burn and river'){
document.getElementById('turn').src = 'cards/' + array[3][0] + array[3][1] + '.png';
document.getElementById('turn').alt =  array[3][0] + array[3][1];
document.getElementById('button').value = 'burn and river';
}
else{
document.getElementById('river').src = 'cards/' + array[4][0] + array[4][1] + '.png';
document.getElementById('button').style.display = 'none';
}
}

</script>
</head>

<body>
<script type="text/javascript">
var array = new Array(7);
do{
for (n=0 ; n <= 6 ; n++){
array[n] = new Array(2);
array[n][0] = getCard("number");
array[n][1] = getCard("suit");
}
} while (!checkUnique(array))

for (n=0 ; n <= 2 ; n++){
document.write("<img src='cards/" + array[n][0] + array[n][1] + ".png' alt='" + array[n][0] + array[n][1] + "' id='flop" + eval(n+1) + "'> ");
}

document.write("<img src='cards/" + "b1fv" + ".png' alt='" + "turn" + "' id='turn'> ");
document.write("<img src='cards/" + "b1fv" + ".png' alt='" + "river" + "' id='river'> ");

document.write("<br /><br />");
for (n=5 ; n<=6; n++){
document.write("<img src='cards/" + array[n][0] + array[n][1] + ".png' alt='" + array[n][0] + array[n][1] + "'> ");
}
</script>
<form>
<input type="button" value="burn and turn" onClick="burnandturn()" id="button" /><br />
<input type="button" value="refresh" onClick="location.reload()" />
</form>
</body>
</html>
 
Eerst even deze functie verbeterd: ;)
PHP:
function getCard(type) {
 if(type == 'number') return ['A','K','V','B',10,9,8,7,6,5,4,3,2][Math.floor(Math.random()*13)];
 if(type == 'suit') return ['h','r','s','k'][Math.floor(Math.random()*4)];
 return 'error';
 };
Math.floor() is handiger als dobbelsteen, zo hoef je er geen rekening mee te houden dat de eerste en laatste maar een halve kans hebben.

En ['h','r','s','k'] == new Array('h','r','s','k'); :)


Maar het controleren ... oei! :eek: ;)

Je zou een array van 4x14 (aas dubbel op het eind) + 13 kunnen maken als dit:
00000000000000
00000000000000
00000000000000
00000000000000
xxxxxxxxxxxxx


Van links naar rechts is A naar 2 + A, van boven naar beneden is h, r, s, k. De x-jes zijn voor het aantal gelijke kaarten (paar, drie, carré).

De zeven kaarten zet je op 1, en de x'jes vul je met het aantal 1'en erboven.

En dan zoek je naar:
  • 11111 in de eerste vier rijen (met .join('') kun je er een string van maken): straight flush,
  • een 4 in de rij x'jes: carré (highcard erbij zoeken: eerste 1, 2 of 3 in de x'jes),
  • vijf 1'en in de eerste vier rijen (tweede aas overslaan): flush,
  • vijf opvolgende niet 0 in de rij x'jes: straight,
  • een 3 in de rij x'jes, vindt je nog een 3 of 2: full house, anders is het: three of a kind (twee highcards),
  • een 2 in de rij x'jes, met een tweede 2: two pair (één highcard), ander een pair (drie high cards),
  • de eerste vijf 1'en in de rij x'jes (high cards).
En dat dan in javascript! ;)


Vr.Gr. Egel.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan