Usando um Mapa¶
Nesta tela vamos montar um simulacro do primeiro desafio kwarwp. O desafio será montado a partir de um mapa com símbolos.
Note
Nesta versão estamos usando um componente especial do vitollino o Jogo. O Jogo é uma fábrica de componentes Vitollino, retorna um componente construído com os mesmos parâmetros de chamada de um compnente original. Veja alguns métodos usados no exemplo abaixo
Chamadas do Jogo¶
- Jogo.c:
- Equivale a chamar uma Cena importada do Vitollino
- Jogo.a:
- Equivale a chamar um Elemento importado do Vitollino
Código Fonte¶
Aqui especificamos um mapa que orienta a construção da arena. Cada símbolo representa um elemento, definido a seguir num dicionário de imagens dos elementos.
MAPA_INICIO = """
@....&
......
......
.#.^..
"""
Arena onde os desafios ocorrem.¶
Esta versão recebe como parâmetro um mapa que define a montagem da arena.
param vitollino: Empacota o engenho de jogo Vitollino. param mapa: Um texto representando o mapa do desafio.
class Kwarwp():
...
Esta versão usa um dicionário para guardar as imagens dos elementos.
GLIFOS = {
"&": "https://i.imgur.com/dZQ8liT.jpg", # OCA ⛺
"^": "https://imgur.com/8jMuupz.png", # INDIO 🧍
".": "https://i.imgur.com/npb9Oej.png", # VAZIO 🗌
"_": "https://i.imgur.com/sGoKfvs.jpg", # SOLO 🛏️
"#": "https://imgur.com/ldI7IbK.png", # TORA 💈
"@": "https://imgur.com/tLLVjfN.png", # PICHE 🕳️
"~": "https://i.imgur.com/UAETaiP.gif", # CEU 🌌
"*": "https://i.imgur.com/PfodQmT.gif" # SOL ☀️
}
A arena é construída a partir da matriz textual mapa dada. O atributo lado define a largura e altura .
def __init__(self, vitollino=None, mapa=MAPA_INICIO, medidas={}):
self.v = vitollino()
"""Cria um matriz com os elementos descritos em cada linha de texto"""
mapa = mapa.split()
"""Largura da casa da arena dos desafios, número de colunas no mapa"""
self.lado, self.col = 100, len(mapa[0])
self.cena = self.cria(mapa=mapa) if vitollino else None
A arena é construída a partir da matriz usando uma list comprehension .
def cria(self, mapa=" "):
Cria o ambiente de programação Kwarwp.
param mapa: Um texto representando o mapa do desafio.
"""Cria um cenário com imagem de terra de chão batido, céu e sol"""
lado = self.lado
cena = self.v.c(self.GLIFOS["_"])
ceu = self.v.a(self.GLIFOS["~"], w=lado*self.col, h=lado, x=0, y=0, cena=cena)
sol = self.v.a(self.GLIFOS["*"], w=60, h=60, x=0, y=40, cena=cena)
A construção entre chaves [] é chamada list comprehension. Neste caso usamos intenamente duas iterações, uma para as linhas e outras para as colunas. Tabém estamos usando a função embutida enumerate(). Esta função pega uma lista e retorna outra lista, mas contendo tuplas onde o primeiro elemento é o índice do elemento original e o outro é o elemento original. . Posiciona os elementos segundo suas posições i, j na matriz mapa
[self.cria_elemento(imagem, x=i*lado, y=j*lado+lado, cena=cena)
for j, linha in enumerate(mapa) for i, imagem in enumerate(linha)]
cena.vai()
return cena
Cria um elemento na arena do Kwarwp na posição definida.
param x: coluna em que o elemento será posicionado. param y: linha em que o elemento será posicionado. param cena: cena em que o elemento será posicionado.
def cria_elemento(self,imagem, x, y, cena):
lado = self.lado
return self.v.a(self.GLIFOS[imagem], w=lado, h=lado, x=i*lado, y=j*lado+lado, cena=cena)