mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 07:10:42 -08:00
262 lines
6.6 KiB
Ruby
262 lines
6.6 KiB
Ruby
$landmines = Array.new
|
|
|
|
$currentLocation = "111"
|
|
|
|
$standings = 500 # starting amount
|
|
|
|
def getYesOrNoResponseTo prompt
|
|
print prompt
|
|
# strip leading and trailing whitespace from entry
|
|
yesno = gets.strip.upcase[0]
|
|
yesno == "Y"
|
|
end
|
|
|
|
def greeting
|
|
puts "CUBE".center(80)
|
|
puts "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY".center(80)
|
|
puts "\n\n\n"
|
|
response = getYesOrNoResponseTo "Do you want to see the INSTRUCTIONS?"
|
|
if response
|
|
puts "This is a game in which you will be playing against the"
|
|
puts "random decision of the computer. The field of play is a"
|
|
puts "cube of size 3. Any of your 27 locations can be designated"
|
|
puts "by inputting three numbers such as 231."
|
|
puts "At the start you are automatically at location 1,1,1.\n"
|
|
puts "The object of the game is to get to location 3,3,3.\n"
|
|
|
|
puts "\nONE MINOR DETAIL:"
|
|
puts "The computer will pick five random locations at which it will"
|
|
puts "plant land mines. if you hit one of these locations you lose.\n"
|
|
|
|
puts "\nONE OTHER DETAIL:"
|
|
puts "You may move only one space in one direction each move."
|
|
puts "For example: from 1,1,2 you may move to 2,1,2 or 1,1,3."
|
|
puts "You may not change more than one number on the same move."
|
|
puts "If you make an illegal move, you lose and the computer takes"
|
|
puts "the money you may have bet on that round."
|
|
puts ""
|
|
puts "When stating the amount of a wager, enter only the number"
|
|
puts "of dollars (example: 250) You are automatically started with"
|
|
puts "500 dollars in your account."
|
|
puts
|
|
puts "Good luck!"
|
|
end
|
|
end
|
|
|
|
def landMindStringFrom x, y, z
|
|
landMine = x.to_s + y.to_s + z.to_s
|
|
return landMine
|
|
end
|
|
|
|
def assignLandMines
|
|
$landmines.clear
|
|
|
|
# put five unique entries into the landmines array
|
|
while $landmines.size < 5 do
|
|
a = rand(3)+1
|
|
b = rand(3)+1
|
|
c = rand(3)+1
|
|
landmine = landMindStringFrom(a, b, c)
|
|
if !$landmines.include?(landmine) && landmine != "333"
|
|
# puts landmine # debugging
|
|
$landmines.push landmine
|
|
end
|
|
end
|
|
$currentLocation = "111"
|
|
end
|
|
|
|
def initializePot
|
|
$standings = 500 # starting amount
|
|
end
|
|
|
|
def startGame
|
|
assignLandMines
|
|
displayStandings
|
|
response = getYesOrNoResponseTo "WANT TO MAKE A WAGER? "
|
|
if response
|
|
print "HOW MUCH? "
|
|
while true do
|
|
wager = gets.strip.tr('^0-9', '').to_i
|
|
if $standings < wager
|
|
puts "TRIED TO FOOL ME; BET AGAIN ";
|
|
else
|
|
break
|
|
end
|
|
end
|
|
else
|
|
wager = 0
|
|
end
|
|
|
|
# start at location 1,1,1
|
|
$currentLocation = "111"
|
|
return wager
|
|
end
|
|
|
|
def goodbye
|
|
puts "TOUGH LUCK!"
|
|
puts ""
|
|
puts "GOODBYE."
|
|
exit
|
|
end
|
|
|
|
def bust
|
|
puts "YOU BUST."
|
|
goodbye
|
|
end
|
|
|
|
def tryAgain
|
|
again = getYesOrNoResponseTo "WANT TO TRY AGAIN? "
|
|
if not again
|
|
exit
|
|
end
|
|
end
|
|
|
|
def isLegalMove? newLocation
|
|
# test for illegal moves
|
|
# can only change one variable per move
|
|
# newLocation is the proposed new position
|
|
# can only move one space from the current position
|
|
|
|
moveX = newLocation[0].to_i
|
|
moveY = newLocation[1].to_i
|
|
moveZ = newLocation[2].to_i
|
|
|
|
# currentX, currentY, currentZ contains the current position
|
|
currentX = $currentLocation[0].to_i
|
|
currentY = $currentLocation[1].to_i
|
|
currentZ = $currentLocation[2].to_i
|
|
|
|
isLegalMove = true
|
|
errorString = ""
|
|
# ensure we're not moving off the cube
|
|
if not (moveX.between?(1,3) && moveY.between?(1,3) && moveZ.between?(1,3))
|
|
errorString = "You moved off the cube!"
|
|
return errorString
|
|
end
|
|
|
|
# test for only one move from current position
|
|
if not moveX.between?(currentX-1,currentX+1)
|
|
isLegalMove = false
|
|
end
|
|
if not moveY.between?(currentY-1,currentY+1)
|
|
isLegalMove = false
|
|
end
|
|
if not moveZ.between?(currentZ-1,currentZ+1)
|
|
isLegalMove = false
|
|
end
|
|
if not isLegalMove
|
|
errorString = "You've gone too far"
|
|
end
|
|
|
|
# only allow change to one variable at a time
|
|
if isLegalMove
|
|
if moveX != currentX
|
|
if moveY != currentY or moveZ != currentZ
|
|
isLegalMove = false
|
|
end
|
|
end
|
|
if moveY != currentY
|
|
if moveX != currentX or moveZ != currentZ
|
|
isLegalMove = false
|
|
end
|
|
end
|
|
if moveZ != currentZ
|
|
if moveY != currentY or moveX != currentX
|
|
isLegalMove = false
|
|
end
|
|
end
|
|
if not isLegalMove
|
|
errorString = "You made too many changes"
|
|
end
|
|
end
|
|
|
|
return errorString
|
|
end
|
|
|
|
def displayStandings
|
|
print "You now have " + $standings.to_s
|
|
if $standings > 1
|
|
puts " dollars"
|
|
else
|
|
puts " dollar"
|
|
end
|
|
end
|
|
|
|
def didWin? location
|
|
location == "333"
|
|
end
|
|
|
|
def youWin amount
|
|
$standings += amount
|
|
puts "*** You win " + amount.to_s + " dollars! ***\n\n"
|
|
displayStandings
|
|
tryAgain
|
|
assignLandMines
|
|
puts "*** new cube ***"
|
|
puts "different landmine locations"
|
|
puts "starting over at location 111"
|
|
end
|
|
|
|
def youLose amount
|
|
# subtract the bet amount from the standings
|
|
if amount > 0
|
|
puts "You lose " + amount.to_s + " dollars!\n\n"
|
|
$standings -= amount
|
|
end
|
|
if $standings <= 0
|
|
# no money left, so end the game
|
|
bust
|
|
else
|
|
displayStandings
|
|
end
|
|
tryAgain
|
|
$currentLocation = "111"
|
|
puts "starting over at location 111"
|
|
end
|
|
|
|
def landMine betAmount
|
|
puts "******BANG******"
|
|
puts "You hit a land mine at " + $currentLocation + "!"
|
|
youLose betAmount
|
|
end
|
|
|
|
def gameLoop betAmount
|
|
while true do
|
|
puts ""
|
|
print "IT'S YOUR MOVE: "
|
|
# allow only integers: strip anything else from input
|
|
moveToLocation = gets.strip.tr('^0-9', '')
|
|
|
|
# test for illegal moves
|
|
# can only change one variable per move
|
|
# moveToLocation is the proposed new position
|
|
|
|
error = isLegalMove?(moveToLocation)
|
|
if error == ""
|
|
# assign the new position
|
|
$currentLocation = moveToLocation
|
|
|
|
# test for win
|
|
if didWin?(moveToLocation)
|
|
youWin betAmount
|
|
end
|
|
|
|
# haven't won yet, test the land mines
|
|
if $landmines.include? moveToLocation
|
|
landMine betAmount
|
|
end
|
|
|
|
else
|
|
puts "Illegal move: " + error
|
|
youLose betAmount
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
|
|
greeting
|
|
initializePot
|
|
gameLoop startGame
|
|
|