mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 23:26:40 -08:00
432 lines
14 KiB
Plaintext
432 lines
14 KiB
Plaintext
os = ["Dartmouth", ""]
|
|
sa = [0, 1]
|
|
ls = ["", "Kick","receive"," yard ","run back for ","ball on ",
|
|
"yard line"," simple run"," tricky run"," short pass",
|
|
" long pass","punt"," quick kick "," place kick"," loss ",
|
|
" no gain","gain "," touchdown "," touchback ","safety***",
|
|
"junk"]
|
|
p = 0
|
|
x = 0
|
|
x1 = 0
|
|
|
|
fnf = function(x); return 1 - 2 * p; end function
|
|
fng = function(z); return p * (x1 - x) + (1 - p) * (x - x1); end function
|
|
|
|
show_score = function
|
|
print
|
|
print "SCORE: " + sa[0] + " TO " + sa[1]
|
|
print
|
|
print
|
|
end function
|
|
|
|
show_position = function
|
|
if x <= 50 then
|
|
print ls[5] + os[0] + " " + x + " " + ls[6]
|
|
else
|
|
print ls[5] + os[1] + " " + (100 - x) + " " + ls[6]
|
|
end if
|
|
end function
|
|
|
|
offensive_td = function
|
|
print ls[17] + "***"
|
|
if rnd <= 0.8 then
|
|
sa[p] += 7
|
|
print "Kick is good."
|
|
else
|
|
print "Kick is off to the side"
|
|
sa[p] += 6
|
|
end if
|
|
show_score
|
|
print os[p] + " kicks off"
|
|
globals.p = 1 - p
|
|
end function
|
|
|
|
// Main program
|
|
main = function
|
|
print " "*33 + "FTBALL"
|
|
print " "*15 + "Creative Computing Morristown, New Jersey"
|
|
print
|
|
print
|
|
print "This is Dartmouth championship football."
|
|
print
|
|
print "You will quarterback Dartmouth. Call plays as follows:"
|
|
print "1= simple run; 2= tricky run; 3= short pass;"
|
|
print "4= long pass; 5= punt; 6= quick kick; 7= place kick."
|
|
print
|
|
os[1] = input("Choose your opponent: ").upper
|
|
os[0] = "DARMOUTH"
|
|
print
|
|
sa[0] = 0
|
|
sa[1] = 0
|
|
globals.p = floor(rnd * 2)
|
|
print os[p] + " won the toss"
|
|
if p != 0 then
|
|
print os[1] + " Elects to receive."
|
|
print
|
|
else
|
|
print "Do you elect to kick or receive? "
|
|
while true
|
|
str = input.lower
|
|
if str and (str[0] == "k" or str[0] == "r") then break
|
|
print "Incorrect answer. Please type 'kick' or 'receive'"
|
|
end while
|
|
if str[0] == "k" then e = 1 else e = 2
|
|
if e == 1 then globals.p = 1
|
|
end if
|
|
globals.t = 0
|
|
start = 1
|
|
while true
|
|
if start <= 1 then
|
|
x = 40 + (1 - p) * 20
|
|
end if
|
|
if start <= 2 then
|
|
y = floor(200 * ((rnd - 0.5))^3 + 55)
|
|
print " " + y + " " + ls[3] + " kickoff"
|
|
x = x - fnf(1) * y
|
|
if abs(x - 50) >= 50 then
|
|
print "Touchback for " + os[p] + "."
|
|
x = 20 + p * 60
|
|
start = 4
|
|
else
|
|
start = 3
|
|
end if
|
|
end if
|
|
if start <= 3 then
|
|
y = floor(50 * (rnd)^2) + (1 - p) * floor(50 * (rnd)^4)
|
|
x = x + fnf(1) * y
|
|
if abs(x - 50) < 50 then
|
|
print " " + y + " " + ls[3] + " runback"
|
|
else
|
|
print ls[4]
|
|
offensive_td
|
|
start = 1
|
|
continue
|
|
end if
|
|
end if
|
|
if start <= 4 then
|
|
// First down
|
|
show_position
|
|
end if
|
|
if start <= 5 then
|
|
x1 = x
|
|
d = 1
|
|
print
|
|
print "First down " + os[p] + "***"
|
|
print
|
|
print
|
|
end if
|
|
// New play
|
|
globals.t += 1
|
|
if t == 30 then
|
|
if rnd <= 1.3 then
|
|
print "Game delayed. Dog on field."
|
|
print
|
|
end if
|
|
end if
|
|
if t >= 50 and rnd <= 0.2 then break
|
|
if p != 1 then
|
|
// Opponent's play
|
|
if d <= 1 then
|
|
if rnd > 1/3 then z = 1 else z = 3
|
|
else if d != 4 then
|
|
if 10 + x - x1 < 5 or x < 5 then
|
|
if rnd > 1/3 then z = 1 else z = 3
|
|
else if x <= 10 then
|
|
a = floor(2 * rnd)
|
|
z = 2 + a
|
|
else if x <= x1 or d < 3 or x < 45 then
|
|
a = floor(2 * rnd)
|
|
z = 2 + a * 2
|
|
else
|
|
if (rnd > 1 / 4) then
|
|
z = 4
|
|
else
|
|
z = 6
|
|
end if
|
|
end if
|
|
else
|
|
if x <= 30 then
|
|
z = 5
|
|
else if 10 + x - x1 < 3 or x < 3 then
|
|
if rnd > 1/3 then z = 1 else z = 3
|
|
else
|
|
z = 7
|
|
end if
|
|
end if
|
|
else
|
|
while true
|
|
z = input("Next play? ").val
|
|
if 1 <= z <= 7 then break
|
|
print "Illegal play number, retype"
|
|
end while
|
|
end if
|
|
f = 0
|
|
print ls[z + 6] + ". "
|
|
r = rnd * (0.98 + fnf(1) * 0.02)
|
|
r1 = rnd
|
|
if z == 1 or z == 2 then // Simple Run or Tricky Run
|
|
done = false
|
|
if z == 1 then
|
|
y = floor(24 * (r - 0.5)^3 + 3)
|
|
if rnd >= 0.05 then
|
|
routine = 1
|
|
done = true
|
|
end if
|
|
else
|
|
y = floor(20 * r - 5)
|
|
if rnd > 0.1 then
|
|
routine = 1
|
|
done = true
|
|
end if
|
|
end if
|
|
if not done then
|
|
f = -1
|
|
x3 = x
|
|
x = x + fnf(1) * y
|
|
if abs(x - 50) < 50 then
|
|
print "*** Fumble after "
|
|
routine = 2
|
|
else
|
|
print "*** Fumble."
|
|
routine = 4
|
|
end if
|
|
end if
|
|
else if z == 3 or z == 4 then // Short Pass or Long Pass
|
|
if z == 3 then
|
|
y = floor(60 * (r1 - 0.5)^3 + 10)
|
|
else
|
|
y = floor(160 * ((r1 - 0.5))^3 + 30)
|
|
end if
|
|
if z == 3 and r < 0.05 or z == 4 and r < 0.1 then
|
|
if d != 4 then
|
|
print "Intercepted."
|
|
f = -1
|
|
x = x + fnf(1) * y
|
|
if abs(x - 50) >= 50 then
|
|
routine = 4
|
|
else
|
|
routine = 3
|
|
end if
|
|
else
|
|
y = 0
|
|
if rnd < 0.3 then
|
|
print "Batted down. ", ""
|
|
else
|
|
print "Incomplete. ", ""
|
|
end if
|
|
routine = 1
|
|
end if
|
|
else if z == 4 and r < 0.3 then
|
|
print "Passer tackled. ", ""
|
|
y = -floor(15 * r1 + 3)
|
|
routine = 1
|
|
else if z == 3 and r < 0.15 then
|
|
print "Passer taclked. ", ""
|
|
y = -floor(10 * r1)
|
|
routine = 1
|
|
else if z == 3 and r < 0.55 or z == 4 and r < 0.75 then
|
|
y = 0
|
|
if rnd < 0.3 then
|
|
print "Batted down. ", ""
|
|
else
|
|
print "Incomplete. ", ""
|
|
end if
|
|
routine = 1
|
|
else
|
|
print "Complete. ", ""
|
|
routine = 1
|
|
end if
|
|
else if z == 5 or z == 6 then // Punt or Quick Kick
|
|
y = floor(100 * ((r - 0.5))^3 + 35)
|
|
if (d != 4) then y = floor(y * 1.3)
|
|
print " " + y + " " + ls[3] + " punt"
|
|
if abs(x + y * fnf(1) - 50) < 50 and d >= 4 then
|
|
y1 = floor((r1)^2 * 20)
|
|
print " " + y1 + " " + ls[3] + " Run back"
|
|
y = y - y1
|
|
end if
|
|
f = -1
|
|
x = x + fnf(1) * y
|
|
if abs(x - 50) >= 50 then routine = 4 else routine = 3
|
|
else if z == 7 then // Place kick
|
|
y = floor(100 * ((r - 0.5))^3 + 35)
|
|
if r1 <= 0.15 then
|
|
print "Kick is blocked ***"
|
|
x = x - 5 * fnf(1)
|
|
globals.p = 1 - p
|
|
start = 4
|
|
continue
|
|
end if
|
|
x = x + fnf(1) * y
|
|
if abs(x - 50) >= 60 then
|
|
if r1 <= 0.5 then
|
|
print "Kick is off to the side."
|
|
print ls[18]
|
|
globals.p = 1 - p
|
|
x = 20 + p * 60
|
|
start = 4
|
|
continue
|
|
else
|
|
print "Field goal ***"
|
|
sa[p] = sa[p] + 3
|
|
show_score
|
|
print os[p] + " kicks off"
|
|
globals.p = 1 - p
|
|
start = 1
|
|
continue
|
|
end if
|
|
else
|
|
print "Kick is short."
|
|
if abs(x - 50) >= 50 then
|
|
// Touchback
|
|
print ls[18]
|
|
globals.p = 1 - p
|
|
x = 20 + p * 60
|
|
start = 4
|
|
continue
|
|
end if
|
|
globals.p = 1 - p
|
|
start = 3
|
|
continue
|
|
end if
|
|
end if
|
|
// Gain or loss
|
|
if routine <= 1 then
|
|
x3 = x
|
|
x = x + fnf(1) * y
|
|
if abs(x - 50) >= 50 then
|
|
routine = 4
|
|
end if
|
|
end if
|
|
if routine <= 2 then
|
|
if y != 0 then
|
|
print " " + abs(y) + " " + ls[3]
|
|
if (y < 0) then
|
|
yt = -1
|
|
else if y > 0 then
|
|
yt = 1
|
|
else
|
|
yt = 0
|
|
end if
|
|
print ls[15 + yt]
|
|
if abs(x3 - 50) <= 40 and rnd < 0.1 then
|
|
// Penalty
|
|
p3 = floor(2 * rnd)
|
|
print os[p3] + " offsides -- penalty of 5 yards."
|
|
print
|
|
print
|
|
if p3 != 0 then
|
|
print "Do you accept the penalty?"
|
|
while true
|
|
str = input.lower
|
|
if str and (str[0] == "y" or str[0] == "n") then break
|
|
print "Yype 'yes' or 'no'"
|
|
end while
|
|
if str[0] == "y" then
|
|
f = 0
|
|
d = d - 1
|
|
if (p != p3) then
|
|
x = x3 + fnf(1) * 5
|
|
else
|
|
x = x3 - fnf(1) * 5
|
|
end if
|
|
end if
|
|
else
|
|
// opponent's strategy on penalty
|
|
if ((p != 1 and (y <= 0 or f < 0 or fng(1) < 3 * d - 2)) or
|
|
(p == 1 and ((y > 5 and f >= 0) or d < 4 or fng(1) >= 10))) then
|
|
print "penalty refused."
|
|
else
|
|
print "penalty accepted."
|
|
f = 0
|
|
d = d - 1
|
|
if (p != p3) then
|
|
x = x3 + fnf(1) * 5
|
|
else
|
|
x = x3 - fnf(1) * 5
|
|
end if
|
|
end if
|
|
end if
|
|
routine = 3
|
|
end if
|
|
end if
|
|
end if
|
|
if routine <= 3 then
|
|
show_position
|
|
if f != 0 then
|
|
globals.p = 1 - p
|
|
start = 5
|
|
continue
|
|
else if fng(1) >= 10 then
|
|
start = 5
|
|
continue
|
|
else if d == 4 then
|
|
globals.p = 1 - p
|
|
start = 5
|
|
continue
|
|
else
|
|
d += 1
|
|
print "DOWN: " + d + " "
|
|
if (x1 - 50) * fnf(1) >= 40 then
|
|
print "Goal to go"
|
|
else
|
|
print "Yards to go: " + (10 - fng(1))
|
|
end if
|
|
print
|
|
print
|
|
start = 6
|
|
continue
|
|
end if
|
|
end if
|
|
if routine <= 4 then
|
|
// Ball in end-zone
|
|
e = (x >= 100)
|
|
case = 1 + e - f * 2 + p * 4
|
|
if case == 1 or case == 5 then
|
|
// Safety
|
|
sa[1 - p] = sa[1 - p] + 2
|
|
print ls[19]
|
|
show_score
|
|
print os[p] + " kicks off from its 20 yard line."
|
|
x = 20 + p * 60
|
|
globals.p = 1 - p
|
|
start = 2
|
|
continue
|
|
end if
|
|
if case == 3 or case == 6 then
|
|
// defensive td
|
|
print ls[17] + "for " + os[1 - p] + "***"
|
|
globals.p = 1 - p
|
|
end if
|
|
if case == 3 or case == 6 or case == 2 or case == 8 then
|
|
// offensive td
|
|
print ls[17] + "***"
|
|
if rnd <= 0.8 then
|
|
sa[p] = sa[p] + 7
|
|
print "kick is good."
|
|
else
|
|
print "kick is off to the side"
|
|
sa[p] = sa[p] + 6
|
|
end if
|
|
show_score
|
|
print os[p] + " kicks off"
|
|
globals.p = 1 - p
|
|
start = 1
|
|
continue
|
|
end if
|
|
if case == 4 or case == 7 then
|
|
// Touchback
|
|
print ls[18]
|
|
globals.p = 1 - p
|
|
x = 20 + p * 60
|
|
start = 4
|
|
continue
|
|
end if
|
|
end if
|
|
end while
|
|
print "END OF GAME ***"
|
|
print "FINAL SCORE: " + os[0] + ": " + sa[0] + " " + os[1] + ": " + sa[1]
|
|
end function
|
|
|
|
main
|