[英]How to choose a random color for each ball that will show up every time?
這是一款簡單的 python“飛鳥”游戲。 我正在努力為每次出現的每個球選擇一種隨機顏色——我該怎么做?
from random import *
from turtle import *
from freegames import vector
bird = vector(0,0)
balls=[]
def tap (x, y):
"""Move bird up in response to screen tap"""
up=vector(0,30)
bird.move(up)
def inside(point):
"""Return true if point on screen """
return -200 < point.x< 200 and -200 < point.y < 200
def draw(alive):
"""Draw screen objects."""
clear()
goto(bird.x, bird.y)
if alive:
dot(10,'green')
else:
dot(10,'red')
for ball in balls:
goto(ball.x, ball.y)
dot(20,'black')
update()
def move():
"""Update object positions."""
bird.y -= 5
for ball in balls:
ball.x -= 3
if randrange(10)==0:
y=randrange(-199,199)
ball=vector(199,y)
balls.append(ball)
while len(balls) >0 and not inside(balls[0]):
balls.pop(0)
draw (True)
ontimer (move,50)
if not inside(bird):
draw(False)
return
for ball in balls:
if abs(ball-bird)< 15:
draw(False)
return
setup(420,420,370,0)
hideturtle()
up()
tracer(False)
onscreenclick(tap)
move()
done()
根據turtle docs dot 將接受顏色字符串或 rgb 值。 要為 dot 提供 rgb 值,您必須使用語法dot(size, r, g, b)
來指定顏色。 要生成隨機顏色來填充這些值,我們應該創建一個 function。
# Create a random color tuple
import random
import turtle
turtle.colormode(255)
def randomColor():
return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
# Now we can use this with dot like so
# Note we are using * to unpack the random color for dot()
turtle.dot(10, *randomColor())
至少有三種方法可以在 Python turtle 中生成隨機顏色值:
>>> import turtle
>>> from random import random
>>> turtle.colormode() # confirm the default
>>> 1.0
>>> turtle.dot(20, (random(), random(), random()))
正如@Alec Soronow 指出的那樣,另一種方法是更改默認顏色模式並使用 integer 顏色值:
>>> from random import randint
>>> turtle.colormode(255)
>>> turtle.dot(20, (randint(0, 255), randint(0, 255), randint(0, 255)))
由於dot()
也可以接受十六進制顏色字符串,例如'#a5b8af'
,我們也可以這樣做:
>>> hex_color = '#' + hex(randint(0, 256**3 - 1)).replace('0x', '').zfill(6)
>>> turtle.dot(20, hex_color)
這會得到你的隨機顏色,但不能解決讓球記住它的顏色的問題。 您可以通過將向量和顏色的balls
元組存儲在球中來解決此問題,然后當您訪問它時,您可以執行以下操作:
for ball, color in balls:
# whatever
但我將建議一種不同的方法,即讓你的鳥和球都成為海龜而不是向量。 就像是:
from random import random, randrange
from turtle import Screen, Turtle
def tap(x, y):
""" Move bird up in response to screen tap """
bird.forward(30)
def inside(entity):
""" Return true if point on screen """
x, y = entity.position()
return -200 < x < 200 and -200 < y < 200
balls = []
spare_balls = []
def move():
""" Update object positions """
global balls
if inside(bird):
for ball in balls:
if ball.distance(bird) < 15:
bird.color('red')
screen.update()
return
else:
bird.color('red')
screen.update()
return
bird.backward(5)
for ball in balls:
ball.forward(3)
inside_balls = []
for ball in balls:
if inside(ball):
inside_balls.append(ball)
else:
ball.hideturtle()
spare_balls.append(ball)
balls = inside_balls
if randrange(10) == 0:
if spare_balls:
ball = spare_balls.pop()
else:
ball = Turtle(shape='circle', visible=False)
ball.penup()
ball.setheading(180)
ball.setposition(199, randrange(-199, 199))
ball.color(random(), random(), random())
balls.append(ball)
ball.showturtle()
screen.update()
screen.ontimer(move, 50)
screen = Screen()
screen.setup(420, 420, 370, 0)
screen.tracer(False)
bird = Turtle()
bird.shape('turtle')
bird.color('green')
bird.penup()
bird.setheading(90)
screen.onclick(tap)
move()
screen.mainloop()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.