Go Fish: Difference between revisions

13,210 bytes added ,  18 days ago
(r→‎{{header|V (Vlang)}}: Rename "Vlang" in "V (Vlang)")
Line 242:
Loop
End
</syntaxhighlight>
 
"=={{header|FutureBasic}}=="
<syntaxhighlight lang="futurebasic">
 
/*
 
Go Fish
-- Rich Love --
 
FutureBasic app for Macintosh
Get the latest FutureBasic here
http://www.brilorsoftware.com/fb/pages/home.html
 
*/
 
 
_window = 1
begin enum 1
_scrollView
_textView
end enum
 
override _forLoopsAlwaysExecuteAtLeastOnce = _true
 
begin globals
 
str255 cards
cards = "A234567890JQK"
short play(13), Computer(13), deck(13), guess(13), poss(13), asked(13)
str255 YourName, Someone,RequestedCard
bool gNeedToClearScreen
short Points(2) : Points(0) = 0 : Points(1) = 0
short i, k, j, CardNumber
short RemainingCards
 
end globals
 
 
local fn CheckForFaceCard(TheCard as short) as str255
str255 WantsCard
WantsCard = str$(TheCard)
WantsCard = Mid$(cards,k,1)
if TheCard = 0 then WantsCard = "10"
if TheCard = 11 then WantsCard = "jack"
if TheCard = 12 then WantsCard = "Queen"
if TheCard = 13 then WantsCard = "King"
if TheCard = 1 then WantsCard = "Ace"
end fn = WantsCard
 
 
void local fn PrintViewScrollToBottom( printView as ViewRef )
BeginCCode
NSScrollView *scrollView = [printView enclosingScrollView];
NSClipView *clipView = [scrollView contentView];
[clipView scrollToPoint:NSMakePoint(0,printView.frame.size.height-scrollView.contentSize.height + 20)];
[scrollView reflectScrolledClipView:clipView];
EndC
end fn
 
 
void local fn DealCards
RemainingCards -= 1
short sc
sc = rnd(RemainingCards)
For k = 1 To 13
sc -= deck(k)
If sc <= 0 Then exit fn
Next k
End fn
 
void local fn youGoFishing
fn DealCards
str255 WantsCard
WantsCard = fn CheckForFaceCard(k)
if WantsCard = "0" then WantsCard = "10"
Print " " + WantsCard + "."
deck(k) -= 1
play(k) += 1
End fn
 
void local fn cpuGoFishing
fn DealCards
Print " a card from the deck."
deck(k) -= 1
Computer(k) += 1
End fn
 
 
local fn InitCards
cards = "A234567890JQK"
RemainingCards = 4 * len$(cards) // the length of cards is 13. There are 4 suits of cards. so RemainingCards is 52
i = 0:k = 0:j = 0:CardNumber = 0
for i = 0 to 1
Points(i) = 0
next i
FOR i = 1 TO 13 ' Reset each element to 0
play(i) = 0
Computer(i) = 0
deck(i) = 0
guess(i) = 0
poss(i) = 0
asked(i) = 0
NEXT i
For i = 1 To 13
deck(i) = 4
Next i
For i = 1 To 9
fn DealCards
deck(k) -= 1
Computer(k) += 1
fn DealCards
deck(k) -= 1
play(k) += 1
Next i
end fn
 
 
void local fn CheckForCompletedBook
For i = 1 To 13
If play(i) <> 4
Else
text ,,fn colorcyan
str255 WantsCard
WantsCard = Mid$(cards,i,1)
if WantsCard = "j" or WantsCard = "J" then WantsCard = "Jack"
if WantsCard = "q" or WantsCard = "Q" then WantsCard = "Queen"
if WantsCard = "k" or WantsCard = "K" then WantsCard = "King"
if WantsCard = "a" or WantsCard = "A" then WantsCard = "Ace"
if WantsCard = "0" then WantsCard = "10"
Print YourName + " completed the book of " + WantsCard + "'s."
text ,,fn colorWhite
play(i) = 0
Points(0) += 1
fn PrintViewScrollToBottom( fn WindowPrintView(1))
End If
Next i
End fn
 
local fn CheckCPUForCompletedBook
For i = 1 To 13
If Computer(i) <> 4
Else
text ,,fn colorCyan
str255 WantsCard
WantsCard = Mid$(cards,i,1)
if WantsCard = "j" or WantsCard = "J" then WantsCard = "Jack"
if WantsCard = "q" or WantsCard = "Q" then WantsCard = "Queen"
if WantsCard = "k" or WantsCard = "K" then WantsCard = "King"
if WantsCard = "a" or WantsCard = "A" then WantsCard = "Ace"
if WantsCard = "0" then WantsCard = "10"
Print "CPU completed the book of " + WantsCard + "'s."
text ,,fn colorWhite
Computer(i) = 0
Points(1) += 1
fn PrintViewScrollToBottom( fn WindowPrintView(1))
End If
Next i
End fn
 
local fn QuitOrPlayAlert(GameResult as CFStringRef)
alert -2,,GameResult,@"Game Over",@"Quit;Play Again"
AlertButtonSetKeyEquivalent( 2, 2, @"\e" )
short result
result = alert 2
if ( result != NSAlertSecondButtonReturn ) then end
end fn
 
