Talking about Poker game, Game development and Javascript.
Did you enjoy the pure JavaScript poker hand analyzer to be used (also) in puzzle games I posted earlier this week? Unfortunately there was a glitch causing the function to detect Ace Straight not to work properly. I fixed it, and to give you some extra value I commented the source code so you can learn how it’s done. This is the fixed result of the script: And this is the commented source code:
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div id = "table"></div>
<div id = "result" style = "font:normal 32px arial;margin:10px;"></div>
<script>
// this is the array with your actual hand. It will contain five numbers - the five cards - ranging from zero (the first Ace) to 51 (the last King)
var hand = [];
// this is a temporary array which will contain the modulo operation of each "hand" array element by 13. This will cause this array to be only filled by
// numbers from 0 (Ace) to 12 (King) no matter the suit
var valuesArray = [];
// this is a temporary array which will contain the suits of your original hand
var suitsArray = [];
// convertHand function will populate valuesArray and suitsArray starting from hand array
function convertHand(){
for(var i = 0; i < 5; i ++){
valuesArray[i] = hand[i] % 13;
suitsArray[i] = Math.floor(hand[i] / 13);
}
}
// given a value "n", returns the number of occurrences of "n" in "hand" array. Useful to know how many "two"s or "three"s and so on we have on a hand
function occurrencesOf(n){
var count = 0;
var index = 0;
do{
index = valuesArray.indexOf(n, index) + 1;
if(index == 0){
break;
}
else{
count ++;
}
} while(index < valuesArray.length);
return count;
}
// thanks to occurrencesOf, this function returns a string with the combination of duplicate cards.
// If you have "Four of a Kind" it will return "4", if you have "Three of a kind" il will return "3",
// if you have "Full House" it will return "32" or "23" and so on.
function duplicateCards(){
var occurrencesFound = [];
var result = "";
for(var i = 0; i < valuesArray.length; i++){
var occurrences = occurrencesOf(valuesArray[i]);
if(occurrences > 1 && occurrencesFound.indexOf(valuesArray[i]) == -1){
result += occurrences;
occurrencesFound.push(valuesArray[i]);
}
}
return result;
}
// this function will return the lowest number in a hand. Useful to check for straights
function getLowest(){
var min = 12;
for(var i = 0; i < valuesArray.length; i++){
min = Math.min(min, valuesArray[i]);
}
return min;
}
// we have a straight when starting from the lowest card we can find an occurrence of lowest card +1, +2, +3 and +4
function isStraight(){
var lowest = getLowest();
for(var i = 1; i < 5; i++){
if(occurrencesOf(lowest + i) != 1){
return false
}
}
return true;
}
// we have an ace straight when you have 10 (9), J (10), Q (11), K (12) and A (0)
function isAceStraight(){
var lowest = 8;
for(var i = 1; i < 5; i++){
if(occurrencesOf(lowest + i) != 1){
return false;
}
}
return occurrencesOf(0) == 1;
}
// we have a flush when all items in suitsArray have the same value
function isFlush(){
for(var i = 0; i < 4; i ++){
if(suitsArray[i] != suitsArray[i+1]){
return false;
}
}
return true;
}
// main function to check the hand
function checkHand(){
// just a string to output the result
var resultString = "";
// populating hand array with the values of the five <select> elements
for(var i = 0; i < 5; i++){
hand[i] = document.getElementById("card_" + i).value;
}
// calling convertHand to create valuesArray and suitsArray
convertHand();
switch(duplicateCards()){
case "2":
resultString = "1 Pair";
break;
case "22":
resultString = "2 Pairs";
break;
case "3":
resultString = "3 of a Kind";
break;
case "23":
case "32":
resultString = "Full House";
break;
case "4":
resultString = "4 of a Kind";
break;
case "5":
resultString = "5 of a Kind";
break;
default:
if(isStraight()){
resultString = "Straight";
}
if(isAceStraight()){
resultString = "Ace Straight";
}
break;
}
if(isFlush()){
if(resultString){
resultString += " and Flush";
}
else{
resultString = "Flush";
}
}
if(!resultString){
resultString = "nothing...";
}
document.getElementById("result").innerHTML = resultString;
}
// THE REMAINING CODE IS USED JUST TO DRAW THE "CARDS" ON THE SCREEN AND TRIGGER WHEN THE PLAYER CHANGES A "CARD"
var cardSymbols = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"];
var suitSymbols = ["?", "?", "?", "?"];
var tableHTML = '';
for(var j = 0; j < 5; j ++){
tableHTML += '<select style = "padding:3px;font:normal 32px arial;margin:10px" id = "card_' + j + '" onchange = "checkHand();">';
for(var i = 0; i < 52; i ++){
tableHTML += '<option value = "' + i + '">' + cardSymbols[i % 13] + " " + suitSymbols[Math.floor(i / 13)] + '</option>';
}
tableHTML += '</select>';
}
document.getElementById("table").innerHTML = tableHTML;
checkHand();
</script>
</body>
</html>
Never miss an update! Subscribe, and I will bother you by email only when a new game or full source code comes out.