Advertisement
beezing

Memory Card - Pythonista

Apr 15th, 2014
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.58 KB | None | 0 0
  1. # Memory Card Game
  2. #
  3. # In this game, you have to find matching pairs of cards.
  4. # This scene consists entirely of layers and demonstrates some
  5. # interesting animation techniques.
  6. #
  7. # Originally sample of Pythonista app.
  8. # Modified and enhanced by @beezing.
  9. # Added more image theme and simple scoring.
  10.  
  11. from scene import *
  12. from random import shuffle, sample, randint
  13. from functools import partial
  14. import sound
  15.  
  16. class Game (Scene):
  17.   def setup(self):
  18.     self.root_layer = Layer(self.bounds)
  19.     for effect in ['Click_1', 'Click_2', 'Coin_2', 'Coin_5']:
  20.       sound.load_effect(effect)
  21.     self.deal()
  22.  
  23.   def should_rotate(self, orientation):
  24.     return False
  25.  
  26.   def draw(self):
  27.     background(0.0, 0.2, 0.3)
  28.     self.root_layer.update(self.dt)
  29.     self.root_layer.draw()
  30.  
  31.     # draw title and score
  32.     title = 'Kartu Ingatan' # 'Memory Cards'
  33.     if not self.size.w > 320:
  34.       text(title, 'Arial', 24, self.size.w/2, self.size.h-50)
  35.     else:
  36.       for i in xrange(len(title)):
  37.         text(title[i], 'Arial', 24, 50, self.size.h - i*20 - 40)
  38.     if not self.size.w > 320:
  39.       text(str(self.tap_count), 'Arial', 20, self.size.w/2, 50)
  40.     else:
  41.       text(str(self.tap_count), 'Arial', 20, self.size.w-50, self.size.h/2)
  42.     if not self.size.w > 320:
  43.       # 'for Bina from Dad'
  44.       text('untuk Bina dari Ayah', 'Arial', 12, self.size.w/2, 20)
  45.     else:
  46.       text('untuk', 'Arial', 12, self.size.w-50, 42)
  47.       text('Bina', 'Arial', 12, self.size.w-50, 30)
  48.  
  49.   def deal(self):
  50.     # animals face
  51.     img_lib1 = ['Rabbit_Face',
  52.                'Mouse_Face',
  53.                'Cat_Face',
  54.                'Dog_Face',
  55.                'Octopus',
  56.                'Bear_Face',
  57.                'Chicken',
  58.                'Cow_Face',
  59.                'Frog_Face',
  60.                'Horse_Face',
  61.                'Tiger_Face',
  62.                'Panda_Face',
  63.                'Pig_Face',
  64.                'Hamster_Face',
  65.                'Koala',
  66.                'Penguin'] # 16 images
  67.     # fruits and plantations
  68.     img_lib2 = ['Aubergine',
  69.                'Banana',
  70.                'Cherries',
  71.                'Corn',
  72.                'Grapes',
  73.                'Red_Apple',
  74.                'Melon',
  75.                'Strawberry',
  76.                'Tangerine',
  77.                'Watermelon',
  78.                'Mushroom',
  79.                'Four_Leaf_Clover',
  80.                'Blossom',
  81.                'Maple_Leaf',
  82.                'Hibiscus',
  83.                'Cactus'] # 16 images
  84.     # various objects
  85.     img_lib3 = ['Star_1',
  86.                'Moon_1',
  87.                'Heart',
  88.                'Car_1',
  89.                'Rocket',
  90.                'Game_Die',
  91.                'Light_Bulb',
  92.                'Basketball',
  93.                'Telephone_Receiver',
  94.                'Soccer_Ball',
  95.                'Tennis_Ball',
  96.                'Closed_Book',
  97.                'Pencil',
  98.                'Key',
  99.                'Lock_2',
  100.                'Bell'] # 16 images
  101.  
  102.     # grid dimension
  103.     img_used = 8 # 8 for 4x4 grid (half number of the grid)
  104.     self.card_used = img_used * 2 # double for card pairs
  105.  
  106.     # randomly select card theme from image library
  107.     img = randint(1,9)
  108.     if img % 3 == 0: # 3,6,9
  109.       images = sample(img_lib1, img_used)
  110.     elif img % 2 == 0: # 2,4,8
  111.       images = sample(img_lib2, img_used)
  112.     else: # 1,5,7
  113.       images = sample(img_lib3, img_used)
  114.     images = images * 2
  115.     shuffle(images)
  116.     for image in images:
  117.       load_image(image)
  118.  
  119.     self.root_layer.sublayers = []
  120.     self.cards = []
  121.     self.selected = []
  122.  
  123.     # adjust card size to device
  124.     card_size = 96 if self.size.w > 700 else 64
  125.     width = (card_size + 4) * 4
  126.     height = (card_size + 4) * (self.card_used / 4)
  127.  
  128.     # adjust to orientation
  129.     if self.size.w > 320:
  130.       offset = Point((self.size.w - height)/2,(self.size.h - width)/2)
  131.     else:
  132.       offset = Point((self.size.w - width)/2,(self.size.h - height)/2)
  133.  
  134.     for i in xrange(len(images)):
  135.       if self.size.w > 320:
  136.         x, y = i/4, i%4
  137.       else:
  138.         x, y = i%4, i/4
  139.  
  140.       card = Layer(Rect(offset.x + x * (card_size + 5), offset.y + y * (card_size + 5), card_size, card_size))
  141.       card.card_image = images[i]
  142.       card.background = Color(0.9, 0.9, 0.9)
  143.       card.stroke = Color(1, 1, 1)
  144.       card.stroke_weight = 4.0
  145.       self.add_layer(card)
  146.       self.cards.append(card)
  147.     self.touch_disabled = False
  148.     self.tap_count = 0
  149.  
  150.   def touch_began(self, touch):
  151.     if self.touch_disabled or len(self.cards) == 0:
  152.       return
  153.     if len(self.selected) == 2:
  154.       self.discard_selection()
  155.       #return
  156.     for card in self.cards:
  157.       if card in self.selected or len(self.selected) > 1:
  158.         continue
  159.       if touch.location in card.frame:
  160.         def reveal_card():
  161.           card.image = card.card_image
  162.           card.animate('scale_x', 1.0, 0.15, completion=self.check_selection)
  163.         self.selected.append(card)
  164.         self.touch_disabled = True
  165.         card.animate('scale_x', 0.0, 0.15, completion=reveal_card)
  166.         card.scale_y = 1.0
  167.         card.animate('scale_y', 0.9, 0.15, autoreverse=True)
  168.         sound.play_effect('Click_1')
  169.         self.tap_count += 1
  170.         break
  171.  
  172.   def discard_selection(self):
  173.     sound.play_effect('Click_2')
  174.     for card in self.selected:
  175.       def conceal(card):
  176.         card.image = None
  177.         card.animate('scale_x', 1.0, 0.15)
  178.       card.animate('scale_x', 0.0, 0.15, completion=partial(conceal, card))
  179.       card.scale_y = 1.0
  180.       card.animate('scale_y', 0.9, 0.15, autoreverse=True)
  181.     self.selected = []
  182.  
  183.   def check_selection(self):
  184.     self.touch_disabled = False
  185.     if len(self.selected) == 2:
  186.       card_img1 = self.selected[0].card_image
  187.       card_img2 = self.selected[1].card_image
  188.       if card_img1 == card_img2:
  189.         sound.play_effect('Coin_5')
  190.         for c in self.selected:
  191.           c.animate('background', Color(0.5, 1, 0.5))
  192.           self.cards.remove(c)
  193.           self.selected = []
  194.           if len(self.cards) == 0:
  195.             self.win()
  196.  
  197.   def new_game(self):
  198.     sound.play_effect('Coin_2')
  199.     self.deal()
  200.     self.root_layer.animate('scale_x', 1.0)
  201.     self.root_layer.animate('scale_y', 1.0)
  202.  
  203.   def win(self):
  204.     self.delay(0.5, partial(sound.play_effect, 'Powerup_2'))
  205.     font_size = 100 if self.size.w > 700 else 50
  206.  
  207.     # show score rating
  208.     if self.tap_count < self.card_used:
  209.       txt = 'Sakti!' # 'Impossible!'
  210.     elif self.tap_count == self.card_used:
  211.       txt = 'Sempurna!' # 'Perfect!'
  212.     elif self.tap_count <= 1.5*self.card_used:
  213.       txt = 'Hebat!' # 'Excellent!'
  214.     elif self.tap_count <= 2*self.card_used:
  215.       txt = 'Bagus!' # 'Great!'
  216.     elif self.tap_count <= 2.5*self.card_used:
  217.       txt = 'Lumayan!' # 'Good!'
  218.     elif self.tap_count <= 3*self.card_used:
  219.       txt = 'Biasa!' # 'Average!'
  220.     else:
  221.       txt = 'Jelek!' # 'Bad!'
  222.  
  223.     text_layer = TextLayer(txt, 'Futura', font_size)
  224.     text_layer.frame.center(self.bounds.center())
  225.     overlay = Layer(self.bounds)
  226.     overlay.background = Color(0, 0, 0, 0)
  227.     overlay.add_layer(text_layer)
  228.     self.add_layer(overlay)
  229.     overlay.animate('background', Color(0.0, 0.2, 0.3, 0.7))
  230.     text_layer.animate('scale_x', 1.3, 0.3, autoreverse=True)
  231.     text_layer.animate('scale_y', 1.3, 0.3, autoreverse=True)
  232.     self.touch_disabled = True
  233.     self.root_layer.animate('scale_x', 0.0, delay=5.0,
  234.                             curve=curve_ease_back_in)
  235.     self.root_layer.animate('scale_y', 0.0, delay=5.0,
  236.                             curve=curve_ease_back_in,
  237.                             completion=self.new_game)
  238.  
  239. run(Game())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement