Last active
July 2, 2020 11:51
-
-
Save tuck1s/c96b8ec23db28a131cc50b4ba4834870 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# Bubble blaster game from Carol Vorderman book pp.164 onwards | |
from tkinter import * | |
HEIGHT = 500 | |
WIDTH = 800 | |
window = Tk() | |
window.title("Bubble Blaster") | |
window.attributes("-topmost", 1) | |
c = Canvas(window, width=WIDTH, height=HEIGHT, bg="darkblue") | |
c.pack() | |
ship_id = c.create_polygon(5, 5, 5, 25, 30, 15, fill="red") | |
ship_id2 = c.create_oval(0, 0, 30, 30, outline="red") | |
SHIP_R = 15 | |
MID_X = WIDTH/2 | |
MID_Y = HEIGHT/2 | |
c.move(ship_id, MID_X, MID_Y) | |
c.move(ship_id2, MID_X, MID_Y) | |
SHIP_SPD = 10 | |
def move_ship(event): | |
if event.keysym == "Up": | |
c.move(ship_id, 0, -SHIP_SPD) | |
c.move(ship_id2, 0, -SHIP_SPD) | |
elif event.keysym == "Down": | |
c.move(ship_id, 0, SHIP_SPD) | |
c.move(ship_id2, 0, SHIP_SPD) | |
elif event.keysym == "Left": | |
c.move(ship_id, -SHIP_SPD, 0) | |
c.move(ship_id2, -SHIP_SPD, 0) | |
elif event.keysym == "Right": | |
c.move(ship_id, SHIP_SPD, 0) | |
c.move(ship_id2, SHIP_SPD, 0) | |
c.bind_all("<Key>", move_ship) | |
from random import randint | |
bub_id = list() | |
bub_r = list() | |
bub_speed = list() | |
MIN_BUB_R = 10 | |
MAX_BUB_R = 30 | |
MAX_BUB_SPD = 10 | |
GAP = 100 | |
def create_bubble(): | |
x = WIDTH + GAP | |
y = randint(0, HEIGHT) | |
r = randint(MIN_BUB_R, MAX_BUB_R) | |
id1 = c.create_oval(x - r, y - r, x + r, y + r, outline = "white") | |
bub_id.append(id1) | |
bub_r.append(r) | |
bub_speed.append(randint(1, MAX_BUB_SPD)) | |
def move_bubbles(): | |
for i in range(len(bub_id)): | |
c.move(bub_id[i], -bub_speed[i], 0) | |
def get_coords(id_num): | |
pos = c.coords(id_num) | |
x = (pos[0] + pos[2])/2 | |
y = (pos[1] + pos[3])/2 | |
return x, y | |
def del_bubble(i): | |
del bub_r[i] | |
del bub_speed[i] | |
c.delete(bub_id[i]) | |
del bub_id[i] | |
def clean_up_bubs(): | |
for i in range(len(bub_id)-1, -1, -1): | |
x, y = get_coords(bub_id[i]) | |
if x < -GAP: | |
del_bubble(i) | |
from math import sqrt | |
def distance(id1, id2): | |
x1, y1 = get_coords(id1) | |
x2, y2 = get_coords(id2) | |
return sqrt((x2 - x1)**2 + (y2 - y1)**2) | |
def collision(): | |
points = 0 | |
for bub in range(len(bub_id)-1, -1, -1): | |
if distance(ship_id2, bub_id[bub]) < (SHIP_R + bub_r[bub]): | |
points += (bub_r[bub] + bub_speed[bub]) | |
del_bubble(bub) | |
return points | |
c.create_text(50, 30, text="TIME", fill="white") | |
c.create_text(150, 30, text="SCORE", fill="white") | |
time_text = c.create_text(50, 50, fill="white") | |
score_text = c.create_text(150, 50, fill="white") | |
def show_score(score): | |
c.itemconfig(score_text, text=str(score)) | |
def show_time(time_left): | |
c.itemconfig(time_text, text=str(time_left)) | |
from time import sleep, time | |
BUB_CHANCE = 10 | |
TIME_LIMIT = 30 | |
BONUS_SCORE = 1000 | |
score = 0 | |
bonus = 0 | |
end = time() + TIME_LIMIT | |
# MAIN GAME LOOP | |
while time() < end: | |
if randint(1, BUB_CHANCE) == 1: | |
create_bubble() | |
move_bubbles() | |
clean_up_bubs() | |
score += collision() | |
if (int(score/BONUS_SCORE)) > bonus: | |
bonus += 1 | |
end += TIME_LIMIT | |
show_score(score) | |
show_time(int(end - time())) | |
# print(score) | |
window.update() | |
sleep(0.01) | |
c.create_text(MID_X, MID_Y, text="GAME OVER", fill="white", font=("Helvetica", 30)) | |
c.create_text(MID_X, MID_Y+30, text="Score: "+str(score), fill="white") | |
c.create_text(MID_X, MID_Y+45, text="Bonus time: "+str(bonus+TIME_LIMIT), fill="white") | |
# Need to add the following to paint the "game over" screen then leave it there for a bit | |
window.update() | |
sleep(2) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment