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…
01.import turtle
02. 
03.def circunf(posx, posy, raio, cor):
04.    # posiciona
05.    turtle.pu()
06.    turtle.goto(posx,posy-raio)
07.    turtle.pd()
08.    # define cor e desenha
09.    turtle.fillcolor(cor)
10.    turtle.begin_fill()
11.    turtle.circle(raio)
12.    turtle.end_fill()
13.    turtle.hideturtle()
14.     
15.def alvo(posx, posy,raios):
16.    """
17.    raios: lista dos raios dos discos
18.    """
19.    raios.sort(reverse=True)
20.    cor = 'black'
21.    for raio in raios:
22.        circunf(posx,posy,raio,cor)
23.        if cor == 'black':
24.            cor = 'white'
25.        else:
26.            cor = 'black'
27. 
28.             
29.def dardo():
30.    import random
31.    posx = random.randint(-100,100)
32.    posy = random.randint(-100,100)
33.    turtle.pu()
34.    turtle.goto(posx,posy)
35.    turtle.pd()
36.    turtle.dot(8,'red')
37.    turtle.hideturtle()
38. 
39. 
40.if __name__ == ‘__main__’:
41.    alvo(0,0,[20,40,60,80])
42.    dardo()
43.    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