mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-25 12:25:10 -08:00
304 lines
8.1 KiB
Plaintext
304 lines
8.1 KiB
Plaintext
print " "*34 + "Golf"
|
|
print " "*15 + "Creative Computing Morristown, New Jersey"
|
|
print; print; print
|
|
|
|
print "Welcome to the creative computing country club,"
|
|
print "an eighteen hole championship layout located a short"
|
|
print "distance from scenic downtown Morristown. The"
|
|
print "commentator will explain the game as you play."
|
|
print "Enjoy your game; see you at the 19th hole..."
|
|
print;print
|
|
l = [0] * 11
|
|
holesInCourse=18
|
|
totalScore=0
|
|
totalPar=0
|
|
dubChance=.8
|
|
s2=0
|
|
curHole=1
|
|
|
|
|
|
getHoleData = function(hole)
|
|
// data for all the holes: distance, par, locOnLeft, and locOnRight for each one
|
|
data = [
|
|
361,4,4,2,389,4,3,3,206,3,4,2,500,5,7,2,
|
|
408,4,2,4,359,4,6,4,424,4,4,2,388,4,4,4,
|
|
196,3,7,2,400,4,7,2,560,5,7,2,132,3,2,2,
|
|
357,4,4,4,294,4,2,4,475,5,2,3,375,4,4,2,
|
|
180,3,6,2,550,5,6,6]
|
|
i = (hole-1) * 4
|
|
globals.distance = data[i]
|
|
globals.par = data[i+1]
|
|
globals.locOnRight = data[i+2]
|
|
globals.locOnLeft = data[i+3]
|
|
end function
|
|
|
|
startHole = function(hole)
|
|
getHoleData hole
|
|
print
|
|
print "You are at the tee off hole " + hole + " distance " + distance + " yards, par " + par
|
|
globals.totalPar += par
|
|
print "On your right is ", ""
|
|
printLocation locOnRight
|
|
print "On your left is ", ""
|
|
printLocation locOnLeft
|
|
end function
|
|
|
|
// Get player's handicap
|
|
while true
|
|
handicap = input("What is your handicap? ").val
|
|
if 0 <= handicap <= 30 then break
|
|
print "PGA handicaps range from 0 to 30."
|
|
end while
|
|
|
|
// Get player's weak point
|
|
while true
|
|
print "Difficulties at golf include:"
|
|
print "0=hook, 1=slice, 2=poor distance, 3=trap shots, 4=putting"
|
|
weakness = input("Which one (only one) is your worst? ").val
|
|
if 0 <= weakness <= 4 then break
|
|
end while
|
|
|
|
// End a sentence by printing the name of the given location
|
|
printLocation = function(locIdx)
|
|
if locIdx < 1 or locIdx > 6 then
|
|
print "out of bounds."
|
|
else
|
|
print ["fairway.", "rough.", "trees.", "adjacent fairway.",
|
|
"trap.", "water."][locIdx-1]
|
|
end if
|
|
end function
|
|
|
|
// Print score for one hole (plus total), and some praise or advice.
|
|
printScore = function(hole, score, par, totalScore, totalPar)
|
|
print "Your score on hole " + hole + " was " + score
|
|
print "Total par for " + hole + " holes is " + totalPar + " Your total is " + totalScore
|
|
if hole == holesInCourse then return
|
|
if score > par+2 then
|
|
print "Keep your head down."
|
|
else if score == par then
|
|
print "A par. Nice going."
|
|
else if score == par-1 then
|
|
print "A birdie."
|
|
else if score == 1 then
|
|
print "A hole in one."
|
|
else if score == par-2 then
|
|
print "A great big eagle."
|
|
end if
|
|
end function
|
|
|
|
// Print club advice -- but only once.
|
|
clubAdviceGiven = false
|
|
printClubAdvice = function
|
|
if clubAdviceGiven then return // (already done)
|
|
globals.clubAdviceGiven = true
|
|
print "Selection of clubs"
|
|
print "yardage desired suggested clubs"
|
|
print "200 to 280 yards 1 to 4"
|
|
print "100 to 200 yards 19 to 13"
|
|
print " 0 to 100 yards 29 to 23"
|
|
end function
|
|
|
|
doPenalty = function
|
|
print "Penalty stroke assessed. Hit from previous location."
|
|
globals.score += 1
|
|
globals.j += 1
|
|
globals.curLoc = 1
|
|
globals.distance = prevDistance
|
|
end function
|
|
|
|
// Try to get out of a trap. Return true if succeeded, false if failed.
|
|
doTrapShot = function
|
|
if weakness == 3 then
|
|
if rnd <= dubChance then
|
|
globals.dubChance *= 0.2
|
|
print "Shot dubbed, still in trap."
|
|
return false
|
|
end if
|
|
globals.dubChance = 0.8
|
|
end if
|
|
globals.distToPin = 1 + (3*floor((80/(40-handicap))*rnd))
|
|
return true
|
|
end function
|
|
|
|
getClub = function
|
|
//print "DEBUG: getClub, with curLoc=" + curLoc
|
|
while true
|
|
club = input("What club do you choose? ").val
|
|
print
|
|
if club < 1 or club > 29 then continue
|
|
if club > 4 and club < 12 then
|
|
print "That club is not in the bag."
|
|
continue
|
|
end if
|
|
if club >= 12 then club -= 6
|
|
if curLoc <= 5 or club == 14 or club == 23 then break
|
|
print "That club is not in the bag."
|
|
print
|
|
continue
|
|
end while
|
|
return club
|
|
end function
|
|
|
|
getSwing = function(club)
|
|
if club <= 13 then return 1 // (full swing)
|
|
while true
|
|
print "Now gauge your distance by a percentage (1 to 100)"
|
|
swing = input("of a full swing? ").val / 100
|
|
print
|
|
if 0 <= swing <= 1 then return swing
|
|
// Given an invalid swing input, the original BASIC code would
|
|
// print "That club is not in the bag" and go back to choosing a club.
|
|
// But that is convoluted spaghetti, and I'm not doing it.
|
|
end while
|
|
end function
|
|
|
|
playOneHole = function
|
|
q = 0 // counts certain kinds of shots on every third hole (?)
|
|
distanceHit = 0
|
|
offLine = 0
|
|
|
|
// shot loop -- take as many shots as you need for this hole
|
|
while true
|
|
if curLoc < 1 then curLoc = 1
|
|
if curLoc > 6 then
|
|
print "Your shot went out of bounds."
|
|
doPenalty
|
|
distanceHit = 0
|
|
else if curLoc > 5 then
|
|
print "Your shot went into the water."
|
|
doPenalty
|
|
distanceHit = 0
|
|
end if
|
|
|
|
if score > 0 and distanceHit then
|
|
print "Shot went " + distanceHit + " yards. It's " + distToPin + " yards from the cup."
|
|
print "Ball is " + floor(offLine) + " yards off line... in ", ""
|
|
printLocation curLoc
|
|
end if
|
|
|
|
printClubAdvice
|
|
|
|
club = getClub
|
|
swing = getSwing(club)
|
|
globals.score += 1
|
|
if curLoc == 5 and not doTrapShot then continue
|
|
if club > 14 then club -= 10
|
|
|
|
//print "DEBUG Club:"+club + " Swing:"+swing + " Weakness:"+weakness
|
|
|
|
if curHole % 3 == 0 then
|
|
if s2 + q + (10*(curHole-1)/18) < (curHole-1)*(72+((handicap+1)/.85))/18 then
|
|
q += 1
|
|
if score % 2 and distance >= 95 then
|
|
globals.distance -= 75
|
|
distanceHit = 0
|
|
print "Ball hit tree - bounced into rough " + distance + " yards from hole."
|
|
continue
|
|
end if
|
|
end if
|
|
end if
|
|
|
|
if club >= 4 and curLoc == 2 then
|
|
print "You dubbed it."
|
|
distanceHit = 35
|
|
else if score > 7 and distance < 200 then
|
|
// user is really sucking, let's cut them a break
|
|
putt 1 + (3 * floor((80/(40-handicap))*rnd))
|
|
return
|
|
else
|
|
//print "DEBUG: SWING with handicap:" + handicap + " club:" + club
|
|
distanceHit = floor(((30-handicap)*2.5+187-((30-handicap)*.25+15)*club/2)+25*rnd)
|
|
distanceHit = floor(distanceHit*swing)
|
|
if weakness == 2 then distanceHit = floor(.85*distanceHit)
|
|
end if
|
|
offLine = (rnd/.8)*(2*handicap+16)*abs(tan(distanceHit*.0035))
|
|
distToPin = floor(sqrt(offLine^2+abs(distance-distanceHit)^2))
|
|
//print "DEBUG distance:"+distance+"; distanceHit:"+distanceHit+"; distToPin:"+distToPin+"; offLine:"+offLine
|
|
if distanceHit > distance and distToPin >= 20 then print "Too much club. You're past the hole."
|
|
|
|
globals.prevDistance = distance
|
|
globals.distance = distToPin
|
|
if distToPin > 27 then
|
|
if offLine < 30 or j > 0 then
|
|
curLoc = 1
|
|
continue
|
|
end if
|
|
// hook or slice
|
|
s9 = (s2+1)/15
|
|
if weakness == 0 then
|
|
isSlice = floor(s9) == s9
|
|
else
|
|
isSlice = not floor(s9) == s9
|
|
end if
|
|
if isSlice then
|
|
print "You sliced- "
|
|
curLoc = locOnRight
|
|
else
|
|
print "You hooked- "
|
|
curLoc = locOnLeft
|
|
end if
|
|
if offLine > 45 then print "badly."
|
|
|
|
else if distToPin > 20 then
|
|
curLoc = 5
|
|
else if distToPin > .5 then
|
|
globals.curLoc = 8 // on the green!
|
|
putt distToPin * 3 // (convert yards to feet, and putt)
|
|
return
|
|
else
|
|
curLoc = 9
|
|
print "You holed it."
|
|
print
|
|
globals.curHole += 1
|
|
return
|
|
end if
|
|
end while
|
|
end function
|
|
|
|
putt = function(distToPin)
|
|
puttAttempts = 0
|
|
while true
|
|
distToPin = abs(floor(distToPin))
|
|
print "On green, " + distToPin + " feet from the pin."
|
|
i = input("Choose your putt potency (1 to 13): ").val
|
|
globals.score += 1
|
|
if score+1 - par > handicap*0.072 + 2 or puttAttempts > 2 then break
|
|
puttAttempts += 1
|
|
if weakness == 4 then
|
|
distToPin -= i*(4+1*rnd)+1
|
|
else
|
|
distToPin -= i*(4+2*rnd)+1.5
|
|
end if
|
|
if -2 <= distToPin <= 2 then break
|
|
if distToPin < 0 then
|
|
print "Passed by cup."
|
|
else
|
|
print "Putt short."
|
|
end if
|
|
end while
|
|
print "You holed it."
|
|
print
|
|
return
|
|
end function
|
|
|
|
// main loop
|
|
while true
|
|
curLoc = 0
|
|
j = 0
|
|
s2 += 1
|
|
if curHole > 1 then
|
|
end if
|
|
|
|
print
|
|
|
|
score = 0
|
|
startHole curHole
|
|
playOneHole
|
|
|
|
totalScore += score
|
|
printScore curHole, score, par, totalScore, totalPar
|
|
if curHole == holesInCourse then break
|
|
|
|
curHole += 1
|
|
end while
|