Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Build clickable version of Memory using the Tile class
- #################################################
- # Student adds code where appropriate
- #http://www.codeskulptor.org/#user41_PVXLfjf7kOdDozJ.py
- import simplegui
- import random
- # define globals
- TILE_WIDTH = 50
- TILE_HEIGHT = 100
- DISTINCT_TILES = 8
- # helper function to initialize globals
- def new_game():
- global my_tiles, state, turns, selected_pair
- tile_numbers = range(DISTINCT_TILES) * 2
- random.shuffle(tile_numbers)
- my_tiles = [Tile(tile_numbers[i], False, [TILE_WIDTH * i, TILE_HEIGHT]) for i in range(2 * DISTINCT_TILES)]
- selected_pair = []
- state = 0
- turns = 0
- label.set_text("Turns = "+str(turns))
- # definition of a Tile class
- class Tile:
- # definition of intializer
- def __init__(self, num, exp, loc):
- self.number = num
- self.exposed = exp
- self.location = loc
- # definition of getter for number
- def get_number(self):
- return self.number
- # check whether tile is exposed
- def is_exposed(self):
- return self.exposed
- # expose the tile
- def expose_tile(self):
- self.exposed = True
- # hide the tile
- def hide_tile(self):
- self.exposed = False
- # string method for tiles
- def __str__(self):
- return "Number is " + str(self.number) + ", exposed is " + str(self.exposed)
- # draw method for tiles
- def draw_tile(self, canvas):
- loc = self.location
- if self.exposed:
- text_location = [loc[0] + 0.2 * TILE_WIDTH, loc[1] - 0.3 * TILE_HEIGHT]
- canvas.draw_text(str(self.number), text_location, TILE_WIDTH, "White")
- else:
- tile_corners = (loc, [loc[0] + TILE_WIDTH, loc[1]], [loc[0] + TILE_WIDTH, loc[1] - TILE_HEIGHT], [loc[0], loc[1] - TILE_HEIGHT])
- canvas.draw_polygon(tile_corners, 1, "Red", "Green")
- # selection method for tiles
- def is_selected(self, pos):
- inside_hor = self.location[0] <= pos[0] < self.location[0] + TILE_WIDTH
- inside_vert = self.location[1] - TILE_HEIGHT <= pos[1] <= self.location[1]
- return inside_hor and inside_vert
- # define event handlers
- def mouseclick(pos):
- global state, selected_pair, turns
- for tile in my_tiles:
- if tile.is_selected(pos) and not tile.is_exposed():
- tile.expose_tile()
- if state < 2:
- selected_pair.append(tile)
- state += 1
- else:
- if not selected_pair[0].get_number() == selected_pair[1].get_number():
- [card.hide_tile() for card in selected_pair]
- selected_pair = [tile]
- state = 1
- turns += 1
- # draw handler
- def draw(canvas):
- for tile in my_tiles:
- tile.draw_tile(canvas)
- # create frame and add a button and labels
- frame = simplegui.create_frame("Memory", 2 * DISTINCT_TILES * TILE_WIDTH, TILE_HEIGHT)
- frame.add_button("Restart", new_game)
- label = frame.add_label("Turns = 0")
- frame.set_draw_handler(draw)
- frame.set_mouseclick_handler(mouseclick)
- # get things rolling
- new_game()
- frame.start()
- ###################################################
- # Clicking on tile should flip them once
Advertisement
Add Comment
Please, Sign In to add comment