"""Snail Race, by Al Sweigart al@inventwithpython.com
Fast-paced snail racing action!
This code is available at https://nostarch.com/big-book-small-python-programming
Tags: short, artistic, beginner, game, multiplayer"""
import random, time, sys
# Set up the constants:
MAX_NUM_SNAILS = 8
MAX_NAME_LENGTH = 20
FINISH_LINE = 40 # (!) Try modifying this number.
print('''Snail Race, by Al Sweigart al@inventwithpython.com
@v <-- snail
''')
# Ask how many snails to race:
while True: # Keep asking until the player enters a number.
print('How many snails will race? Max:', MAX_NUM_SNAILS)
response = input('> ')
if response.isdecimal():
numSnailsRacing = int(response)
if 1 < numSnailsRacing <= MAX_NUM_SNAILS:
break
print('Enter a number between 2 and', MAX_NUM_SNAILS)
# Enter the names of each snail:
snailNames = [] # List of the string snail names.
for i in range(1, numSnailsRacing + 1):
while True: # Keep asking until the player enters a valid name.
print('Enter snail #' + str(i) + "'s name:")
name = input('> ')
if len(name) == 0:
print('Please enter a name.')
elif name in snailNames:
print('Choose a name that has not already been used.')
else:
break # The entered name is acceptable.
snailNames.append(name)
# Display each snail at the start line.
print('\n' * 40)
print('START' + (' ' * (FINISH_LINE - len('START')) + 'FINISH'))
print('|' + (' ' * (FINISH_LINE - len('|')) + '|'))
snailProgress = {}
for snailName in snailNames:
print(snailName[:MAX_NAME_LENGTH])
print('@v')
snailProgress[snailName] = 0
time.sleep(1.5) # The pause right before the race starts.
while True: # Main program loop.
# Pick random snails to move forward:
for i in range(random.randint(1, numSnailsRacing // 2)):
randomSnailName = random.choice(snailNames)
snailProgress[randomSnailName] += 1
# Check if a snail has reached the finish line:
if snailProgress[randomSnailName] == FINISH_LINE:
print(randomSnailName, 'has won!')
sys.exit()
# (!) EXPERIMENT: Add a cheat here that increases a snail's progress
# if it has your name.
time.sleep(0.5) # (!) EXPERIMENT: Try changing this value.
# (!) EXPERIMENT: What happens if you comment this line out?
print('\n' * 40)
# Display the start and finish lines:
print('START' + (' ' * (FINISH_LINE - len('START')) + 'FINISH'))
print('|' + (' ' * (FINISH_LINE - 1) + '|'))
# Display the snails (with name tags):
for snailName in snailNames:
spaces = snailProgress[snailName]
print((' ' * spaces) + snailName[:MAX_NAME_LENGTH])
print(('.' * snailProgress[snailName]) + '@v')