/**** * Classes ****/ // Card class representing an individual card (used for deck creation) var Card = Container.expand(function (suit, value) { var self = Container.call(this); self.suit = suit; self.value = value; self.isFaceDown = false; // Attach card asset var cardGraphics = self.attachAsset('card', { anchorX: 0.5, anchorY: 0.5 }); // Method to flip the card self.flip = function () { self.isFaceDown = !self.isFaceDown; cardGraphics.alpha = self.isFaceDown ? 0.5 : 1; }; }); // Deck class to manage a full 52-card deck var Deck = Container.expand(function () { var self = Container.call(this); self.cards = []; var suits = ['hearts', 'diamonds', 'clubs', 'spades']; var values = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']; suits.forEach(function (suit) { values.forEach(function (value) { self.cards.push(new Card(suit, value)); }); }); // Shuffle using Fisher-Yates algorithm self.shuffle = function () { for (var i = self.cards.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = self.cards[i]; self.cards[i] = self.cards[j]; self.cards[j] = temp; } }; // Draw a card from the deck self.draw = function () { return self.cards.pop(); }; }); // Hand class for managing a player’s or dealer’s hand var Hand = Container.expand(function (label) { var self = Container.call(this); self.cards = []; self.label = label || ''; // Create a display text for the hand's total value self.valueText = new Text2('0', { size: 60, fill: 0xFFFFFF }); self.valueText.anchor.set(0.5, 0); LK.gui.top.addChild(self.valueText); // Update hand value display near the hand's position self.updateValueDisplay = function (x, y) { self.valueText.setText(self.getValue().toString()); self.valueText.x = x; self.valueText.y = y - 100; }; // Add a card to the hand at a specified position self.addCard = function (card, posX, posY) { var playerCard = new PlayerCard(card.suit, card.value, posX, posY); self.cards.push(playerCard); self.addChild(playerCard); self.updateValueDisplay(posX, posY); }; // Compute the hand's total value, handling Aces correctly self.getValue = function () { var total = 0; var aces = 0; self.cards.forEach(function (card) { if (typeof card.value === 'number') { total += card.value; } else if (card.value === 'A') { aces++; total += 11; } else { total += 10; } }); while (total > 21 && aces > 0) { total -= 10; aces--; } return total; }; }); // PlayerCard class to represent each card in a hand with value display var PlayerCard = Container.expand(function (suit, value, x, y) { var self = Container.call(this); self.suit = suit; self.value = value; self.isFaceDown = false; // Attach card asset var cardGraphics = self.attachAsset('card', { anchorX: 0.5, anchorY: 0.5 }); // Create a text object to display the card's value self.valueText = new Text2(self.value.toString(), { size: 30, fill: 0xFFFFFF }); // Position the text to the right of the card (offset from center) self.valueText.anchor.set(0, 0.5); self.valueText.x = 60; // (card width/2 = 50 + 10px offset) self.valueText.y = 0; // Only show the text when the card is face up self.valueText.visible = !self.isFaceDown; self.addChild(self.valueText); // Position the card self.x = x; self.y = y; // Method to flip the card self.flip = function () { self.isFaceDown = !self.isFaceDown; cardGraphics.alpha = self.isFaceDown ? 0.5 : 1; self.valueText.visible = !self.isFaceDown; }; }); /**** * Initialize Game ****/ // Create the game instance with a black background var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Initialize deck and hands var deck = new Deck(); deck.shuffle(); // Position the dealer's hand near the top center and the player's hand near the bottom center. var dealerHand = new Hand("Dealer"); dealerHand.x = 500; // Adjusted so cards are centered; feel free to tweak this value. dealerHand.y = 300; // Near the top of the 2732px height. var playerHand = new Hand("Player"); playerHand.x = 500; // Adjusted so cards are centered. playerHand.y = 1000; // Near the bottom of the screen. // Deal initial cards dealerHand.addCard(deck.draw(), dealerHand.x, dealerHand.y); dealerHand.addCard(deck.draw(), dealerHand.x + 120, dealerHand.y); // Keep dealer's second card face down initially dealerHand.cards[1].flip(); playerHand.addCard(deck.draw(), playerHand.x, playerHand.y); playerHand.addCard(deck.draw(), playerHand.x + 120, playerHand.y); game.addChild(dealerHand); game.addChild(playerHand); // Game state flags var playerTurn = true; var gameOver = false; /**** * Game Logic ****/ // Handle player's decision: 'hit' or 'stand' function playerDecision(action) { if (gameOver) { return; } if (action === 'hit') { // Display a message to the player var hitMessage = new Text2('You have decided to hit!', { size: 60, fill: 0xFFFFFF }); hitMessage.anchor.set(0.5, 0.5); hitMessage.x = 1024; // Center of the screen hitMessage.y = 1366; // Center of the screen LK.gui.center.addChild(hitMessage); // Remove the message after 2 seconds LK.setTimeout(function () { LK.gui.center.removeChild(hitMessage); }, 2000); // Position new card based on current number of cards var newX = playerHand.x + playerHand.cards.length * 120; playerHand.addCard(deck.draw(), newX, playerHand.y); if (playerHand.getValue() > 21) { gameOver = true; LK.showGameOver(); } } else if (action === 'stand') { playerTurn = false; dealerPlay(); } } // Dealer plays automatically once the player stands function dealerPlay() { // Reveal dealer's face-down card dealerHand.cards[1].flip(); // Dealer draws until reaching at least 17 while (dealerHand.getValue() < 17) { var newX = dealerHand.x + dealerHand.cards.length * 120; dealerHand.addCard(deck.draw(), newX, dealerHand.y); } // Determine outcome var playerTotal = playerHand.getValue(); var dealerTotal = dealerHand.getValue(); if (dealerTotal > 21 || playerTotal > dealerTotal) { LK.showYouWin(); } else if (playerTotal < dealerTotal) { LK.showGameOver(); } else { LK.showPush(); // Handle tie/push situation } } // Create buttons for player actions 'hit' and 'stand' // Placing the buttons near the bottom within the 2048×2732 bounds. var hitButton = new Text2('Hit', { size: 80, fill: 0xFFFFFF }); hitButton.anchor.set(0.5, 0.5); hitButton.x = 512; // Left side of the screen. hitButton.y = 2600; // Near the bottom. hitButton.interactive = true; hitButton.buttonMode = true; hitButton.on('pointerdown', function (event) { playerDecision('hit'); event.stopPropagation(); // Ensure event doesn't propagate further }); game.addChild(hitButton); var standButton = new Text2('Stand', { size: 80, fill: 0xFFFFFF }); standButton.anchor.set(0.5, 0.5); standButton.x = 1536; // Right side of the screen. standButton.y = 2600; // Near the bottom. standButton.interactive = true; standButton.buttonMode = true; standButton.on('pointerdown', function (event) { playerDecision('stand'); event.stopPropagation(); // Ensure event doesn't propagate further }); game.addChild(standButton); // Game update loop (can be used for additional logic if needed) game.update = function () { // Additional per-frame game updates can be placed here };
/****
* Classes
****/
// Card class representing an individual card (used for deck creation)
var Card = Container.expand(function (suit, value) {
var self = Container.call(this);
self.suit = suit;
self.value = value;
self.isFaceDown = false;
// Attach card asset
var cardGraphics = self.attachAsset('card', {
anchorX: 0.5,
anchorY: 0.5
});
// Method to flip the card
self.flip = function () {
self.isFaceDown = !self.isFaceDown;
cardGraphics.alpha = self.isFaceDown ? 0.5 : 1;
};
});
// Deck class to manage a full 52-card deck
var Deck = Container.expand(function () {
var self = Container.call(this);
self.cards = [];
var suits = ['hearts', 'diamonds', 'clubs', 'spades'];
var values = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A'];
suits.forEach(function (suit) {
values.forEach(function (value) {
self.cards.push(new Card(suit, value));
});
});
// Shuffle using Fisher-Yates algorithm
self.shuffle = function () {
for (var i = self.cards.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = self.cards[i];
self.cards[i] = self.cards[j];
self.cards[j] = temp;
}
};
// Draw a card from the deck
self.draw = function () {
return self.cards.pop();
};
});
// Hand class for managing a player’s or dealer’s hand
var Hand = Container.expand(function (label) {
var self = Container.call(this);
self.cards = [];
self.label = label || '';
// Create a display text for the hand's total value
self.valueText = new Text2('0', {
size: 60,
fill: 0xFFFFFF
});
self.valueText.anchor.set(0.5, 0);
LK.gui.top.addChild(self.valueText);
// Update hand value display near the hand's position
self.updateValueDisplay = function (x, y) {
self.valueText.setText(self.getValue().toString());
self.valueText.x = x;
self.valueText.y = y - 100;
};
// Add a card to the hand at a specified position
self.addCard = function (card, posX, posY) {
var playerCard = new PlayerCard(card.suit, card.value, posX, posY);
self.cards.push(playerCard);
self.addChild(playerCard);
self.updateValueDisplay(posX, posY);
};
// Compute the hand's total value, handling Aces correctly
self.getValue = function () {
var total = 0;
var aces = 0;
self.cards.forEach(function (card) {
if (typeof card.value === 'number') {
total += card.value;
} else if (card.value === 'A') {
aces++;
total += 11;
} else {
total += 10;
}
});
while (total > 21 && aces > 0) {
total -= 10;
aces--;
}
return total;
};
});
// PlayerCard class to represent each card in a hand with value display
var PlayerCard = Container.expand(function (suit, value, x, y) {
var self = Container.call(this);
self.suit = suit;
self.value = value;
self.isFaceDown = false;
// Attach card asset
var cardGraphics = self.attachAsset('card', {
anchorX: 0.5,
anchorY: 0.5
});
// Create a text object to display the card's value
self.valueText = new Text2(self.value.toString(), {
size: 30,
fill: 0xFFFFFF
});
// Position the text to the right of the card (offset from center)
self.valueText.anchor.set(0, 0.5);
self.valueText.x = 60; // (card width/2 = 50 + 10px offset)
self.valueText.y = 0;
// Only show the text when the card is face up
self.valueText.visible = !self.isFaceDown;
self.addChild(self.valueText);
// Position the card
self.x = x;
self.y = y;
// Method to flip the card
self.flip = function () {
self.isFaceDown = !self.isFaceDown;
cardGraphics.alpha = self.isFaceDown ? 0.5 : 1;
self.valueText.visible = !self.isFaceDown;
};
});
/****
* Initialize Game
****/
// Create the game instance with a black background
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Initialize deck and hands
var deck = new Deck();
deck.shuffle();
// Position the dealer's hand near the top center and the player's hand near the bottom center.
var dealerHand = new Hand("Dealer");
dealerHand.x = 500; // Adjusted so cards are centered; feel free to tweak this value.
dealerHand.y = 300; // Near the top of the 2732px height.
var playerHand = new Hand("Player");
playerHand.x = 500; // Adjusted so cards are centered.
playerHand.y = 1000; // Near the bottom of the screen.
// Deal initial cards
dealerHand.addCard(deck.draw(), dealerHand.x, dealerHand.y);
dealerHand.addCard(deck.draw(), dealerHand.x + 120, dealerHand.y);
// Keep dealer's second card face down initially
dealerHand.cards[1].flip();
playerHand.addCard(deck.draw(), playerHand.x, playerHand.y);
playerHand.addCard(deck.draw(), playerHand.x + 120, playerHand.y);
game.addChild(dealerHand);
game.addChild(playerHand);
// Game state flags
var playerTurn = true;
var gameOver = false;
/****
* Game Logic
****/
// Handle player's decision: 'hit' or 'stand'
function playerDecision(action) {
if (gameOver) {
return;
}
if (action === 'hit') {
// Display a message to the player
var hitMessage = new Text2('You have decided to hit!', {
size: 60,
fill: 0xFFFFFF
});
hitMessage.anchor.set(0.5, 0.5);
hitMessage.x = 1024; // Center of the screen
hitMessage.y = 1366; // Center of the screen
LK.gui.center.addChild(hitMessage);
// Remove the message after 2 seconds
LK.setTimeout(function () {
LK.gui.center.removeChild(hitMessage);
}, 2000);
// Position new card based on current number of cards
var newX = playerHand.x + playerHand.cards.length * 120;
playerHand.addCard(deck.draw(), newX, playerHand.y);
if (playerHand.getValue() > 21) {
gameOver = true;
LK.showGameOver();
}
} else if (action === 'stand') {
playerTurn = false;
dealerPlay();
}
}
// Dealer plays automatically once the player stands
function dealerPlay() {
// Reveal dealer's face-down card
dealerHand.cards[1].flip();
// Dealer draws until reaching at least 17
while (dealerHand.getValue() < 17) {
var newX = dealerHand.x + dealerHand.cards.length * 120;
dealerHand.addCard(deck.draw(), newX, dealerHand.y);
}
// Determine outcome
var playerTotal = playerHand.getValue();
var dealerTotal = dealerHand.getValue();
if (dealerTotal > 21 || playerTotal > dealerTotal) {
LK.showYouWin();
} else if (playerTotal < dealerTotal) {
LK.showGameOver();
} else {
LK.showPush(); // Handle tie/push situation
}
}
// Create buttons for player actions 'hit' and 'stand'
// Placing the buttons near the bottom within the 2048×2732 bounds.
var hitButton = new Text2('Hit', {
size: 80,
fill: 0xFFFFFF
});
hitButton.anchor.set(0.5, 0.5);
hitButton.x = 512; // Left side of the screen.
hitButton.y = 2600; // Near the bottom.
hitButton.interactive = true;
hitButton.buttonMode = true;
hitButton.on('pointerdown', function (event) {
playerDecision('hit');
event.stopPropagation(); // Ensure event doesn't propagate further
});
game.addChild(hitButton);
var standButton = new Text2('Stand', {
size: 80,
fill: 0xFFFFFF
});
standButton.anchor.set(0.5, 0.5);
standButton.x = 1536; // Right side of the screen.
standButton.y = 2600; // Near the bottom.
standButton.interactive = true;
standButton.buttonMode = true;
standButton.on('pointerdown', function (event) {
playerDecision('stand');
event.stopPropagation(); // Ensure event doesn't propagate further
});
game.addChild(standButton);
// Game update loop (can be used for additional logic if needed)
game.update = function () {
// Additional per-frame game updates can be placed here
};