abbarnes icon

Memory V2 with classes [codeskulptor]

abbarnes | PRO | 12/12/17 03:15:37 PM UTC | 0 ⭐ | 279 👁️ | Never ⏰ | []
Python |

3.42 KB

|

None

|

0 👍

/

0 👎

# 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

Comments