randomly positioned circle clicking game

馋奶兔 提交于 2019-12-11 17:56:03

问题


So I'm still very new to python and trying to learn through making small projects. The game I'm making is meant to test your mouse accuracy by creating a bunch of random circles which the player is meant to click in a given amount of time. At the end of the game, it should tell the player their score, and how many misclicks they had.

I've been using turtle to try and do this, but I'm stuck:

import turtle
import random
t = turtle.Pen()

win = turtle.Screen()
win.bgcolor("lightgreen")
win.title("clicky")


def mycircle(red, green, blue):
    t.color(red, green, blue)
    t.begin_fill()
    x = random.randint(10,50)
    t.circle(x)
    t.end_fill()
    t.up()
    y = random.randint(0,360)
    t.seth(y) 
    if t.xcor() < -300 or t.xcor() > 300:
        t.goto(0, 0)
    elif t.ycor() < -300 or t.ycor() > 300:
        t.goto(0, 0)
    z = random.randint(0,100)
    t.forward(z)
    t.down()

for i in range(0, 20):
    a = random.randint(0,100)/100.0
    b = random.randint(0,100)/100.0
    c = random.randint(0,100)/100.0
    mycircle(a, b, c)

The main issues I've been trying to figure out are:

  • How can I make the circles spawn further from each other? They overlap quite often and I want that to be avoided.

  • How can I make the circles spawn instantly rather than having to be drawn?


回答1:


How can I make the circles spawn further from each other?

We can keep track of circles already created and make sure their centers are at least a diameter away from each other. Your current circle placement logic is too complicated along with being faulty. Let's try to simplify it and make sure circles are drawn completely within the window.

How can I make the circles spawn instantly rather than having to be drawn?

We could stamp them rather than draw them. However, since you are drawing so few circles, we can make every circle a turtle. This makes determining if you clicked on a circle, and removing that circle, simpler. I've added code, for you to expand on, that removes any circle that you click on:

from turtle import Turtle, Screen
from random import random, randint

CURSOR_SIZE = 20

def my_circle(color):
    radius = randint(10, 50)

    circle = Turtle('circle', visible=False)
    circle.shapesize(radius / CURSOR_SIZE)
    circle.color(color)
    circle.penup()

    while True:
        nx = randint(2 * radius - width // 2, width // 2 - radius * 2)
        ny = randint(2 * radius - height // 2, height // 2 - radius * 2)

        circle.goto(nx, ny)

        for other_radius, other_circle in circles:
            if circle.distance(other_circle) < 2 * max(radius, other_radius):
                break  # too close, try again
        else:  # no break
            break

    circle.showturtle()

    circle.onclick(lambda x, y, t=circle: t.hideturtle())  # expand this into a complete function

    return radius, circle

screen = Screen()
screen.bgcolor("lightgreen")
screen.title("clicky")

width, height = screen.window_width(), screen.window_height()

circles = []

for _ in range(0, 20):
    rgb = (random(), random(), random())

    circles.append(my_circle(rgb))

screen.mainloop()

One issue you need to work out is making sure your circle color isn't too similar to (or the same as) your background color, otherwise you'll be hunting an invisible circle. Also, we might be able to speed up the circle drawing process even more, if needed.



来源:https://stackoverflow.com/questions/50548821/randomly-positioned-circle-clicking-game

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!