local fn QuitOrResumeAlert(GameResult as CFStringRef)
alert -3,,GameResult,@"Quit the game?",@"Quit;Resume game"
AlertButtonSetKeyEquivalent( 3, 2, @"\e" )
short result
result = alert 3
if ( result != NSAlertSecondButtonReturn ) then end
end fn
 
local fn CheckForEndGame as boolean
bool PlayAgain = _False
short np = 0, nc = 0
For i = 1 To 13
np += play(i)
nc += Computer(i)
Next i
If RemainingCards = <0 Or np = 0 Or nc = 0
text ,,fn colorRed
Print "*** Game Over! ***"
Print
If Points(0) < Points(1)
Print "The CPU has won."
print:print
fn QuitOrPlayAlert(@"the CPU won!")
PlayAgain = _True
Else if Points(0) > Points(1)
Print YourName + " has won."
print:print
fn QuitOrPlayAlert(@"You Won!")
PlayAgain = _True
Else
Print "­It's a tie!"
fn QuitOrPlayAlert(@"It's a tie!.")
PlayAgain = _True
End If
fn PrintViewScrollToBottom( fn WindowPrintView(1) )
End If
PlayAgain = _True
End If
 
End fn = PlayAgain
 
 
void local fn Intro
text ,,fn colorGreen
Print " __ _ _ "
Print " __ _ ___ / _(_)___| |__ "
Print " / ` |/ _ \ | |_| / __| '_ \ "
Print "| (_) | (_) | | _| \__ \ | | | "
Print " \__, |\___/ |_| |_|___/_| |_| "
Print " |___/ "
Print ""
text ,,fn colorCyan
print %(301,90),"( x to exit the game )"
text ,,fn colorWhite
print " Go Fish Rules:"
print
print " You are playing against the CPU."
print " You are dealt nine cards to start with."
print " The remaining cards are placed face down in the center of the table"
print " to form the draw pile (the fish pond)."
print " On your turn, you ask the CPU for a card."
print " You must already have at least one card of a given rank to ask for more."
print " (A rank is one or more of any card.)"
print " If the CPU has any cards of the named rank, it must hand over all such cards,"
print " and you can then ask again."
print " If the CPU has no cards of the named rank, a card will be drawn from the pile,"
print " and placed in your hand, which then ends your turn."
print " A book is a collection of four cards in a given rank."
print " Whenever you complete a book, it will be removed from your hand."
print " If at any time, your hand is empty, a new card will be drawn from the pile."
print " The game ends when every book is complete,"
print " or there are no more cards left in the pile."
print " The player with the most books wins."
CFStringRef UserInput
UserInput = input % (300, 70), @"What's your name?: "
fn CFStringGetPascalString (UserInput, @YourName, 256, _kCFStringEncodingMacRoman)
gNeedToClearScreen = _True
cls
if YourName = "X" or YourName = "x" then fn QuitOrResumeAlert(@"EXIT")
End fn
 
 
local fn WhatCardInputHeight as short
CGRect mainScreenFrame = fn ScreenMainFrame
float InputHeight = int(mainScreenFrame.size.height - 120)
end fn = InputHeight
 
 
local fn BuildWindow
// ---> Get the size of the Main Screen. <---
CGRect mainScreenFrame = fn ScreenMainFrame
float msh = mainScreenFrame.size.height
CGRect r = fn CGRectMake( 0, 0, 600, int(msh) - 110)
window 1, @"Go Fish", r
windowcenter(1)
WindowSetBackgroundColor(1,fn ColorBlack)
end fn
 
'--- Start ---
 
fn BuildWindow
 
fn Intro
 
fn InitCards
 
str255 AddTheS
bool RequestCard = _false
short v = 0
short po = 0
boolean ShowHand = _false
str255 WantsCard
 
"Main"
 
ShowHand = _false
short loopcounter = 0
 
