130 lines
3.5 KiB
Python
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)
|