$running = true; $gameover = false; @digits = (0,0,0); $score = 0; $guess = 0; $attempt = 0; sub askQuestion { ($prompt) = @_; while(true) { print "$prompt? "; $ans = uc <>; chomp($ans); if($ans ne "") { return $ans; } print "PLEASE ANSWER THE QUESTION.\n" } } sub getIntInput { ($prompt) = @_; while(true) { print "$prompt "; $ans = <>; chomp($ans); if(isAnInt($ans) eq true) { return int($ans); } print "YOU DID NOT ENTER AN INTEGER.\n" } } sub isAnInt { ($input) = @_; if($input =~ /^[-*\d]+$/) { return true; } } sub askBinaryQuestion { ($prompt) = @_; while(true) { $ans = askQuestion($prompt); if($ans eq "YES" or $ans eq "Y") { return true; } if($ans eq "NO" or $ans eq "N") { return false; } print "PLEASE ANSWER \"YES\" OR \"NO\"\n"; } } sub askToPlayAgain { return askBinaryQuestion("DO YOU WANT TO PLAY AGAIN"); } sub askToSeeTheRules { return askBinaryQuestion("DO YOU WANT TO SEE THE RULES"); } sub generateRandomNumber { ($minimum) = @_[0]; ($maximum) = @_[1]; ($show) = @_[2]; $value = int(rand($maximum) + $minimum); if($show eq true) { print "$value\n"; } return $value; } sub makeIntFromArray { (@arrayIn) = @_; return ($arrayIn[0] * 100) + ($arrayIn[1] * 10) + $arrayIn[2]; } sub makeArrayFromInt { ($valIn) = @_; @retArray = (0,0,0); $retArray[0] = int($valIn / 100); $retArray[1] = int(($valIn - ($retArray[0] * 100)) / 10); $retArray[2] = $valIn - ($retArray[0] * 100) - ($retArray[1] * 10); return @retArray; } sub askForGuess { ($attempt) = @_; while(true) { $guess = getIntInput("GUESS #$attempt"); if($guess < 0) { print "PLEASE GUESS A NON-NEGATIVE NUMBER.\n"; } elsif($guess < 100 || $guess > 999) { print "PLEASE GUESS A NUMBER BETWEEN 100 AND 999.\n"; } else { return $guess; } } } sub displayRules { print "I WILL THINK OF A THREE-DIGIT NUMBER. YOU WILL TRY TO\n"; print "GUESS MY NUMBER AND I WILL GIVE YOU CLUES AS FOLLOWS:\n"; print " PICO - ONE DIGIT CORRECT BUT IN THE WRONG POSITION\n"; print " FERMI - ONE DIGIT CORRECT AND IN THE RIGHT POSITION\n"; print " BAGELS - NO DIGITS ARE CORRECT\n\n"; print "YOU GET TWENTY TRIES BEFORE YOU LOSE.\n\n"; } sub displayGameOver { $number = makeIntFromArray(@digits); print "OH WELL, THAT'S TWENTY GUESSES.\n"; print "MY NUMBER WAS $number.\n"; } sub createTheNumber { $digits[0] = generateRandomNumber(1, 9, false); $gotDigit = false; while($gotDigit ne true) { $digits[1] = generateRandomNumber(0, 9, false); if($digits[1] != $digits[0]) { $gotDigit = true; } } $gotDigit = false; while($gotDigit ne true) { $digits[2] = generateRandomNumber(0, 9, false); if($digits[2] != $digits[0] && $digits[2] != $digits[1]) { $gotDigit = true; } } return @digits; } sub checkGuess { ($guess) = @_; @temp = makeArrayFromInt($guess); @vals = (0,0,0); if($temp[0] == $digits[0]){ $vals[0] = 1; } if($temp[1] == $digits[1]){ $vals[1] = 1; } if($temp[2] == $digits[2]){ $vals[2] = 1; } if(makeIntFromArray(@vals) == 111) { return true; } if($vals[0] == 0) { if($temp[0] == $digits[1] || $temp[0] == $digits[2]) { $vals[0] = 2; } } if($vals[1] == 0) { if($temp[1] == $digits[0] || $temp[1] == $digits[2]) { $vals[1] = 2; } } if($vals[2] == 0) { if($temp[2] == $digits[0] || $temp[2] == $digits[1]) { $vals[2] = 2; } } if(makeIntFromArray(@vals) == 0) { print "BAGELS\n"; } else { if($vals[0] == 1) { print "FERMI "; } if($vals[0] == 2) { print "PICO "; } if($vals[1] == 1) { print "FERMI "; } if($vals[1] == 2) { print "PICO "; } if($vals[2] == 1) { print "FERMI"; } if($vals[2] == 2) { print "PICO"; } print "\n"; } return false; } print "*** BAGELS : PERL ***\n"; $running = true; if(askToSeeTheRules() eq true) { displayRules(); } $score = 0; while($running eq true) { $attempt = 1; @digits = createTheNumber(); print "OK, I HAVE A NUMBER IN MIND.\n"; $gameover = false; while($gameover eq false) { $guess = askForGuess($attempt); if(checkGuess($guess) eq true) { print "YOU GOT IT!!!\n"; $score++; $gameover = true; } else { $attempt++; if($attempt > 20) { displayGameOver(@digits); $gameover = true; } } } print "*** GAME OVER ***\n"; $running = askToPlayAgain(); } print "A $score POINT BAGELS BUFF!\n"; print "HOPE YOU HAD FUN. BYE!\n";