turtle_match/main.py
2022-08-04 16:53:34 -05:00

130 lines
3.5 KiB
Python

from tkinter import PhotoImage
from audio import Audio
try:
import os
import random
import time
import turtle
from card import Card
# CONSTANTS
WIDTH = 1600
HEIGHT = 840
BACKGROUND_COLOR = (66, 135, 245)
screen = turtle.Screen()
turtle.bgcolor('#46a38d')
screen.setup(WIDTH, HEIGHT)
screen.title('Turtle Match - Benjamin Zimmerman')
success_t = turtle.Turtle()
success_t.hideturtle()
success_t.penup()
turtle.register_shape('success_turtle', turtle.Shape('image', PhotoImage(file='images/turtle.png')))
success_t.shape('success_turtle')
success_t.goto(-379, 0)
Audio.start_audio()
Audio.play_background_music()
# Scoreboard
score_text = turtle.Turtle()
score_text.hideturtle()
score_text.penup()
score_text.goto((WIDTH - HEIGHT) // 2, HEIGHT * .25)
score_text.write('Score: 0', font=('Arial', 24, 'bold'))
def coord_translation(x, y):
"""
Translates coordinates from the screen to turtle.
:param x: x coordinate
:param y: y coordinate
:return: Translated coordinates
"""
return x - (WIDTH / 2), y - (HEIGHT / 2)
image_files = os.listdir('images')
# Creates list of images, doubles it, and shuffles it
image_files.remove('turtle.png')
image_files.extend(image_files)
random.shuffle(image_files)
cards = []
for file in image_files:
path = f'images/{file}'
cards.append(Card(path))
# Move sprites
for i in range(16):
# Note: Coordinates start from (0, 0) at top left of screen.
# Arrange cards in a grid, 4x4, with a margin of 20 pixels between each card.
# Array from left to right, then top to bottom.
x, y = coord_translation((210 * (i % 4)) + 105, (210 * int(i / 4)) + 105)
cards[i].goto(x, y)
score = 0
matches = 0
game_is_running = True
end_routine_done = False
clicked_cards = []
def clicked_card(x, y):
"""
Appends the card which was clicked on to the list clicked_cards.
"""
global clicked_cards
if len(clicked_cards) == 2:
return None
for card in cards:
if card.is_mouse_over(x, y) and card.shape()[:10] != 'card_front':
card.to_front()
clicked_cards.append(card)
Audio.click()
def update_score():
score_text.clear()
score_text.write(f'Score: {score}', font=('Arial', 24, 'bold'))
screen.onclick(fun=clicked_card)
while game_is_running:
time.sleep(0.1)
if not end_routine_done:
if matches >= 8:
success_t.showturtle()
Audio.pause_music()
Audio.game_success()
time.sleep(3.1)
Audio.unpause_background_music()
end_routine_done = True
if len(clicked_cards) == 2:
if clicked_cards[0] == clicked_cards[1]:
time.sleep(0.5)
clicked_cards[0].hideturtle()
clicked_cards[1].hideturtle()
score += 5
update_score()
Audio.match_made()
matches += 1
else:
time.sleep(1)
clicked_cards[0].to_back()
clicked_cards[1].to_back()
score -= 1
update_score()
Audio.no_match()
clicked_cards = []
screen.update()
screen.mainloop()
except turtle.Terminator:
exit(0)