Archief - [PROG][Javascript] Pokerspel

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

scriptkiddie

Legacy Member
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>

MilM

Legacy Member
scriptkiddie zei:
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.

Ik begrijp niet goed wat er daar een probleem aan is ?
Je kent gewoon de hoogste waarde er aan toe ...

Eerst zoek je of er in de 7 kaarten 5 van dezelfde soort aanwezig zijn (bv harten)
Indien ja: filter de kaarten er van de andere soort uit
Dan ga je binnen de overgebleven kaarten op zoek naar een straat (indien er een Aas is, voeg ook een 1 toe).
Indien ja -> straight flush
Indien nee -> flush

Je kunt nooit een flush én carré of full house hebben.
Dus indien je hier al een flush detecteert, moet je niet meer verder zoeken achter een (hogere) carré/full house.

Daarna zoek je op een straat (idem hier, indien je straat vindt moet je niet mee rzeken achter de hogere full house)

Pas daarna indien er geen flush/straat gedetecteert is ga je op zoek naar andere combinaties.
Zoek of er 2 dezelfde kaarten zijn.
Indien ja -> ga op zoek naar carre;full house; set; double pair; pair
Indien nee -> high card


Je kunt aan elke hand dan een getal toekennen op basis van de gevonden combinatie. Je kan zelfs alles in één getal steken (combinatie+high cards etc) zodat je enkel nog een simpele "<>=" moet doen om te zien welke hand de beste is.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan