War card game: Difference between revisions
Content added Content deleted
Line 498: | Line 498: | ||
Player 1 wins the game. |
Player 1 wins the game. |
||
</pre> |
</pre> |
||
=={{header|Lua}}== |
|||
{{libheader|LÖVE}} |
|||
<lang Lua>-- main.lua |
|||
function newGame () |
|||
-- new deck |
|||
local deck = {} |
|||
for iSuit = 1, #CardSuits do |
|||
for iRank = 1, #CardRanks do |
|||
local card = { |
|||
iSuit = iSuit, |
|||
iRank = iRank, |
|||
suit = CardSuits[iSuit], |
|||
rank = iRank, |
|||
name = CardRanks[iRank] .. CardSuits[iSuit] |
|||
} |
|||
local i = math.random (#deck + 1) |
|||
table.insert (deck, i, card) |
|||
end |
|||
end |
|||
-- new deal |
|||
Players = { |
|||
{index = 1, cards = {}}, |
|||
{index = 2, cards = {}}, |
|||
} |
|||
for i = 1, #deck/#Players do |
|||
for iPlayer = 1, #Players do |
|||
table.insert (Players[iPlayer].cards, table.remove(deck)) |
|||
end |
|||
end |
|||
WarCards = {} |
|||
Turn = 1 |
|||
Statistics = {} |
|||
end |
|||
function getHigherCard (cardA, cardB) |
|||
if cardA.rank > cardB.rank then |
|||
return cardA, 1 |
|||
elseif cardA.rank < cardB.rank then |
|||
return cardB, 2 |
|||
else |
|||
return nil |
|||
end |
|||
end |
|||
function love.load() |
|||
-- there is no card suits in the standard font |
|||
CardSuits = {"@", "#", "$", "%"} |
|||
CardRanks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "V", "Q", "K", "A"} |
|||
newGame () |
|||
end |
|||
function love.draw() |
|||
for iPlayer = 1, #Players do |
|||
local player = Players[iPlayer] |
|||
love.graphics.print ('Player '..player.index, 50*(iPlayer-1), 0) |
|||
for iCard, card in ipairs (player.cards) do |
|||
love.graphics.print (card.name, 50*(iPlayer-1), 14*iCard) |
|||
end |
|||
end |
|||
for i = 1, math.min(40, #Statistics) do |
|||
local str = Statistics[i] |
|||
love.graphics.print (str, 150, 20+(i-1)*14) |
|||
end |
|||
end |
|||
function makeTurn () |
|||
local card1 = table.remove (Players[1].cards) |
|||
local card2 = table.remove (Players[2].cards) |
|||
if card1 and card2 then |
|||
table.insert (WarCards, 1, card1) |
|||
table.insert (WarCards, math.random (1, 2), card2) |
|||
local winCard, index = getHigherCard (card1, card2) |
|||
if winCard then |
|||
table.insert (Statistics, 1, Turn .. ' Player ' .. index .. ' get ' .. #WarCards .. ' cards: ' .. card1.name .. ' vs ' .. card2.name) |
|||
for iCard = #WarCards, 1, -1 do |
|||
table.insert (Players[index].cards, 1, table.remove (WarCards)) |
|||
end |
|||
elseif (#Players[1].cards > 0) and (#Players[2].cards > 0) then |
|||
-- start war |
|||
table.insert (Statistics, 1, Turn .. ' War: ' .. card1.name .. ' vs ' .. card2.name) |
|||
table.insert (WarCards, table.remove (Players[1].cards)) |
|||
table.insert (WarCards, table.remove (Players[2].cards)) |
|||
else |
|||
local index = 2 |
|||
if #Players[1].cards == 0 then index = 1 end |
|||
table.insert (Statistics, 1, Turn .. ' Player ' .. index .. ' has no cards for this war.') |
|||
-- GameOver = true |
|||
end |
|||
Turn = Turn + 1 |
|||
elseif GameOver then |
|||
GameOver = false |
|||
newGame () |
|||
else |
|||
local index = 2 |
|||
if #Players[1].cards > #Players[2].cards then index = 1 end |
|||
table.insert (Statistics, 1, Turn .. ' Player ' .. index .. ' wins the game!') |
|||
GameOver = true |
|||
end |
|||
end |
|||
function love.keypressed(key, scancode, isrepeat) |
|||
if false then |
|||
elseif key == "space" then |
|||
makeTurn () |
|||
elseif scancode == "n" then |
|||
GameOver = false |
|||
newGame () |
|||
elseif scancode == "q" then |
|||
local lastTurn = Turn |
|||
while not (GameOver or (Turn > lastTurn + 10000-1)) do |
|||
makeTurn () |
|||
end |
|||
elseif key == "escape" then |
|||
love.event.quit() |
|||
end |
|||
if #Statistics > 40 then |
|||
local i = #Statistics, 40, -1 do |
|||
table.remove (Statistics, i) |
|||
end |
|||
end |
|||
end |
|||
function love.mousepressed( x, y, button, istouch, presses ) |
|||
if button == 1 then -- left mouse button |
|||
makeTurn () |
|||
elseif button == 2 then -- right mouse button |
|||
end |
|||
end |
|||
</lang> |
|||
=={{header|Nim}}== |
=={{header|Nim}}== |