Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
224
Task/Go-Fish/Red/go-fish.red
Normal file
224
Task/Go-Fish/Red/go-fish.red
Normal file
|
|
@ -0,0 +1,224 @@
|
|||
Red [
|
||||
Title: "Go Fish"
|
||||
Author: "gltewalt"
|
||||
]
|
||||
|
||||
chand: [] ;-- c and p = computer and player
|
||||
cguesses: []
|
||||
phand: []
|
||||
cbooks: 0
|
||||
pbooks: 0
|
||||
gf: {
|
||||
***************
|
||||
* GO FISH *
|
||||
***************
|
||||
}
|
||||
pip: ["a" "2" "3" "4" "5" "6" "7" "8" "9" "10" "j" "q" "k"] ;-- suits are not relevant
|
||||
pile: [] ;-- where discarded cards go
|
||||
|
||||
;---------------------
|
||||
; Helper functions -
|
||||
;---------------------
|
||||
|
||||
clear-screen: does [
|
||||
"clears the console"
|
||||
call/console either system/platform = 'Linux ["clear"]["cls"]
|
||||
]
|
||||
|
||||
clear-and-show: func [duration str][
|
||||
{
|
||||
Poor persons animation.
|
||||
Blips message to screen after a pause of duration length.
|
||||
|
||||
}
|
||||
clear-screen
|
||||
print str
|
||||
wait duration
|
||||
clear-screen
|
||||
]
|
||||
|
||||
deal-cards: func [num hand][
|
||||
loop num [
|
||||
append hand rejoin [trim/all form take deck]
|
||||
]
|
||||
]
|
||||
|
||||
find-in: func [blk str][
|
||||
"Finds a string value in a block. Series in series."
|
||||
foreach i blk [if find i str [return i]]
|
||||
]
|
||||
|
||||
go-fish: func [num hand][
|
||||
either not empty? deck [
|
||||
deal-cards num hand
|
||||
][
|
||||
append hand rejoin [trim/all form take pile] ;-- take from pile if deck is empty
|
||||
]
|
||||
]
|
||||
|
||||
guess-from: func [hand guessed][
|
||||
{
|
||||
Randomly picks from hand minus guessed.
|
||||
|
||||
Simulates a person asking for different cards on
|
||||
their next turn if their previous guess resulted
|
||||
in a Go Fish.
|
||||
}
|
||||
random/seed now/time
|
||||
either any [empty? guessed empty? exclude hand guessed][
|
||||
random/only hand
|
||||
][
|
||||
random/only exclude hand guessed
|
||||
]
|
||||
]
|
||||
|
||||
make-deck: function [] [
|
||||
"make-deck and shuffle from https://rosettacode.org/wiki/Playing_cards#Red"
|
||||
new-deck: make block! 52
|
||||
foreach p pip [loop 4 [append/only new-deck p]]
|
||||
return new-deck
|
||||
]
|
||||
|
||||
show-cards: does [
|
||||
clear-and-show 0 ""
|
||||
print [newline "Player cards:" newline sort phand newline]
|
||||
print ["Computer books:" cbooks]
|
||||
print ["Player books:" pbooks newline]
|
||||
]
|
||||
|
||||
shuffle: function [deck [block!]] [deck: random deck]
|
||||
|
||||
;------------- end of helper functions -----------------
|
||||
|
||||
check-for-books: func [
|
||||
{
|
||||
Checks for a book in a players hand.
|
||||
Increments the players book score, and
|
||||
discards the book from the players hand
|
||||
}
|
||||
hand "from or to hand"
|
||||
kind "rank of cards"
|
||||
/local
|
||||
c "collected"
|
||||
][
|
||||
c: collect [
|
||||
forall hand [keep find hand/1 kind]
|
||||
]
|
||||
remove-each i c [none = i]
|
||||
if 4 = length? c [
|
||||
either hand = phand [pbooks: pbooks + 1][cbooks: cbooks + 1]
|
||||
remove-each i hand [if find/only c i [i]] ;-- remove book from hand
|
||||
forall c [append pile c/1] ;-- append discarded book to the pile
|
||||
]
|
||||
]
|
||||
|
||||
transfer-cards: func [
|
||||
"Transfers cards from player to player"
|
||||
fhand "from hand"
|
||||
thand "to hand"
|
||||
kind "rank of cards"
|
||||
/local
|
||||
c "collected"
|
||||
][
|
||||
c: collect [forall fhand [keep find fhand/1 kind]]
|
||||
remove-each i c [none = i] ;-- remove none values from collected
|
||||
forall c [append thand c/1] ;-- append remaining values to "to hand"
|
||||
remove-each i fhand [if find/only c i [i]] ;-- remove those values from "from hand"
|
||||
]
|
||||
|
||||
computer-turn: func [
|
||||
fhand "from hand"
|
||||
thand "to hand"
|
||||
kind "rank of cards"
|
||||
/local
|
||||
a
|
||||
][
|
||||
a: ask rejoin ["Do you have any " kind " s? "]
|
||||
if a = "x" [halt]
|
||||
either any [a = "y" a = "yes"][
|
||||
check-for-books thand kind
|
||||
transfer-cards fhand thand kind
|
||||
show-cards
|
||||
computer-turn fhand thand guess-from thand cguesses
|
||||
][
|
||||
clear-and-show 0.4 gf
|
||||
go-fish 1 thand
|
||||
append cguesses kind
|
||||
]
|
||||
]
|
||||
|
||||
player-turn: func [
|
||||
fhand "from hand"
|
||||
thand "to hand"
|
||||
kind "rank of cards"
|
||||
/local
|
||||
p
|
||||
][
|
||||
if empty? fhand [go-fish 3 fhand]
|
||||
|
||||
if none? find-in thand kind [ ;-- player has to hold rank asked for
|
||||
clear-and-show 1.0
|
||||
"You have to have that rank in your hand to ask for it.^/Computers turn..."
|
||||
exit
|
||||
]
|
||||
|
||||
either find-in fhand kind [
|
||||
check-for-books thand kind
|
||||
transfer-cards fhand thand kind
|
||||
show-cards
|
||||
if find-in thand kind [
|
||||
p: ask "Your guess: "
|
||||
either p = "x" [halt][player-turn fhand thand p]
|
||||
check-for-books thand p
|
||||
]
|
||||
][
|
||||
clear-and-show 0.4 gf
|
||||
go-fish 1 thand
|
||||
]
|
||||
]
|
||||
|
||||
game-round: has [c p][
|
||||
print {
|
||||
-------------------
|
||||
- COMPUTER TURN -
|
||||
-------------------
|
||||
}
|
||||
|
||||
if empty? chand [ ; computer has no more cards? fish 3 cards.
|
||||
go-fish 3 chand
|
||||
show-cards
|
||||
]
|
||||
computer-turn phand chand c: guess-from chand cguesses
|
||||
check-for-books chand c
|
||||
show-cards
|
||||
|
||||
print {
|
||||
-------------------
|
||||
- PLAYER TURN -
|
||||
-------------------
|
||||
}
|
||||
|
||||
if empty? phand [ ;-- player has no more cards? fish 3 cards.
|
||||
go-fish 3 phand
|
||||
show-cards
|
||||
]
|
||||
p: ask "Your guess: "
|
||||
either p = "x" [halt][player-turn chand phand find-in phand p]
|
||||
check-for-books phand p
|
||||
show-cards
|
||||
]
|
||||
|
||||
main: does [
|
||||
deck: shuffle make-deck
|
||||
deal-cards 9 chand
|
||||
deal-cards 9 phand
|
||||
show-cards
|
||||
while [cbooks + pbooks < 13][
|
||||
game-round
|
||||
]
|
||||
clear-and-show 0 ""
|
||||
print "GAME OVER"
|
||||
print [newline "Computer books:" cbooks newline "Player books:" pbooks]
|
||||
]
|
||||
|
||||
main
|
||||
Loading…
Add table
Add a link
Reference in a new issue