Получение круговой позиции, где пользователь нажимает? - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующий код, который должен быть круговой игрой, где, если пользователь щелкает внутри круга 2 раза, игра заканчивается.Или за пределами круга (всего 7 кликов и игра тоже закончится) и круг поменяет свою позицию.Вот где мне нужно некоторое руководство и объяснение того, как решить.

Когда я щелкаю за пределами круга, мне нужно, чтобы он появлялся в той позиции, где я нажал, а не просто в случайной позиции в окне, как это происходит.сейчас.Пожалуйста, объясните, как я могу подойти к этому :)

import random
from graphics import *

def draw_circle(win, c = None):

    x = random.randint(0,600)
    y = random.randint(0,600)

    if c is None:
        centa = Point(x,y)
        c = Circle(centa,50)
        c.setFill(color_rgb(200,0,0))
        c.draw(win)
    else:
        center_x = c.p1.x + 50
        center_y = c.p1.y + 50
        x_dif = (center_x - x) * -1
        y_dif = (center_y - y) * -1
        c.move(x_dif, y_dif)
    return (c, x, y)

def circleGame():
    win= GraphWin("Click circles", 600, 600)
    totalClicks = 0
    var,x,y = draw_circle(win)
    clickInside = 0

    while totalClicks < 10 and clickInside < 3:
        totalClicks += 1
        mouseClick2 = win.getMouse()
        if mouseClick2.y >= y-50 and mouseClick2.y <= y +50 and \
mouseClick2.x >= x-50 and mouseClick2.x <= x+50:
            clickInside +=1
            totalClicks += random.randint(0,5)
        var,x,y = draw_circle(win, var)

circleGame()

спасибо большое заранее!

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Ваша draw_circle функция выполняет две разные функции, поэтому я не уверен, что имеет смысл сохранять ее как одну функцию.Он не обновляет координаты x и y круга правильно, потому что вы всегда возвращаете случайные координаты, даже если вы должны возвращать координаты перемещенного круга.Я разбил две части этой функции на основную функцию circle_game в моем коде ниже.

Я заменил ваш чек на щелчок внутри квадрата проверкой на щелчок внутри круга: (mouse.x - circle_x ) ** 2 + (mouse.y - circle_y) ** 2 <= CIRCLE_RADIUS_SQUARED.

Я также понятия не имею, чего пытался достичь totalClicks += random.randint(0,5).

import random

from graphics import *


def circle_game():
    CANVAS_WIDTH = 600
    CANVAS_HEIGHT = 600
    CIRCLE_RADIUS = 50
    CIRCLE_RADIUS_SQUARED = CIRCLE_RADIUS * CIRCLE_RADIUS

    window = GraphWin("Click circles", CANVAS_WIDTH, CANVAS_HEIGHT)

    # Draw circle at random location to start game
    circle_x = random.randint(0, CANVAS_WIDTH)
    circle_y = random.randint(0, CANVAS_HEIGHT)
    circle_point = Point(circle_x, circle_y)
    circle = Circle(circle_point, CIRCLE_RADIUS)
    circle.setFill(color_rgb(200, 0, 0))
    circle.draw(window)

    total_clicks = 0
    inside_clicks = 0
    while total_clicks < 10 and inside_clicks < 3:
        mouse = window.getMouse()
        total_clicks += 1
        if (mouse.x - circle_x ) ** 2 + (mouse.y - circle_y) ** 2 <= CIRCLE_RADIUS_SQUARED:
            # Click was inside circle so we don't move circle
            inside_clicks +=1
        else:
            # Click was not inside circle so we move circle to mouse location
            dx = mouse.x - circle_x
            dy = mouse.y - circle_y
            circle.move(dx, dy)
            circle_x += dx
            circle_y += dy


if __name__ == '__main__':
    circle_game()
0 голосов
/ 11 мая 2018

В вашей функции draw_circle вы устанавливаете x и y на случайные значения, а затем делаете x_dif =(center_x - x) * -1 и y_dif = (center_y - y) * -1, так что теперь вы основываете местоположение на случайных значениях x и y. И тогда вы возвращаете эти случайные значения. Кроме того, x - center_x проще, чем (center_x - x) * -1.

Другая проблема - if mouseClick2.y >= y-50 and mouseClick2.y <= y +50 and mouseClick2.x >= x-50 and mouseClick2.x <= x+50:. Это и сложнее, чем нужно, и не тест на круг; это тест на квадрат. Вы должны иметь (mouseClick2.y-y)**2+(mouseClick2.x-x)**2 <= 2500.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...