⚠️ Warning: This is a draft ⚠️
This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.
If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.
import Base.show
const sorteddeck = reshape([string(r == 'T' ? "10" : r) * s for r in "23456789TJQKA", s in "♣♦♥♠"], 52)
isvaliddeck(a) = (s = Vector{UInt8}(unique(a)); (a == s && all(x -> 0 < x <= 52, s)))
mutable struct Deck
cards::Vector{UInt8}
Deck(a) = if isvaliddeck(a) new(a) else throw("bad deck constructor $a") end
end
suitrank(crd) = divrem((crd - 1), 13) .+ 1
cardsuit(crd) = suitrank(crd)[1]
cardrank(crd) = suitrank(crd)[2]
shuffledeck!(d) = shuffle!(d.cards)
ascards(d::Deck) = [sorteddeck[i] for i in d.cards]
Base.show(io::IO, d::Deck) = show(io, join(ascards(d), " "))
byrank(d::Deck) = filter(!isempty, [filter(x -> x in n:13:52, d.cards) for n in 1:13])
printbyrank(d) = foreach(x -> println(map(y -> sorteddeck[y], x)), byrank(d))
function deal!(d::Deck, hlen)
if hlen < length(d.cards)
hand = Deck(d.cards[1:hlen])
d.cards = d.cards[hlen+1:end]
else
hand = Deck(d.cards)
empty!(d.cards)
end
return hand
end
function queryprompt(query, choices, choicetxt="")
carr = map(x -> uppercase(strip(string(x))), collect(choices))
while true
print(query, " ", choicetxt == "" ? carr : choicetxt, ": ")
choice = uppercase(strip(readline(stdin)))
if choice in carr
return choice
end
println()
end
end
function gofish()
ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]
displayplayer(d, l, cl) = (println("Player hand is"), printbyrank(d),
println(".\nYour score is $(length(l)) books. Computer score is $(length(cl)) books."))
discardfrom!(a, d) = (dis = Deck(a); d.cards = filter(x -> !(x in a), d.cards); dis)
books!(d, l) = (b = [discardfrom!(a, d) for a in byrank(d) if length(a) == 4]; append!(l, b); b)
function cardswithrank(rankstring, d)
r = indexin([rankstring], ranks)[1]
if r == nothing
return []::Vector{Int}
else
arr = findall(x -> cardrank(x) == r, d.cards)
end
d.cards[arr]
end
function moverank!(rnk, srcdeck, dstdeck)
arr = cardswithrank(rnk, srcdeck)
srcdeck.cards = sort(filter(x -> !(x in arr), srcdeck.cards))
dstdeck.cards = sort(unique(append!(dstdeck.cards, arr)))
end
function drawacard!(d, maindeck, display=true)
if isempty(maindeck.cards)
println("Draw pile is empty.")
return
end
crd = popfirst!(maindeck.cards)
d.cards = sort(push!(d.cards, crd))
if display
println("You drew a ", Deck([crd]))
end
end
function playerasks!(d, plaid, claid, cdeck, maindeck)
choice = ""
while true
if isempty(cdeck.cards)
drawacard!(cdeck, maindeck, false)
end
if isempty(d.cards)
drawacard!(d, maindeck)
end
if isempty(d.cards)
return
end
displayplayer(d, plaid, claid)
choice = queryprompt("Your turn. Rank you request? ", ranks)
if isempty(cardswithrank(choice, d))
println("You cannot ask for \"$choice\" cards since you have none.")
continue
end
println("You want the \"$choice\" cards.")
if (n = length(cardswithrank(choice, cdeck))) > 0
moverank!(choice, cdeck, d)
println("Computer gives you $n of the \"$choice\" cards.")
choice = queryprompt("Ask computer for cards again? ", ["Y", "N"])
if choice == "N"
break
end
else
println("Sorry, computer does not have any of those cards.")
break
end
end
end
function playerdiscards!(pd, plaid)
choice = queryprompt("Discard cards? ", ["Y","N"])
if choice == "Y"
bks = books!(pd, plaid)
println(length(bks) > 0 ? "Books: $(join(map(ascards, bks), ", ")))" : "No new books.")
end
end
function computerasks!(cdeck, claid, pdeck, maindeck, memory)
choice = ""
while true
if isempty(pdeck.cards)
drawacard!(pdeck, maindeck)
end
if isempty(cdeck.cards)
drawacard!(pdeck, maindeck, false)
end
if isempty(cdeck.cards)
return
end
rankpick = 0
while true
r = rand(cdeck.cards)
rankpick = cardrank(r)
if haskey(memory, rankpick) && memory[rankpick] > 0
memory[rankpick] -= 1
continue
else
memory[rankpick] = 3
break
end
end
choice = ranks[rankpick]
println("Computer asks you for \"$choice\" cards.")
if (n = length(cardswithrank(choice, pdeck))) > 0
moverank!(choice, pdeck, cdeck)
println("Computer accepts $n \"$choice\" cards from you.")
else
println("Computer cannot get those cards from you.")
return
end
end
end
function computerdiscards!(cdec, claid)
bks = books!(cdec, claid)
if length(bks) > 0
println("Computer new books: ", join(map(ascards, bks), ", "))
end
end
fishd = Deck(shuffle(collect(1:52)))
println("------------GO FISH GAME------------\n\nDealing:")
pdeck = deal!(fishd, 9)
cdeck = deal!(fishd, 9)
println("You are dealt $pdeck.")
plaid = Vector{Deck}()
claid = Vector{Deck}()
memory= Dict{Int,Int}()
while sum(length, [pdeck.cards, cdeck.cards, fishd.cards]) > 0
playerasks!(pdeck, plaid, claid, cdeck, fishd)
playerdiscards!(pdeck, plaid)
drawacard!(pdeck, fishd)
computerasks!(cdeck, claid, pdeck, fishd, memory)
computerdiscards!(cdeck, claid)
drawacard!(cdeck, fishd, false)
end
pscore = length(plaid)
cscore = length(claid)
println("Player has taken out $pscore books, and computer has taken out $cscore books.")
println(pscore > cscore ? "Player wins." : pscore < cscore ? "Computer wins." : "Tied game.")
end
gofish()