辐射4电路板代码:用于移动椭圆的电路板绘图代码

我正在为大学做一个 python 跳棋游戏。我已经绘制了棋盘,使用 tk,但我似乎无法实现棋子的移动功能。如果有人在我的代码中看到任何错误,或者可以提供帮助,我将不胜感激。这里是完整的源代码。提前感谢

我不知道如何在不删除其他部分的情况下重新绘制这些部分。我已经在网上查看了 move 函数,并尝试了简单的测试,但我无法在我的代码中使用它。

我知道递归,但是,我需要的基本功能工作,即实际移动屏幕上的一块,我实现任何更多的功能之前。

lst2 = []
#counter variable
i=0
#board variable is what stores the X/O/- values.
# It's a 2D list. We iterate over it, looking to see
# if there is a value that is X or O. If so, we draw
# text to the screen in the appropriate spot (based on
# i and j.
while i < len(board):
  j=0
  while j < len(board[i]):
    if board[i][j] == 2:
      lst2.append(canvas.create_oval((i+1)*width + width/2 + 15,
        (j+1)*height + height/2 +15,(i+1)*width + width/2 - 15,
        (j+1)*width + width/2 - 15, fill="Red",outline='Black'))
    elif board[i][j] == 4:
      lst2.append(canvas.create_oval((i+1)*width + width/2 + 15,
        (j+1)*height + height/2 +15,(i+1)*width + width/2 - 15,
        (j+1)*width + width/2 - 15, fill="Red",outline='Black'))
    elif board[i][j] == 1:
      lst2.append(canvas.create_oval((i+1)*width + width/2 + 15,
        (j+1)*height + height/2 +15,(i+1)*width + width/2 - 15,
        (j+1)*width + width/2 - 15, fill="Black",outline='Black'))
    elif board[i][j] == 3:
      lst2.append(canvas.create_oval((i+1)*width + width/2 + 15,
        (j+1)*height + height/2 +15,(i+1)*width + width/2 - 15,
        (j+1)*width + width/2 - 15, fill="Black",outline='Black'))
    j+=1
  i+=1
34

您可以使用coords和 / 或move方法在画布上移动项目,以将坐标从它们是什么更改为您想要的坐标。

是一个简单的示例,展示了如何在画布上创建和移动项目:

import tkinter as tk     # python 3
# import Tkinter as tk   # python 2
class Example(tk.Frame):
    """Ilrate how to drag items on a Tkinter canvas"""
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        # create a canvas
        self.canvas = tk.Canvas(width=400, height=400, background="bisque")
        self.canvas.pack(fill="both", expand=True)
        # this data is used to keep track of an
        # item being dragged
        self._drag_data = {"x": 0, "y": 0, "item": None}
        # create a couple of movable objects
        self.create_token(100, 100, "white")
        self.create_token(200, 100, "black")
        # add bindings for clicking, dragging and releasing over
        # any object with the "token" tag
        self.canvas.tag_bind("token", "<ButtonPress-1>", self.drag_start)
        self.canvas.tag_bind("token", "<ButtonRelease-1>", self.drag_stop)
        self.canvas.tag_bind("token", "<B1-Motion>", self.drag)
    def create_token(self, x, y, color):
        """Create a token at the given coordinate in the given color"""
        self.canvas.create_oval(
            x - 25,
            y - 25,
            x + 25,
            y + 25,
            outline=color,
            fill=color,
            tags=("token",),
        )
    def drag_start(self, event):
        """Begining drag of an object"""
        # record the item and its location
        self._drag_data["item"] = self.canvas.find_closest(event.x, event.y)[0]
        self._drag_data["x"] = event.x
        self._drag_data["y"] = event.y
    def drag_stop(self, event):
        """End drag of an object"""
        # reset the drag information
        self._drag_data["item"] = None
        self._drag_data["x"] = 0
        self._drag_data["y"] = 0
    def drag(self, event):
        """Handle dragging of an object"""
        # compute how much the mouse has moved
        delta_x = event.x - self._drag_data["x"]
        delta_y = event.y - self._drag_data["y"]
        # move the object the appropriate amount
        self.canvas.move(self._drag_data["item"], delta_x, delta_y)
        # record the new position
        self._drag_data["x"] = event.x
        self._drag_data["y"] = event.y
if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()
2

6TH 编辑:这里有两个解决方案:

(正如 Bryan 建议的那样)要么记住移动的片段的旧位置,在那里取消绘制(= & gt;以背景颜色绘制),在新位置重新绘制

更简单:清除和重绘整个董事会

第 5 次编辑:好的,谢谢你剥离代码。

准确地解释您的板画代码有什么问题?“移动的片段没有从旧位置删除”?“所有片段都以错误的坐标或颜色绘制”?...?仅保留转储代码并说“此代码不起作用”是不可接受的。

“我不知道如何在不删除其他片段的情况下重绘这些片段。”我认为这就是你的问题。如果您声明并调用redrawBoard(),它应该重绘所有片段(!),而不仅仅是移动的片段。同意?即您必须遍历所有板 [] [] 并在每个片段上调用 drawPiece()。但是您的代码似乎已经这样做

让我建议你如何清理你现有的板画代码,在这个过程中你也几乎肯定会发现你的 bug。显然你需要在每次有移动 (或促销) 时清除和重绘屏幕,你真的这样做吗?为此声明 fnredrawBoard()

首先,强烈建议您use an enum to self-document the values用于板 [] []

class Checkers():
    EMPTY=0
    RED_PIECE=1
    RED_KING=2
    BLACK_PIECE=3
    BLACK_KING=4

接下来,您可以大大清理板绘图代码。由于所有 4 个绘图案例都调用一个常见案例,因此将其设置为 fn,并使其整洁:

def drawPiece(i,j,fillColor,outlineColor):
    """Draw single piece on screen."""
    x = (i+1)*width + width/2
    y = (j+1)*height + height/2
    lst2.append(canvas.create_oval(x+15,y+15,x-15,y-15,fill=fillColor,outline=outlineColor))

现在,调用这些严格的板画代码只有两种情况:(2,4)或(1,3)假设你得到了枚举的权利:

顺便说一句,永远不要使用 while 循环,其中一个更清晰的 for 循环会做:

for i in range(len(board)):
    for j in range(len(board[i])):
        if board[i][j] in (RED_PIECE,RED_KING):
            drawPiece(i,j,'Red','Black')
        elif board[i][j] in (BLACK_PIECE,BLACK_KING):
            drawPiece(i,j,'Black','Black')

这种分解不是无限容易阅读和调试吗?它是自我记录的。现在你的 bug 应该会跳出来。

(顺便说一句,你目前正在绘制国王完全相同的作品,但我想你会解决这个问题。)

第 4 次编辑:您让我们看错了 fns,grr...您说您的错误实际上是在板绘图代码中。请更正标题,该标题仍为“实现移动功能”

original reply:什么机器 yearning 说,这不是一个问题-还不是:告诉我们你目前正在尝试什么,以及为什么它不起作用。另外,删除所有不相关的代码。

看起来你有困难的功能moveTo(i,j)-但究竟是什么?(全局变量 secondPass,secondPosition 信号你可能有麻烦...你知道递归吗?如果没有,不用担心。)

另外,作为一个风格的东西,为了让你的生活变得轻松,这个实现不是 OO,全局尖叫坏分解。尝试重写为类Checkers,使 board 等成为成员,写一个init()方法。我会将函数grid(x,y)重命名为initialize(nrows,ncols)

(咳嗽,咳嗽!迹象表明您是从其他人那里改编的...)

#Frame rate is how often canvas will be updated
# each second. For Tic Tac Toe, 10 should be plenty.
FRAME_RATE = 10

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(733)
程序是如何执行的:OpenGL管道是如何具体执行的
下一篇

相关推荐

  • windows配置服务器:如何在Windows上配置服务器

    使用Windows Server系统,安装服务器软件,如IIS、SQL Server等。设置服务器的IP地址、子网掩码和默认网关,以及DNS服务器地址。…

    2023-06-28 16:11:44
    0 91 58
  • spring boot 实例:如何使用Spring Boot快速构建应用程序

    Spring Boot实例是一个基于Spring框架的快速应用程序开发工具,它可以让开发者快速创建高效的Spring应用程序。Spring Boot提供了一个简单的方法来创建和部署Spring应用程序,可以帮助开发者减少开发时间并且使得应用程序更加可靠。下面是一个简单的Spring Boot实例,它将创建一个RESTful Web服务,这个服务将接受HTTP请求并返回一个字符串:…

    2023-07-26 14:36:57
    0 35 75
  • springer数据库 A Review of the Literature

    Springer 数据库是一个全球性的学术出版物数据库,收录了超过2,500种来自几十个国家的期刊、书籍和科技报告。它提供了一个可以跨学科检索文献的平台,可以帮助研究人员更快地找到有用的信息。…

    2023-06-18 07:06:23
    0 37 91
  • java常用框架有哪些从Spring到Hibernate的完整指南

    示例示例Java常用框架有:Spring:Spring是一个开源的轻量级框架,它主要解决的是企业应用开发的复杂性。它提供了基于POJO的轻量级和最先进的企业级应用程序开发框架。…

    2023-07-24 14:16:35
    0 27 39
  • spring cloud中文文档实现微服务架构的分布式系统架构

    spring cloud中文文档是一份完整的文档,包含了spring cloud的基本概念、特性、组件、使用指南等内容。它为开发者提供了全面的spring cloud技术支持,以帮助开发者更好地理解spring cloud的技术细节,并能够更好地使用spring cloud来构建分布式系统。…

    2023-07-25 07:56:15
    0 46 80
  • spring cloud实战构建可伸缩的微服务架构

    Spring Cloud实战是一种基于Spring Boot的微服务架构,它使用Spring Cloud技术栈(Eureka、Feign、Ribbon、Zuul、Hystrix等)来构建分布式系统。它提供了一个可以快速构建分布式系统的框架,可以让开发者更加轻松地开发,管理和部署分布式应用。…

    2023-04-05 05:56:02
    0 67 13
  • javaspringboot框架:如何使用Java Spring Boot框架构建高效的Web应用程序

    Java Spring Boot 框架是一个开源的 Java 框架,它使用标准的 Java 技术来提供快速、轻松的应用程序开发。它提供了一种非常简单的方式来创建基于 Java 的 Web 应用程序,并且还提供了一些额外的功能,以支持各种类型的应用程序开发。…

    2023-03-21 06:39:48
    0 76 25
  • win10自动弹出网页解决方法:如何关闭Windows 10自动弹出网页

    解决方法:使用任务管理器禁止弹出网页的进程:…

    2023-01-29 12:43:55
    0 23 86

发表评论

登录 后才能评论

评论列表(56条)