簡體   English   中英

如何為每次出現的每個球選擇隨機顏色?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM