mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-21 23:00:43 -08:00
Avoid executing code on module level as this prevents importing the module for testing. Especially infinite loops are evil.
358 lines
13 KiB
Python
358 lines
13 KiB
Python
import random
|
||
|
||
# The basketball class is a computer game that allows you to play as
|
||
# Dartmouth College's captain and playmaker
|
||
# The game uses set probabilites to simulate outcomes of each posession
|
||
# You are able to choose your shot types as well as defensive formations
|
||
|
||
|
||
class Basketball:
|
||
def __init__(self):
|
||
self.time = 0
|
||
self.score = [0, 0] # first value is opponents score, second is home
|
||
self.defense = None
|
||
self.defense_choices = [6, 6.5, 7, 7.5]
|
||
self.shot = None
|
||
self.shot_choices = [0, 1, 2, 3, 4]
|
||
self.z1 = None
|
||
|
||
# Explains the keyboard inputs
|
||
print("\t\t\t Basketball")
|
||
print("\t Creative Computing Morristown, New Jersey\n\n\n")
|
||
print("This is Dartmouth College basketball. ")
|
||
print("Υou will be Dartmouth captain and playmaker.")
|
||
print("Call shots as follows:")
|
||
print(
|
||
"1. Long (30ft.) Jump Shot; "
|
||
"2. Short (15 ft.) Jump Shot; "
|
||
"3. Lay up; 4. Set Shot"
|
||
)
|
||
print("Both teams will use the same defense. Call Defense as follows:")
|
||
print("6. Press; 6.5 Man-to-Man; 7. Zone; 7.5 None.")
|
||
print("To change defense, just type 0 as your next shot.")
|
||
print("Your starting defense will be? ", end="")
|
||
|
||
# takes input for a defense
|
||
try:
|
||
self.defense = float(input())
|
||
|
||
except ValueError:
|
||
self.defense = None
|
||
|
||
# if the input wasn't a valid defense, takes input again
|
||
while self.defense not in self.defense_choices:
|
||
print("Your new defensive allignment is? ", end="")
|
||
try:
|
||
self.defense = float(input())
|
||
|
||
except ValueError:
|
||
continue
|
||
|
||
# takes input for opponent's name
|
||
print("\nChoose your opponent? ", end="")
|
||
|
||
self.opponent = input()
|
||
self.start_of_period()
|
||
|
||
# adds points to the score
|
||
# team can take 0 or 1, for opponent or Dartmouth, respectively
|
||
def add_points(self, team, points):
|
||
self.score[team] += points
|
||
self.print_score()
|
||
|
||
def ball_passed_back(self):
|
||
print("Ball passed back to you. ", end="")
|
||
self.dartmouth_ball()
|
||
|
||
# change defense, called when the user enters 0 for their shot
|
||
def change_defense(self):
|
||
self.defense = None
|
||
|
||
while self.defense not in self.defense_choices:
|
||
print("Your new defensive allignment is? ")
|
||
try:
|
||
self.defense = float(input())
|
||
|
||
except ValueError:
|
||
continue
|
||
self.dartmouth_ball()
|
||
|
||
# simulates two foul shots for a player and adds the points
|
||
def foul_shots(self, team):
|
||
print("Shooter fouled. Two shots.")
|
||
if random.random() > 0.49:
|
||
if random.random() > 0.75:
|
||
print("Both shots missed.")
|
||
else:
|
||
print("Shooter makes one shot and misses one.")
|
||
self.score[team] += 1
|
||
else:
|
||
print("Shooter makes both shots.")
|
||
self.score[team] += 2
|
||
|
||
self.print_score()
|
||
|
||
# called when t = 50, starts a new period
|
||
def halftime(self):
|
||
print("\n ***** End of first half *****\n")
|
||
self.print_score()
|
||
self.start_of_period()
|
||
|
||
# prints the current score
|
||
def print_score(self):
|
||
print("Score: " + str(self.score[1]) + " to " + str(self.score[0]) + "\n")
|
||
|
||
# simulates a center jump for posession at the beginning of a period
|
||
def start_of_period(self):
|
||
print("Center jump")
|
||
if random.random() > 0.6:
|
||
print("Dartmouth controls the tap.\n")
|
||
self.dartmouth_ball()
|
||
else:
|
||
print(self.opponent + " controls the tap.\n")
|
||
self.opponent_ball()
|
||
|
||
# called when t = 92
|
||
def two_minute_warning(self):
|
||
print(" *** Two minutes left in the game ***")
|
||
|
||
# called when the user enters 1 or 2 for their shot
|
||
def dartmouth_jump_shot(self):
|
||
self.time += 1
|
||
if self.time == 50:
|
||
self.halftime()
|
||
elif self.time == 92:
|
||
self.two_minute_warning()
|
||
print("Jump Shot.")
|
||
# simulates chances of different possible outcomes
|
||
if random.random() > 0.341 * self.defense / 8:
|
||
if random.random() > 0.682 * self.defense / 8:
|
||
if random.random() > 0.782 * self.defense / 8:
|
||
if random.random() > 0.843 * self.defense / 8:
|
||
print("Charging foul. Dartmouth loses ball.\n")
|
||
self.opponent_ball()
|
||
else:
|
||
# player is fouled
|
||
self.foul_shots(1)
|
||
self.opponent_ball()
|
||
else:
|
||
if random.random() > 0.5:
|
||
print(
|
||
"Shot is blocked. Ball controlled by "
|
||
+ self.opponent
|
||
+ ".\n"
|
||
)
|
||
self.opponent_ball()
|
||
else:
|
||
print("Shot is blocked. Ball controlled by Dartmouth.")
|
||
self.dartmouth_ball()
|
||
else:
|
||
print("Shot is off target.")
|
||
if self.defense / 6 * random.random() > 0.45:
|
||
print("Rebound to " + self.opponent + "\n")
|
||
self.opponent_ball()
|
||
else:
|
||
print("Dartmouth controls the rebound.")
|
||
if random.random() > 0.4:
|
||
if self.defense == 6 and random.random() > 0.6:
|
||
print("Pass stolen by " + self.opponent + ", easy lay up")
|
||
self.add_points(0, 2)
|
||
self.dartmouth_ball()
|
||
else:
|
||
# ball is passed back to you
|
||
self.ball_passed_back()
|
||
else:
|
||
print("")
|
||
self.dartmouth_non_jump_shot()
|
||
else:
|
||
print("Shot is good.")
|
||
self.add_points(1, 2)
|
||
self.opponent_ball()
|
||
|
||
# called when the user enters 0, 3, or 4
|
||
# lay up, set shot, or defense change
|
||
def dartmouth_non_jump_shot(self):
|
||
self.time += 1
|
||
if self.time == 50:
|
||
self.halftime()
|
||
elif self.time == 92:
|
||
self.two_minute_warning()
|
||
|
||
if self.shot == 4:
|
||
print("Set shot.")
|
||
elif self.shot == 3:
|
||
print("Lay up.")
|
||
elif self.shot == 0:
|
||
self.change_defense()
|
||
|
||
# simulates different outcomes after a lay up or set shot
|
||
if 7 / self.defense * random.random() > 0.4:
|
||
if 7 / self.defense * random.random() > 0.7:
|
||
if 7 / self.defense * random.random() > 0.875:
|
||
if 7 / self.defense * random.random() > 0.925:
|
||
print("Charging foul. Dartmouth loses the ball.\n")
|
||
self.opponent_ball()
|
||
else:
|
||
print("Shot blocked. " + self.opponent + "'s ball.\n")
|
||
self.opponent_ball()
|
||
else:
|
||
self.foul_shots(1)
|
||
self.opponent_ball()
|
||
else:
|
||
print("Shot is off the rim.")
|
||
if random.random() > 2 / 3:
|
||
print("Dartmouth controls the rebound.")
|
||
if random.random() > 0.4:
|
||
print("Ball passed back to you.\n")
|
||
self.dartmouth_ball()
|
||
else:
|
||
self.dartmouth_non_jump_shot()
|
||
else:
|
||
print(self.opponent + " controls the rebound.\n")
|
||
self.opponent_ball()
|
||
else:
|
||
print("Shot is good. Two points.")
|
||
self.add_points(1, 2)
|
||
self.opponent_ball()
|
||
|
||
# plays out a Dartmouth posession, starting with your choice of shot
|
||
def dartmouth_ball(self):
|
||
print("Your shot? ", end="")
|
||
self.shot = None
|
||
try:
|
||
self.shot = int(input())
|
||
except ValueError:
|
||
self.shot = None
|
||
|
||
while self.shot not in self.shot_choices:
|
||
print("Incorrect answer. Retype it. Your shot? ", end="")
|
||
try:
|
||
self.shot = int(input())
|
||
except Exception:
|
||
continue
|
||
|
||
if self.time < 100 or random.random() < 0.5:
|
||
if self.shot == 1 or self.shot == 2:
|
||
self.dartmouth_jump_shot()
|
||
else:
|
||
self.dartmouth_non_jump_shot()
|
||
else:
|
||
if self.score[0] != self.score[1]:
|
||
print("\n ***** End Of Game *****")
|
||
print(
|
||
"Final Score: Dartmouth: "
|
||
+ str(self.score[1])
|
||
+ " "
|
||
+ self.opponent
|
||
+ ": "
|
||
+ str(self.score[0])
|
||
)
|
||
else:
|
||
print("\n ***** End Of Second Half *****")
|
||
print("Score at end of regulation time:")
|
||
print(
|
||
" Dartmouth: "
|
||
+ str(self.score[1])
|
||
+ " "
|
||
+ self.opponent
|
||
+ ": "
|
||
+ str(self.score[0])
|
||
)
|
||
print("Begin two minute overtime period")
|
||
self.time = 93
|
||
self.start_of_period()
|
||
|
||
# simulates the opponents jumpshot
|
||
def opponent_jumpshot(self):
|
||
print("Jump Shot.")
|
||
if 8 / self.defense * random.random() > 0.35:
|
||
if 8 / self.defense * random.random() > 0.75:
|
||
if 8 / self.defense * random.random() > 0.9:
|
||
print("Offensive foul. Dartmouth's ball.\n")
|
||
self.dartmouth_ball()
|
||
else:
|
||
self.foul_shots(0)
|
||
self.dartmouth_ball()
|
||
else:
|
||
print("Shot is off the rim.")
|
||
if self.defense / 6 * random.random() > 0.5:
|
||
print(self.opponent + " controls the rebound.")
|
||
if self.defense == 6:
|
||
if random.random() > 0.75:
|
||
print("Ball stolen. Easy lay up for Dartmouth.")
|
||
self.add_points(1, 2)
|
||
self.opponent_ball()
|
||
else:
|
||
if random.random() > 0.5:
|
||
print("")
|
||
self.opponent_non_jumpshot()
|
||
else:
|
||
print("Pass back to " + self.opponent + " guard.\n")
|
||
self.opponent_ball()
|
||
else:
|
||
if random.random() > 0.5:
|
||
self.opponent_non_jumpshot()
|
||
else:
|
||
print("Pass back to " + self.opponent + " guard.\n")
|
||
self.opponent_ball()
|
||
else:
|
||
print("Dartmouth controls the rebound.\n")
|
||
self.dartmouth_ball()
|
||
else:
|
||
print("Shot is good.")
|
||
self.add_points(0, 2)
|
||
self.dartmouth_ball()
|
||
|
||
# simulates opponents lay up or set shot
|
||
def opponent_non_jumpshot(self):
|
||
if self.z1 > 3:
|
||
print("Set shot.")
|
||
else:
|
||
print("Lay up")
|
||
if 7 / self.defense * random.random() > 0.413:
|
||
print("Shot is missed.")
|
||
if self.defense / 6 * random.random() > 0.5:
|
||
print(self.opponent + " controls the rebound.")
|
||
if self.defense == 6:
|
||
if random.random() > 0.75:
|
||
print("Ball stolen. Easy lay up for Dartmouth.")
|
||
self.add_points(1, 2)
|
||
self.opponent_ball()
|
||
else:
|
||
if random.random() > 0.5:
|
||
print("")
|
||
self.opponent_non_jumpshot()
|
||
else:
|
||
print("Pass back to " + self.opponent + " guard.\n")
|
||
self.opponent_ball()
|
||
else:
|
||
if random.random() > 0.5:
|
||
print("")
|
||
self.opponent_non_jumpshot()
|
||
else:
|
||
print("Pass back to " + self.opponent + " guard\n")
|
||
self.opponent_ball()
|
||
else:
|
||
print("Dartmouth controls the rebound.\n")
|
||
self.dartmouth_ball()
|
||
else:
|
||
print("Shot is good.")
|
||
self.add_points(0, 2)
|
||
self.dartmouth_ball()
|
||
|
||
# simulates an opponents possesion
|
||
# #randomly picks jump shot or lay up / set shot.
|
||
def opponent_ball(self):
|
||
self.time += 1
|
||
if self.time == 50:
|
||
self.halftime()
|
||
self.z1 = 10 / 4 * random.random() + 1
|
||
if self.z1 > 2:
|
||
self.opponent_non_jumpshot()
|
||
else:
|
||
self.opponent_jumpshot()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
Basketball()
|