quinta-feira, 8 de janeiro de 2015

Teste Final - Pergunta 2

Simular um jogo em que se atiram dardos a um alvo. No caso do teste o problema era mais simples pois não se pretendia simular o jogo mas apenas desenhar o alvo e simular o lançamento de um dardo. E fazer isto usando o módulo turtle. E construindo o programa de forma modular.

Vamos então dividir a solução em duas partes: uma para desenhar o alvo, e outra para simular o lançamento do dardo. Por outro lado, vamos fazer com que o desenho do alvo seja feito à custa de uma mesma função, a que desenha um círculo de uma dada cor, numa dada posição e com o dado raio. Essa função chama-se circunf. A partir dela desenhar o alvo é fácil (função alvo). Estas última precisa saber apenas o centro do alvo e o valor dos raios. Os cuidados a ter são desenhar as circunferências da maior para a mais pequena (notar o ordenamento inverso da lista dos raios), e controlar a alternância das cores.

O lançamento do dardo recorre ao módulo random para geral a posição, e ao comando dot para marcar a localização do dardo. Neste último caso, não conhecendo o comando dot, podia socorrer-se uma vez mais ao desenho de uma circunferência…
import turtle

def circunf(posx, posy, raio, cor):
    # posiciona
    turtle.pu()
    turtle.goto(posx,posy-raio)
    turtle.pd()
    # define cor e desenha
    turtle.fillcolor(cor)
    turtle.begin_fill()
    turtle.circle(raio)
    turtle.end_fill()
    turtle.hideturtle()
    
def alvo(posx, posy,raios):
    """
    raios: lista dos raios dos discos
    """
    raios.sort(reverse=True)
    cor = 'black'
    for raio in raios:
        circunf(posx,posy,raio,cor)
        if cor == 'black':
            cor = 'white'
        else:
            cor = 'black'

            
def dardo():
    import random
    posx = random.randint(-100,100)
    posy = random.randint(-100,100)
    turtle.pu()
    turtle.goto(posx,posy)
    turtle.pd()
    turtle.dot(8,'red')
    turtle.hideturtle()


if __name__ == ‘__main__’:
    alvo(0,0,[20,40,60,80])
    dardo()
    turtle.exitonclick()
Como se pode ver pelo código o programa é facilmente generalizável. Alvo de vários tamanhos (directo) e cores (passando as cores para argumentos), por exemplo.

Sem comentários:

Enviar um comentário