Are you sure?
Do you want to delete “Shooting Gallery” permanently? You will not be able to undo this action.
import icons
import random
class Target:
def __init__(self):
size = random.randint(8, 16)
self.image = icons.Angry(height=size, width=size)
self.image.height = size
self.image.width = size
self.image.color = random.choice(["lightgreen", "deepskyblue", "gold",
"plum", "fuchsia", "darkorange"])
self.image.x = random.randint(size,60)
self.image.y = random.randint(size,70)
self.dx = random.randint(1,5)
def target_enlarge(self):
self.image.height = 100
self.image.width = 100
self.dx = 0
def target_right(self):
self.image.x = self.image.x + self.dx
def target_position(self):
return (self.image.x - (self.image.width // 2), # left
self.image.x + (self.image.width // 2), # right
self.image.y - (self.image.height // 2), # top
self.image.y + (self.image.height // 2)) # bottom
class Ammo:
def __init__(self, x, y):
self.image = icons.CaretUp(color='red')
size = 6
self.image.height = size
self.image.width = size
self.image.x = x
self.image.y = y - self.image.height // 2
def ammo_off_screen(self):
return self.image.y < 0
def ammo_up(self, dy):
self.image.y = self.image.y + dy
def ammo_position(self):
return (self.image.x - (self.image.width // 2), # left
self.image.x + (self.image.width // 2), # right
self.image.y - (self.image.height // 2), # top
self.image.y + (self.image.height // 2)) # bottom
class Tank:
def __init__(self):
self.base = Rectangle(color='blue')
self.top = Rectangle(color='blue')
self.base.width = 16
self.base.height = 6
self.top.width = 10
self.top.height = 4
self.base.x = -self.base.width //2
self.base.y = 100 - self.base.height // 2
self.top.x = self.base.x
self.top.y = self.base.y - (self.base.height + self.top.height)//2
def tank_right(self, dx):
self.base.x = self.base.x + dx
self.top.x = self.top.x + dx
def get_x_location(self):
return self.base.x
def get_tank_height(self):
return self.base.height + self.top.height
def any_hits():
for a in ammos:
(aLeft, aRight, aTop, aBtm) = a.ammo_position()
for t in targets:
(tLeft, tRight, tTop, tBtm) = t.target_position()
xRange = range(tLeft, tRight+1)
yRange = range(tTop, tBtm+1)
if (aLeft in xRange and aTop in yRange) or \
(aLeft in xRange and aBtm in yRange) or \
(aRight in xRange and aTop in yRange) or \
(aRight in xRange and aBtm in yRange):
t.target_enlarge()
Rectangle(color='mintcream')
targets = [Target(), Target(), Target(), Target(), Target()]
tank = Tank()
ammos = []
shots = [4 * random.randint(5, 11), 4 * random.randint(12, 22) ]
dur = random.uniform(.4, .8)
for i in range(50):
with animation(duration=dur):
any_hits()
for a in ammos:
a.ammo_up(-8)
tank.tank_right(4)
for t in targets:
t.target_right()
for s in shots:
if tank.get_x_location() == s:
Text("") # causes delay that makes ammo appear correctly
ammos.append(Ammo(s, 100 - tank.get_tank_height()))
# The random number sequence appears to be the same for each cyle.
# Refreshing the page resets the random number sequence so that
# a new scenerio can be displayed instead of repeating the old one
# over and over and over.
if len(ammos) == len(shots):
showMsg = True
for a in ammos:
if not a.ammo_off_screen():
showMsg = False
if showMsg:
Text('Refresh page for new "game"', font_size=6, color='indigo')