如何为特定用户打开窗口discord.py

2024-04-18 08:03:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个discord机器人,您可以通过键入!pong之类的命令来玩游戏,它将打开一个窗口来玩经典的乒乓球游戏。问题是,每当除我以外的任何用户键入命令(例如!snake)时,它都会为我打开窗口,而不是为他们打开窗口。我怎样才能为他们打开窗户? 这是我的密码:

    @client.command()
    async def snake(ctx):
      await ctx.send(f"Open snake game for {ctx.author.name}...")
      # Score
      score = 0
      high_score = 0

      # Set up the screen
      wn = turtle.Screen()
      wn.title("Snake Game")
      wn.bgcolor("green")
      wn.setup(width=600, height=600)
      wn.tracer(0) # Turns off the screen updates

      # Snake head
      head = turtle.Turtle()
      head.speed(0)
      head.shape("square")
      head.color("black")
      head.penup()
      head.goto(0,0)
      head.direction = "stop"

      # Snake food
      food = turtle.Turtle()
      food.speed(0)
      food.shape("circle")
      food.color("red")
      food.penup()
      food.goto(0,100)

      segments = []

      # Pen
      pen = turtle.Turtle()
      pen.speed(0)
      pen.shape("square")
      pen.color("white")
      pen.penup()
      pen.hideturtle()
      pen.goto(0, 260)
      pen.write("Score: 0  High Score: 0", align="center", font=("Courier", 24, "normal"))

      # Functions
      def go_up():
          if head.direction != "down":
              head.direction = "up"

      def go_down():
          if head.direction != "up":
              head.direction = "down"

      def go_left():
          if head.direction != "right":
              head.direction = "left"

      def go_right():
          if head.direction != "left":
              head.direction = "right"

      def move():
          if head.direction == "up":
              y = head.ycor()
              head.sety(y + 20)

          if head.direction == "down":
              y = head.ycor()
              head.sety(y - 20)

          if head.direction == "left":
              x = head.xcor()
              head.setx(x - 20)

          if head.direction == "right":
              x = head.xcor()
              head.setx(x + 20)

      # Keyboard bindings
wn.listen()
wn.onkeypress(go_up, "w")
wn.onkeypress(go_down, "s")
wn.onkeypress(go_left, "a")
wn.onkeypress(go_right, "d")

# Main game loop
while True:
    wn.update()

    # Check for a collision with the border
    if head.xcor()>290 or head.xcor()<-290 or head.ycor()>290 or head.ycor()<-290:
        time.sleep(1)
        head.goto(0,0)
        head.direction = "stop"

        # Hide the segments
        for segment in segments:
            segment.goto(1000, 1000)
        
        # Clear the segments list
        segments.clear()

        # Reset the score
        score = 0

        # Reset the delay
        delay = 0.1

        pen.clear()
        pen.write("Score: {}  High Score: {}".format(score, high_score), align="center", font=("Courier", 24, "normal")) 


    # Check for a collision with the food
    if head.distance(food) < 20:
        # Move the food to a random spot
        x = random.randint(-290, 290)
        y = random.randint(-290, 290)
        food.goto(x,y)

        # Add a segment
        new_segment = turtle.Turtle()
        new_segment.speed(0)
        new_segment.shape("square")
        new_segment.color("grey")
        new_segment.penup()
        segments.append(new_segment)

        # Shorten the delay
        delay -= 0.001

        # Increase the score
        score += 10

        if score > high_score:
            high_score = score
        
        pen.clear()
        pen.write("Score: {}  High Score: {}".format(score, high_score), align="center", font=("Courier", 24, "normal")) 

    # Move the end segments first in reverse order
    for index in range(len(segments)-1, 0, -1):
        x = segments[index-1].xcor()
        y = segments[index-1].ycor()
        segments[index].goto(x, y)

    # Move segment 0 to where the head is
    if len(segments) > 0:
        x = head.xcor()
        y = head.ycor()
        segments[0].goto(x,y)

    move()    

    # Check for head collision with the body segments
    for segment in segments:
        if segment.distance(head) < 20:
            time.sleep(1)
            head.goto(0,0)
            head.direction = "stop"
        
            # Hide the segments
            for segment in segments:
                segment.goto(1000, 1000)
        
            # Clear the segments list
            segments.clear()

            # Reset the score
            score = 0

            # Reset the delay
            delay = 0.1
        
            # Update the score display
            pen.clear()
            pen.write("Score: {}  High Score: {}".format(score, high_score), align="center", font=("Courier", 24, "normal"))

    time.sleep(delay)

wn.mainloop()`

有人能帮我吗


Tags: thegoforiffoodsegmentheadscore
2条回答

问题是您正在此处等待按键:

wn.listen()
wn.onkeypress(go_up, "w")
wn.onkeypress(go_down, "s")
wn.onkeypress(go_left, "a")
wn.onkeypress(go_right, "d")

而您应该使用bot.wait_for()等待消息。您可以阅读官方文档以了解更多信息

你不能让它为他们打开。您只能为托管bot的人打开它,如果您想让它工作,您需要他们自己下载bot并运行它。您可以学习制作基于浏览器的游戏(需要了解HTML/CSS/js),并生成一个新链接,以便他们可以在自己的浏览器上玩

相关问题 更多 >