Python通过鼠标点击找到最近的乌龟

2024-01-06

我正在使用基于海龟的网格设置创建扫雷风格的游戏。我需要找到网格内最近的单元格并显示位于其下方的图标,无论是炸弹还是数字图标。我不想做到精确,我只需要单击鼠标即可找到网格中最近的单元格,即使单击不是直接在板上。目前,我的代码仅显示板上创建的最后一只海龟的图标,然后通过进一步的单击不执行任何其他操作。

我该怎么做才能让它识别真正最接近的点击并多次执行直到找到最后一个炸弹?

import random
import turtle
import cell

class Game:

def __init__(self, size):

    registershapes()
    self.__boardsize = size
    self.__boardlist = []
    self.__bombnum = 0
    self.__probe = 0
    self.__probelist = []
    offset = (size-1) * 17
    for x in range(size):
        for y in range(size):
            t = cell.Cell(x,y)
            t.up()
            t.shape('question.gif')
            t.goto(y*34-offset, offset-x*34)
            self.__boardlist.append(t)
def hideMines(self, num):
    if num > self.__boardsize ** 2:
        return False
    self.__bombnum = num
    self.__rnums = []
    i = 0
    while i < self.__bombnum:
        currentnum = random.randrange(0, (self.__boardsize**2) - 1)
        if currentnum not in self.__rnums:
            self.__rnums.append(currentnum)
            i += 1
    return True

def probe(self, x, y):
    for t in self.__boardlist:
        pos = t.position()
        distx = abs(x - pos[0])
        disty = abs(y - pos[1])
        distfinal = (distx ** 2 + disty ** 2) ** 0.5
        curdist = 0
        if curdist < distfinal:
            curdist = distfinal
            closest = t
    if closest in self.__probelist:
        return (self.__probe, self.__bombnum)
    elif closest in self.__rnums:
        closest.shape("bomb.gif")
        self.__bombnum -= 1
        self.__probe += 1
        self.__probelist.append(closest)
        return (self.__probe, self.__bombnum)

    else:
        closest.shape("0.gif")
        self.__probe += 1
        self.__probelist.append(closest)
        return (self.__probe, self.__bombnum)


def registershapes():
    wn = turtle.Screen()
    wn.register_shape('0.gif')
    wn.register_shape('1.gif')
    wn.register_shape('2.gif')
    wn.register_shape('3.gif')
    wn.register_shape('4.gif')
    wn.register_shape('5.gif')
    wn.register_shape('6.gif')
    wn.register_shape('7.gif')
    wn.register_shape('8.gif')
    wn.register_shape('9.gif')
    wn.register_shape('bomb.gif')
    wn.register_shape('question.gif')

我相信您正在以错误的方式处理这个问题。您正在激活screen.onclick()并试图将其映射到乌龟上。相反,激活turtle.onclick()在单个海龟上,选择海龟时将其停用。那么你就不必去搜索有问题的海龟,也不必主动忽略已经被选中的海龟。

下面是我将您的代码从这个问题和您之前的问题修改为您可以运行的示例。我不得不猜测 Cell 类的定义:

from turtle import Turtle, Screen
import random

class Cell(Turtle):

    def __init__(self, number):
        super().__init__("question.gif")
        self.__number = number
        self.penup()

    def number(self):
        return self.__number

class Game:

    def __init__(self, size):
        registershapes()
        self.__boardsize = size
        self.__boardlist = []
        self.__bombnum = 0
        self.__probe = 0
        self.__rnums = None

        offset = (size - 1) * 17

        for y in range(size):
            for x in range(size):
                t = Cell(x + y * size)
                t.goto(x * 34 - offset, offset - y * 34)
                t.onclick(lambda x, y, self=t: closure(self))
                self.__boardlist.append(t)

    def hideMines(self, num):
        if num > self.__boardsize ** 2:
            return False

        self.__bombnum = num
        self.__rnums = []
        i = 0

        while i < self.__bombnum:
            currentnum = random.randrange(0, self.__boardsize ** 2 - 1)

            if currentnum not in self.__rnums:
                self.__rnums.append(currentnum)
                i += 1
        return True

    def probe(self, closest):
        closest.onclick(None)

        if closest.number() in self.__rnums:
            closest.shape("bomb.gif")
            self.__bombnum -= 1
        else:
            closest.shape("0.gif")

        self.__probe += 1
        return (self.__probe, self.__bombnum)

def registershapes():
    screen.register_shape('0.gif')
    # ...
    screen.register_shape('bomb.gif')
    screen.register_shape('question.gif')

def closure(closest):
    _, rem = mine.probe(closest)

    if rem == 0:

        over = screen.textinput("Text Input", "Would you like to play again? (Y)es or (N)o")

        if over.upper() == 'Y':
            main()
        else:
            screen.bye()

def main():
    global mine

    board = screen.numinput("Numeric Input", "Enter desired board size: ")
    mine = Game(int(board))

    nummine = screen.numinput("Numeric Input", "Enter desired number of mines: ")
    mine.hideMines(int(nummine))

screen = Screen()

mine = None
main()

screen.mainloop()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python通过鼠标点击找到最近的乌龟 的相关文章

