Source code for delta.golf

# patricia.delta.golf.py
# SPDX-License-Identifier: GPL-3.0-or-later
""" Jogo da Memória.

.. codeauthor:: Paulo Assumpção <paulo.assump@gmail.com>

Changelog
---------
.. versionadded::    20.07
        Grid 2x5 de cartões do jogo da memória
        shuffle das cartas
        bind do click sobre o botão
        regra do jogo

"""

from _spy.vitollino.main import Cena, Elemento, Texto, STYLE
import random

__version__ = "20.07"
__author__ = "Paulo Assumpção"

IMG_CARD_FACE_DOWN = "http://activufrj.nce.ufrj.br/file/ProgOO/Card_verso.png?disp=inline"
IMG_CARD_1 = "http://activufrj.nce.ufrj.br/file/ProgOO/Card_pycharm.png?disp=inline"
IMG_CARD_2 = "http://activufrj.nce.ufrj.br/file/ProgOO/Card_Linux.png?disp=inline"
IMG_CARD_3 = "http://activufrj.nce.ufrj.br/file/ProgOO/Card_Gitlab.png?disp=inline"
IMG_CARD_4 = "http://activufrj.nce.ufrj.br/file/ProgOO/Card_github.png?disp=inline"
IMG_CARD_5 = "http://activufrj.nce.ufrj.br/file/ProgOO/Card_Activ.png?disp=inline"

IMG_WIDTH = 150
IMG_HEIGHT = 150

"""
Classe responsável pelo desenho das cartas na cena
"""
[docs]class Card(): def __init__(self, name, image, position, cena, rule): self.rule = rule self.name = name self.cena = cena self.image = image self.faceDown = True self.position = position self.pos_x = 50 + self.position[0] * IMG_WIDTH self.pos_y = 50 + self.position[1] * IMG_HEIGHT self.card = Elemento(IMG_CARD_FACE_DOWN, tit=self.name, x=self.pos_x, y=self.pos_y, width=IMG_WIDTH, height=IMG_HEIGHT, cena=self.cena) self.card.elt.bind("click", self.turnUp) self.removed = False """ Desenha a imagem da carta quando ela está virada para cima """
[docs] def turnUp(self, env=None): self.card = Elemento(self.image, tit=self.name, x=self.pos_x, y=self.pos_y, width=IMG_WIDTH, height=IMG_HEIGHT, cena=self.cena) self.faceDown = False self.card.elt.bind("click", self.turnDown) self.rule(self)
""" Desenha a imagem da carta quando ela está virada para baixo """
[docs] def turnDown(self, env=None): self.card = Elemento(IMG_CARD_FACE_DOWN, tit=self.name, x=self.pos_x, y=self.pos_y, width=IMG_WIDTH, height=IMG_HEIGHT, cena=self.cena) self.faceDown = True self.card.elt.bind("click", self.turnUp)
""" Classe que mistura as caras, organiza na forma de matriz, e define as regras do jogo """
[docs]class Game: # referência para o Elemento previous_selected_card = None cena = Cena()
[docs] def vai(self): self.create_2x5_cards()
[docs] def create_2x5_cards(self): # matrix 2x5: # 1A 1B 2A 2B 3A # 3B 4A 4B 5A 5B list_cards = self.shuffle_cards() self.card1a = Card("PyCharm", IMG_CARD_1, list_cards[0], Game.cena, Game.rule) self.card1b = Card("PyCharm", IMG_CARD_1, list_cards[1], Game.cena, Game.rule) self.card2a = Card("Linux", IMG_CARD_2, list_cards[2], Game.cena, Game.rule) self.card2b = Card("Linux", IMG_CARD_2, list_cards[3], Game.cena, Game.rule) self.card3a = Card("GitLab", IMG_CARD_3, list_cards[4], Game.cena, Game.rule) self.card3b = Card("GitLab", IMG_CARD_3, list_cards[5], Game.cena, Game.rule) self.card4a = Card("GitHub", IMG_CARD_4, list_cards[6], Game.cena, Game.rule) self.card4b = Card("GitHub", IMG_CARD_4, list_cards[7], Game.cena, Game.rule) self.card5a = Card("Activ", IMG_CARD_5, list_cards[8], Game.cena, Game.rule) self.card5b = Card("Activ", IMG_CARD_5, list_cards[9], Game.cena, Game.rule) Game.cena.vai()
""" Estabelecendo as reggras do jogo, ou seja, verificar se as cartas são iguais, virar as cartas,... """ # vou criar um método estático para a regrado do Jogo
[docs] @staticmethod def rule(selected_card): # abortar se o clique ocorrer sobre a mesma carta if Game.previous_selected_card == selected_card: return # tem um par selecionado? if Game.previous_selected_card is None: # primeira carta selecionada Game.previous_selected_card = selected_card # desabilita o clique sobre carta virada Game.previous_selected_card.card.elt.unbind("click") return #Vamos gastar um tempo aqui while(x<10000): x=x+1 # Não acertou if Game.previous_selected_card.name != selected_card.name: # reabilita a ação o clique e vira a carta 1 para baixo Game.previous_selected_card.card.elt.bind("click", Game.previous_selected_card.turnUp) Game.previous_selected_card.turnDown() # reabilita a ação do clique e vira a carta 2 para baixo selected_card.card.elt.bind("click", selected_card.turnUp) selected_card.turnDown() Texto(Game.cena, "Errou!!!").vai() Game.previous_selected_card = None # acertou else: # desabilita o clique sobre as cartas acertadas Game.previous_selected_card = None selected_card.card.elt.unbind("click") Texto(Game.cena, "Acertou!!!").vai()
[docs] def shuffle_cards(self): list_cards = [(0,0), (1,0), (2,0), (3,0), (4,0), (0,1), (1,1), (2,1), (3,1), (4,1)] random.shuffle(list_cards) return list_cards
if __name__ == "__main__": Game().vai()