function love.load()
love.graphics.setBackgroundColor(1, 1, 1)
images = {}
for nameIndex, name in ipairs({
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
'pip_heart', 'pip_diamond', 'pip_club', 'pip_spade',
'mini_heart', 'mini_diamond', 'mini_club', 'mini_spade',
'card', 'card_face_down',
'face_jack', 'face_queen', 'face_king',
}) do
images[name] = love.graphics.newImage('images/'..name..'.png')
end
deck = {}
for suitIndex, suit in ipairs({'club', 'diamond', 'heart', 'spade'}) do
for rank = 1, 13 do
table.insert(deck, {suit = suit, rank = rank})
end
end
function takeCard(hand)
table.insert(hand, table.remove(deck, love.math.random(#deck)))
end
playerHand = {}
takeCard(playerHand)
takeCard(playerHand)
dealerHand = {}
takeCard(dealerHand)
takeCard(dealerHand)
roundOver = false
function getTotal(hand)
local total = 0
local hasAce = false
for cardIndex, card in ipairs(hand) do
if card.rank > 10 then
total = total + 10
else
total = total + card.rank
end
if card.rank == 1 then
hasAce = true
end
end
if hasAce and total <= 11 then
total = total + 10
end
return total
end
local buttonY = 230
local buttonHeight = 25
local textOffsetY = 6
buttonHit = {
x = 10,
y = buttonY,
width = 53,
height = buttonHeight,
text = 'Hit!',
textOffsetX = 16,
textOffsetY = textOffsetY,
}
buttonStand = {
x = 70,
y = buttonY,
width = 53,
height = buttonHeight,
text = 'Stand',
textOffsetX = 8,
textOffsetY = textOffsetY,
}
buttonPlayAgain = {
x = 10,
y = buttonY,
width = 113,
height = buttonHeight,
text = 'Play again',
textOffsetX = 24,
textOffsetY = textOffsetY,
}
function isMouseInButton(button)
return love.mouse.getX() >= button.x
and love.mouse.getX() < button.x + button.width
and love.mouse.getY() >= button.y
and love.mouse.getY() < button.y + button.height
end
end
function love.keypressed(key)
if not roundOver then
if key == 'h' then
takeCard(playerHand)
if getTotal(playerHand) >= 21 then
roundOver = true
end
elseif key == 's' then
roundOver = true
end
if roundOver then
while getTotal(dealerHand) < 17 do
takeCard(dealerHand)
end
end
else
love.load()
end
end
function love.mousereleased()
if isMouseInButton(buttonHit) then
print('Hit!')
elseif isMouseInButton(buttonStand) then
print('Stand')
end
end
function love.draw()
local function drawCard(card, x, y)
love.graphics.setColor(1, 1, 1)
love.graphics.draw(images.card, x, y)
if card.suit == 'heart' or card.suit == 'diamond' then
love.graphics.setColor(.89, .06, .39)
else
love.graphics.setColor(.2, .2, .2)
end
local cardWidth = 53
local cardHeight = 73
local function drawCorner(image, offsetX, offsetY)
love.graphics.draw(
image,
x + offsetX,
y + offsetY
)
love.graphics.draw(
image,
x + cardWidth - offsetX,
y + cardHeight - offsetY,
0,
-1
)
end
drawCorner(images[card.rank], 3, 4)
drawCorner(images['mini_'..card.suit], 3, 14)
if card.rank > 10 then
local faceImage
if card.rank == 11 then
faceImage = images.face_jack
elseif card.rank == 12 then
faceImage = images.face_queen
elseif card.rank == 13 then
faceImage = images.face_king
end
love.graphics.setColor(1, 1, 1)
love.graphics.draw(faceImage, x + 12, y + 11)
else
local function drawPip(offsetX, offsetY, mirrorX, mirrorY)
local pipImage = images['pip_'..card.suit]
local pipWidth = 11
love.graphics.draw(
pipImage,
x + offsetX,
y + offsetY
)
if mirrorX then
love.graphics.draw(
pipImage,
x + cardWidth - offsetX - pipWidth,
y + offsetY
)
end
if mirrorY then
love.graphics.draw(
pipImage,
x + offsetX + pipWidth,
y + cardHeight - offsetY,
0,
-1
)
end
if mirrorX and mirrorY then
love.graphics.draw(
pipImage,
x + cardWidth - offsetX,
y + cardHeight - offsetY,
0,
-1
)
end
end
local xLeft = 11
local xMid = 21
local yTop = 7
local yThird = 19
local yQtr = 23
local yMid = 31
if card.rank == 1 then
drawPip(xMid, yMid)
elseif card.rank == 2 then
drawPip(xMid, yTop, false, true)
elseif card.rank == 3 then
drawPip(xMid, yTop, false, true)
drawPip(xMid, yMid)
elseif card.rank == 4 then
drawPip(xLeft, yTop, true, true)
elseif card.rank == 5 then
drawPip(xLeft, yTop, true, true)
drawPip(xMid, yMid)
elseif card.rank == 6 then
drawPip(xLeft, yTop, true, true)
drawPip(xLeft, yMid, true)
elseif card.rank == 7 then
drawPip(xLeft, yTop, true, true)
drawPip(xLeft, yMid, true)
drawPip(xMid, yThird)
elseif card.rank == 8 then
drawPip(xLeft, yTop, true, true)
drawPip(xLeft, yMid, true)
drawPip(xMid, yThird, false, true)
elseif card.rank == 9 then
drawPip(xLeft, yTop, true, true)
drawPip(xLeft, yQtr, true, true)
drawPip(xMid, yMid)
elseif card.rank == 10 then
drawPip(xLeft, yTop, true, true)
drawPip(xLeft, yQtr, true, true)
drawPip(xMid, 16, false, true)
end
end
end
local cardSpacing = 60
local marginX = 10
for cardIndex, card in ipairs(dealerHand) do
local dealerMarginY = 30
if not roundOver and cardIndex == 1 then
love.graphics.setColor(1, 1, 1)
love.graphics.draw(images.card_face_down, marginX, dealerMarginY)
else
drawCard(card, ((cardIndex - 1) * cardSpacing) + marginX, dealerMarginY)
end
end
for cardIndex, card in ipairs(playerHand) do
drawCard(card, ((cardIndex - 1) * cardSpacing) + marginX, 140)
end
love.graphics.setColor(0, 0, 0)
if roundOver then
love.graphics.print('Total: '..getTotal(dealerHand), marginX, 10)
else
love.graphics.print('Total: ?', marginX, 10)
end
love.graphics.print('Total: '..getTotal(playerHand), marginX, 120)
if roundOver then
local function hasHandWon(thisHand, otherHand)
return getTotal(thisHand) <= 21
and (
getTotal(otherHand) > 21
or getTotal(thisHand) > getTotal(otherHand)
)
end
local function drawWinner(message)
love.graphics.print(message, marginX, 268)
end
if hasHandWon(playerHand, dealerHand) then
drawWinner('Player wins')
elseif hasHandWon(dealerHand, playerHand) then
drawWinner('Dealer wins')
else
drawWinner('Draw')
end
end
local function drawButton(button)
if isMouseInButton(button) then
love.graphics.setColor(1, .8, .3)
else
love.graphics.setColor(1, .5, .2)
end
love.graphics.rectangle('fill', button.x, button.y, button.width, button.height)
love.graphics.setColor(1, 1, 1)
love.graphics.print(button.text, button.x + button.textOffsetX, button.y + button.textOffsetY)
end
if not roundOver then
drawButton(buttonHit)
drawButton(buttonStand)
else
drawButton(buttonPlayAgain)
end
end