/* 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 //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) 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) + 1 // 5/2/24 Rich added + 1 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." if k > 13 then k = 13 deck(k) -= 1 Computer(k) += 1 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" || WantsCard = "J" then WantsCard = "Jack" if WantsCard = "q" || WantsCard = "Q" then WantsCard = "Queen" if WantsCard = "k" || WantsCard = "K" then WantsCard = "King" if WantsCard = "a" || 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" || WantsCard = "J" then WantsCard = "Jack" if WantsCard = "q" || WantsCard = "Q" then WantsCard = "Queen" if WantsCard = "k" || WantsCard = "K" then WantsCard = "King" if WantsCard = "a" || 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 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 fn CheckForCompletedBook // Rich added 5/1/24 fn CheckCPUForCompletedBook // Rich added 5/5/24 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 || np = 0 || 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 "InputYourName" UserInput = input % (300, 70), @"What's your name?: " if ( UserInput == NULL ) then "InputYourName" // Rich added this 5/1/24 fn CFStringGetPascalString (UserInput, @YourName, 256, _kCFStringEncodingMacRoman) cls if YourName = "X" || YourName = "x" || YourName = chr$(127) 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 str255 RequestedCard 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 CPUs 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" Someone = YourName CFStringRef UserInput = 0 "InputCard" UserInput = input % (20, fn WhatCardInputHeight),@"What card do you want? " if ( UserInput == NULL ) then "InputCard" // Rich added this 5/1/24 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" || WantsCard = "J" then WantsCard = "Jack" if WantsCard = "q" || WantsCard = "Q" then WantsCard = "Queen" if WantsCard = "k" || WantsCard = "K" then WantsCard = "King" if WantsCard = "a" || 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" || 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 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 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) && (guess(i) > 0) Then poss(i) = 1: po += 1 Next i short whilecounter WhileCounter = 0 If po = 0 // this k is the go fish card. k = rnd(12) +1 while Computer(k) = 0 || asked(k) whilecounter ++ k = rnd(12) +1 if WhileCounter > 100 then k = 0: exit while //5/5/24 Rich added this to prevent hangs wend Else k = rnd(12) + 1 while poss(k) = 0 k = rnd(12) + 1 if WhileCounter > 100 then k = 0: exit while //5/5/24 Rich added this to prevent hangs wend guess(k) = 0 asked(k) = 1 end if if k = 0 then "Loop" //5/5/24 Rich added this to prevent hangs WantsCard = fn CheckForFaceCard(k) if WantsCard = "j" || WantsCard = "J" then WantsCard = "Jack" if WantsCard = "q" || WantsCard = "Q" then WantsCard = "Queen" if WantsCard = "k" || WantsCard = "K" then WantsCard = "King" if WantsCard = "a" || 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