点击圈游戏 - 点击圈子外部和内部

时间:2018-05-10 13:00:55

标签: python python-3.x

我正在尝试对具有红色圆圈的游戏进行编码,其中用户应该在窗口中最多点击7次。如果用户点击圈子外部,圈子会将其位置更改为用户点击的位置。当用户在圈内单击3次(不必连续)或用户总共点击7次时,游戏应该结束。 我编写并完成了大部分工作,我认为,它只是让我无法按照我想要的那样工作。

from graphics import *

def draw_circle(win, c=None):

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

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

def main():
    win= GraphWin("game",800,800)
    score = 0
    var,x,y = draw_circle(win)
    while score <= 7:
        mouseClick2=win.getMouse()
        if mouseClick2.y >= y-50 and mouseClick2.y <= y +50 and 
mouseClick2.x >= x-50 and mouseClick2.x <= x+50:
            score=score + random.randint(0,5)
        var,x,y = draw_circle(win, c)

    print ("Success!")
    print (("the score is, {0}").format(score))

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我不是一个真正的蟒蛇人,但我看到你的hitbox是错误的。如果还有其他问题,请将其评论给我。

将hitbox解为圆圈

你已经写好了有东西但是你应该检查点击是否在圆形而不是方形。毕达哥拉斯三角形就是解决这个问题的方法。 检查:

if (math.sqrt(delta_x **2 + delta_y **2) <= circle_radius)

其中delta_x和delta_y是中心坐标减去鼠标位置

答案 1 :(得分:0)

我看到了几个问题。

  • 您的if mouseClick2.y >= y-50...条件分布在两行,但您没有行继续符。
  • 您永远不会致电main()
  • 您不导入random
  • 您使用draw_circle参数调用while循环中的c,但全局范围内没有该名称的变量。你可能打算传入var
  • c中的
  • draw_circle表面上是指您想要操纵的圆形对象,但有一半时间是您操纵var而不是c
  • 您在循环中为cvar分配值,但从不使用它。
  • else中的draw_circle块通过从c.p1中减去光标坐标来计算移动增量。但是c.p1是圆圈的左上角,而不是圆圈的中心。所以你的命中检测是50像素。

import random
from graphics import *

def draw_circle(win, c=None):

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

    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 main():
    win= GraphWin("game",800,800)
    score = 0
    var,x,y = draw_circle(win)
    while score <= 7:
        mouseClick2=win.getMouse()
        if mouseClick2.y >= y-50 and mouseClick2.y <= y +50 and \
mouseClick2.x >= x-50 and mouseClick2.x <= x+50:
            score=score + random.randint(0,5)
        var,x,y = draw_circle(win, var)

    print ("Success!")
    print (("the score is, {0}").format(score))

main()

其他可能的改进:

  • 您的命中检测会检查光标是否位于以圆圈为中心的50x50矩形中。如果你测量光标和中心之间的距离,你可以检查光标是否在圆圈内,并检查它是否小于半径。
  • varc可以拥有更多描述性名称。
  • mouseClick2作为名称没有多大意义,因为没有mouseClick1
  • 可以简化移动增量算术:(a-b) * -1(b-a)相同。
  • 如果您只使用变量的值一次,如果嵌套表达式,有时可以完全避免创建变量。
  • 定义常量可能会很好,例如圆圈的半径,而不是代码中有魔术数字。
  • 您可以使用+=来增加分数,从而节省五个字符。

import math
import random
from graphics import *

RADIUS = 50

def draw_circle(win, circle=None):

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

    if circle is None:
        circle = Circle(Point(x,y),RADIUS)
        circle.setFill(color_rgb(200,0,0))
        circle.draw(win)
    else:
        circle.move(
            x - circle.p1.x - RADIUS, 
            y - circle.p1.y - RADIUS
        )
    return (circle, x, y)

def main():
    win= GraphWin("game",800,800)
    score = 0
    circle,x,y = draw_circle(win)
    while score <= 7:
        cursor = win.getMouse()
        if math.hypot(cursor.x - x, cursor.y - y) <= RADIUS:
            score += random.randint(0,5)
        circle,x,y = draw_circle(win, circle)

    print ("Success!")
    print (("the score is, {0}").format(score))

main()