Files
basic-computer-games/00_Alternate_Languages/37_Football/MiniScript/ftball.ms

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