While ShowHand = _false
text ,,fn colorGreen
Print Chr$(10) + "Points >> ";
text ,,fn colorYellow
print YourName + ": ";
text ,,fn colorGreen
print Points(0);
text ,,fn colorOrange
print " CPU: ";
text ,,fn colorGreen
print Points(1)
text ,,fn colorWhite
Print Chr$(10) + " " + str$(RemainingCards) + " remaining cards"
text ,,fn colorWhite
/*
// Uncomment this to see the CPU's cards for testing
Print Chr$(10) + "CPU Cards: ";
For i = 1 To 13
if Computer(i) <> 0
For j = 1 To Computer(i)
if Mid$(cards,i,1) = "0"
Print @"10"; " ";
else
Print Mid$(cards,i,1); " ";
end if
Next j
End If
Next i
Print
fn PrintViewScrollToBottom( fn WindowPrintView(1))
*/
Print Chr$(10) + "Your Cards: ";
For i = 1 To 13
if play(i) <> 0
For j = 1 To play(i)
if Mid$(cards,i,1) = "0"
Print @"10"; " ";
else
Print Mid$(cards,i,1); " ";
end if
Next j
End If
Next i
Print
fn PrintViewScrollToBottom( fn WindowPrintView(1))
RequestCard = _false
While RequestCard = _false
if fn CheckForEndGame = _True then cls:fn InitCards:goto "Loop"
loopcounter ++
Someone = YourName
if gNeedToClearScreen = _False then fn PrintViewScrollToBottom( fn WindowPrintView(1) ):gNeedToClearScreen = _False
CFStringRef UserInput = 0
UserInput = input % (20, fn WhatCardInputHeight),@"What card do you want? "
fn CFStringGetPascalString (UserInput, @RequestedCard, 256, _kCFStringEncodingMacRoman)
if RequestedCard = "10" then RequestedCard = "0"// card zero is a 10
text ,,fn ColorYellow
Print
WantsCard = RequestedCard
if WantsCard = "j" or WantsCard = "J" then WantsCard = "Jack"
if WantsCard = "q" or WantsCard = "Q" then WantsCard = "Queen"
if WantsCard = "k" or WantsCard = "K" then WantsCard = "King"
if WantsCard = "a" or WantsCard = "A" then WantsCard = "Ace"
if WantsCard = "0" then WantsCard = "10"
print "-------------------------------------"
print
str255 AorAn
AorAn = "a"
if WantsCard = "Ace" then AorAn = "an"
print YourName + " asked for " + AorAn + " " + WantsCard
print
text ,,fn ColorWhite
fn PrintViewScrollToBottom( fn WindowPrintView(1))
if RequestedCard = "X" or RequestedCard = "x" then fn QuitOrResumeAlert(@"EXIT")
If RequestedCard <> "" Then CardNumber = Instr$(1,cards, Ucase$(RequestedCard)): RequestCard = _true
If CardNumber = 0
text,,fn ColorRed
Print "Sorry, that is not a valid card.": RequestCard = _false
print
fn PrintViewScrollToBottom( fn WindowPrintView(1))
Else if play(CardNumber) = 0 Then text ,,fn colorRed: Print "You don't have that card!": text ,,fn colorRed: RequestCard = _false
fn PrintViewScrollToBottom( fn WindowPrintView(1))
text,,fn ColorWhite
End If
// loopcounter should never reach 100 but just in case, prevent hangs
if loopcounter > 100 then loopcounter = 0:exit while
Wend
guess(CardNumber) = 1
If Computer(CardNumber) = 0
Print Someone + ",";
text ,,fn colorRed
Print " Go fish!"
text ,,fn colorWhite
Print Someone + " got a";: fn youGoFishing
print
fn CheckForCompletedBook
ShowHand = _true
Else
v = Computer(CardNumber)
Computer(CardNumber) = 0
play(CardNumber) += v
if v > 1 then AddTheS = "s" else AddTheS = ""
Print Someone + " got" + str$(v) + " card" + AddTheS
fn CheckForCompletedBook
fn PrintViewScrollToBottom( fn WindowPrintView(1))
ShowHand = _false
End If
// loopcounter should never reach 100 but just in case, prevent hangs
if loopcounter > 100 then loopcounter = 0:exit while
Wend
 
 
 
Someone = "CPU"
For i = 1 To 13
asked(i) = 0
Next i
 
bool CPUsTurn = _false
 
While CPUsTurn = _false
if fn CheckForEndGame = _True then cls:fn InitCards:goto "Loop"
po = 0
For i = 1 To 13
If (Computer(i) > 0) And (guess(i) > 0) Then poss(i) = 1: po += 1
Next i
If po = 0
// this k is the card the CPU gets after go fish
while computer(k) = 0 Or asked(k)
k = rnd(12)+1
wend
Else
// this k is the card you get after go fish
while poss(k) = 0
k = rnd(12) + 1
wend
guess(k) = 0
asked(k) = 1
end if
WantsCard = fn CheckForFaceCard(k)
if WantsCard = "j" or WantsCard = "J" then WantsCard = "Jack"
if WantsCard = "q" or WantsCard = "Q" then WantsCard = "Queen"
if WantsCard = "k" or WantsCard = "K" then WantsCard = "King"
if WantsCard = "a" or WantsCard = "A" then WantsCard = "Ace"
if WantsCard = "0" then WantsCard = "10"
text ,,fn ColorOrange
print "-------------------------------------"
 
Print:Print Someone + " wants your " + wantsCard + "'s."
print
text ,,fn ColorWhite
asked(k) = 1
If play(k) = 0
Print Someone + ", ";
text ,,fn colorRed: Print "go fish!"
text ,,fn colorWhite:Print Someone + " got";: fn cpuGoFishing
fn CheckCPUForCompletedBook
CPUsTurn = _true
Else
v = play(k)
play(k) = 0
Computer(k) += v
if v > 1 then AddTheS = "s" else AddTheS = ""
Print Someone + " got" + str$(v) + " card" + AddTheS
fn CheckCPUForCompletedBook
CPUsTurn = _false
End If
Wend
 
"Loop"
goto "Main"
 
 
handleevents
 
 
</syntaxhighlight>
 
37

edits