随机推荐

  • 如何使用上一个命令的参数?

    I know that Esc gives you the last argument of the last command 但我对最后一个命令的第一个参数感兴趣 有按键绑定可以做到这一点吗 在同一行中 是否有一种通用方法可以从最后一个命
  • 命名空间“AuntieDot”中不存在类型或命名空间名称“Core”

    我有 4 个 PCL 它们都针对相同的框架 点阿姨 阿姨Dot 身份验证 阿姨点 核心 阿姨点模型 但由于某种原因 在 AuntieDot Authentication 命名空间中使用 AuntieDot Core Helpers 尽管 A
  • 如何从页面左右滑动模态窗口

    我希望隐藏两个模式窗口 并将它们切换为从左侧滑入 另一个从右侧滑入 然而 在我创建的小提琴中 左侧和右侧模态窗口与页面的左侧和右侧正确对齐 左侧模态从右侧滑入 而不是从左边距 滑出 在这里小提琴 https jsfiddle net Big
  • 如何在python中获取sqlsoup中模式的列名?

    如何使用Python中的SQLSOUP从模式 表中获取字典中的列名和类型 使用MySQLDB 我可以创建游标并使用cursor description sqlsoup 有类似的东西吗 根据文档 https sqlalchemy readth
  • 您可以更改 GitLab 管道中的代码吗?

    GitLab CI CD 管道是否可以提交代码更改 我想运行一个使用的阶段black https github com psf black每当我推动工作时自动格式化我的代码 gitlab ci yml image python 3 6 st
  • 有没有办法自动避免进入 Visual Studio 中的某些函数?

    我知道 仅启用我的代码 调试选项 但这仅适用于托管代码 我正在寻找一种无需单步执行函数调用的方法 例如 STL 字符串转换运算符 因为函数参数之一中存在从 char 到字符串的隐式转换 我找到了这个博客条目 http blogs msdn
  • 远程服务器上的 Django 教程:如何在我的浏览器中查看?

    我正在开始学习 Django 教程 但遇到了障碍 在我常用的域上创建了示例 mysite 后 我希望能够在我的浏览器中显示它 该教程向我指出http 127 0 0 1 8000 http 127 0 0 1 8000 但是 这是行不通的
  • 如何将 Shell 变量值访问到 Groovy 管道脚本中

    现在我是 Shell Jenkins Groovy pipeline 的新手 我的要求是我正在将文件文本读取到 shell 脚本下的变量中 并且我需要将该变量值从 shell 脚本中传递出来并在 Groovy 脚本中使用 这是我的代码 st
  • 如何在android中创建可变数量的textview

    希望这不是一个坏问题 但是我已经通过 S O 进行了搜索 并且一直没能找到答案 我正在创建一个 Android 应用程序 它本质上是一个闹钟 我希望主要活动显示已创建的所有警报以及有关警报的一些信息 我的问题是如何根据已创建的警报数量创建给
  • TortoiseSVN合并分支到主干

    我知道这个问题已经被问过好几次了 所以我很抱歉再次问这个问题 但我只是想确保我理解不同合并之间的区别 我是这个项目的唯一开发人员 所以我不担心重写其他人的工作 我创建了这个项目的一个分支 因为我即将添加一些新功能 并且如果我需要修复当前代码
  • 用毫秒获取文件的最后修改日期?

    我正在尝试从文件夹中获取某些文件的日期和时间 上次修改 我设法获取日期和小时 分钟 秒 但无法获取毫秒 我已经尝试以所有可能的方式格式化该列 我只得到0毫秒 到目前为止我的代码是 用户选择一个文件夹 该代码在 A 列中显示找到的所有文件名
  • Socket.IO - 无法在 Google Chrome 中加载 XMLHttpRequest

    我试图从在 Chrome 19 0 1048 46 中工作的 socket io 主页获取第一个示例 但出现错误 XMLHttpRequest 无法加载 http localhost 8080 socket io 1 t 133715619
  • 函数 driver.switchTo.frame() 在 Selenium 中不起作用

    当我尝试在 Python 中使用 Selenium 中的 Webdriver 切换到网页上的框架时 它向我显示错误 请在下面找到我的代码 driver switchTo frame frame AttributeError WebDrive
  • Android 原生代码分析

    我正在尝试分析本机 Android 代码 但我得到了 出现以下错误 我正在 Linux 机器上运行代码 tracedmdump 配置文件后处理 痕迹 静态基本块 64525 动态 基本块 87073132 静态指令 412004 动态 说明
  • Windows 批处理,仅选择用户变量

    在环境变量中 我有一个用于用户变量和系统变量的 PATH 变量 在批处理脚本中 为了向用户 PATH 变量附加新的给定路径 我需要选择当前值 不幸的是 PATH 返回用户变量和系统变量的组合 当然 我只想向用户变量添加新的自定义路径值 也没
  • Codeigniter 3.0.0 - 错误 404 页面未找到

    这是我的第一个 php 框架 我的控制器中有一个 php 文件 即 posts php 但是当我尝试运行它 localhost codeigniter index php posts 时 它显示错误 404 应用程序文件夹内的 htacce
  • Azure DevOps 拉取请求线条颜色

    I created a PR and some of lines are marked with red or green colors in newly created file Cannot find what does it mean
  • 如何重新加载 JSF 使用的 ResourceBundles?

    我想通过单击按钮以编程方式重新加载 JSF 使用的 ResourceBundles 类路径中的 ResourceBundles 即 WEB INF classes 由外部应用程序修改 并且我知道修改事件 Try ResourceBundle
  • PHP中的矩阵乘法

    尽管矩阵的顺序应该没问题 但以下代码会抛出异常 这可能是一件我无法注意到的小事 但无法弄清楚
  • Python通过鼠标点击找到最近的乌龟

    我正在使用基于海龟的网格设置创建扫雷风格的游戏 我需要找到网格内最近的单元格并显示位于其下方的图标 无论是炸弹还是数字图标 我不想做到精确 我只需要单击鼠标即可找到网格中最近的单元格 即使单击不是直接在板上 目前 我的代码仅显示板上创建的最