forked from chryse/Interactive_Python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
memory.py
120 lines (93 loc) · 4.28 KB
/
memory.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# implementation of card game - Memory
import simplegui
import random
card_images_url = []
card_images_done_url = []
card_face_url = "http://hyunjunkim.com/images/memory_game/face_down.png"
for i in range(8):
card_images_url.append("http://hyunjunkim.com/images/memory_game/" + str(i) + ".png")
card_images_done_url.append("http://hyunjunkim.com/images/memory_game/" + str(i) + "_done.png")
canvas_image_pos = [0, 90]
# helper function to initialize globals
def new_game():
global card_images, card_images_done, card_face_image, state, card_exposed, card_done, selected_cards, card_exposed_track, turn
card_images = []
card_images_done = []
for i in range(len(card_images_url)):
# card_images consists of card images, its value & card object done images
card_images.append([simplegui.load_image(card_images_url[i]), i, simplegui.load_image(card_images_done_url[i])])
card_images.append([simplegui.load_image(card_images_url[i]), i, simplegui.load_image(card_images_done_url[i])])
card_face_image = simplegui.load_image(card_face_url)
card_exposed = [[False, False], [False, False], [False, False], [False, False],
[False, False], [False, False], [False, False], [False, False],
[False, False], [False, False], [False, False], [False, False],
[False, False], [False, False], [False, False], [False, False]]
random.shuffle(card_images)
state = 0
selected_cards = []
card_exposed_track = []
turn = 0
label.set_text("Turns = " + str(turn))
# define event handlers
def mouseclick(pos):
global state, card_images, card_exposed, selected_cards, card_exposed_track, turn
pos = pos[0] // 60
# print
# print "position:", pos
if not card_exposed[pos][0]:
card_exposed[pos][0] = True
selected_cards.append(card_images[pos][1])
card_exposed_track.append(pos)
# print "card position tracking:", card_exposed_track
# print "selected cards:", selected_cards
# add game state logic
if state == 0:
state = 1
elif state == 1:
state = 2
turn += 1
label.set_text("Turns = " + str(turn))
#check and turn paired images
if selected_cards[0] == selected_cards[1]:
card_exposed[card_exposed_track[0]][1] = True
card_exposed[card_exposed_track[1]][1] = True
elif state == 2:
state = 1
if selected_cards[0] == selected_cards[1]:
card_exposed[card_exposed_track[0]][0] = True
card_exposed[card_exposed_track[1]][0] = True
else:
card_exposed[card_exposed_track[0]][0] = False
card_exposed[card_exposed_track[1]][0] = False
for i in range(2):
card_exposed_track.pop(0)
selected_cards.pop(0)
# print "selected cards:", selected_cards
# print "state:", state
# print "lenth of selected_cards:", len(selected_cards)
# for i in range(len(selected_cards)):
# print "selected_cards:" ,selected_cards[i]
# print "length of card_exposed_track:", len(card_exposed_track)
# cards are logically 60x90 pixels in size
def draw(canvas):
for card in range(len(card_images)):
offset = canvas_image_pos[0] + (card * 60)
if card_exposed[card][0]:
if card_exposed[card][1]:
# draw paired image
canvas.draw_image(card_images[card][2], [30, 45], [60, 90], [30 + offset, 45], [60, 90])
else:
canvas.draw_image(card_images[card][0], [30, 45], [60, 90], [30 + offset, 45], [60, 90])
else:
canvas.draw_image(card_face_image, [30, 45], [60, 90], [30 + offset, 45], [60, 90])
# create frame and add a button and labels
frame = simplegui.create_frame("Memory", 960, 90)
frame.set_canvas_background("White")
frame.add_button("Reset", new_game)
label = frame.add_label("Turns = 0")
# register event handlers
frame.set_mouseclick_handler(mouseclick)
frame.set_draw_handler(draw)
# get things rolling
new_game()
frame.start()