-2

我使用海龟模块驾驶了一块 8x8 尺寸的板。它看起来像一个棋盘,但它不是,因为黑色块是随机分布的。

目的是我想做一个 A-Star 算法。算法部分完成。但是,我被困在图形界面部分。

我正在使用turtle-graphics模块,但据我所知,它使用笔来绘制形状,这是通过绘制线条来移动整个特定路径。我正在处理turtle模块的功能以了解它们是什么。

我的问题是:

  1. 我想将一个对象或图像放入一个特定的块中。事实上,我放入对象中的块将是白色的。

  2. 我还希望该对象像国际象棋游戏一样从一个街区移动到另一个街区。(但是,事实并非如此)。

  3. 一次移动后,是否可以用颜色填充前一个块?(其实是有可能的,我已经完成了这部分,但是有点费时。我的意思是,程序必须等待一段时间才能完成笔运动,以便用颜色填充那个块。)

    import turtle
    import image
    Tess=turtle.Turtle()
    Tess.pensize(1)
    Tess.speed(-100)
    w=40
    
    def mysquare(who,thecolor,size):
        who.pendown()
        who.pencolor('black')
        who.fillcolor(thecolor)
        who.begin_fill()
        who.setheading(0)
        for i in range(4):
            who.forward(size)
            who.left(90)
        who.end_fill()
    
    for j in range(8):
      for i in range(8):
    #      print(i,j)
          if i==5 and j==7 or i==5 and j==6 or i==3 and j==5 or i==7 and j==5 or i==2 and j==4 or i==4 and j==4 or i==5 and j==4 or i==6 and j==4:
              scolor='black'
          else:
              scolor='white'
          Tess.penup()
          Tess.goto((i-4)*w,(j-4)*w)
          mysquare(Tess,scolor,w)
    
4

1 回答 1

0

我相信以下展示了您描述的行为。它设置棋盘,将海龟移动到一个白色方块,然后将它随机移动到它尚未访问过的方块(避免黑色方块),直到它用完有效的移动:

from turtle import Turtle, Screen
from random import choice

WIDTH = 40
BOARD_SIZE = 8
COLOR_EMPTY, COLOR_BLOCKED, COLOR_VISITED, COLOR_FAILED = 'white', 'black', 'green', 'red'

blocked_squares = [(5, 7), (5, 6), (3, 5), (7, 5), (2, 4), (4, 4), (5, 4), (6, 4)]  # should generate randomly

def mysquare(turtle, i, j, color, size):
    turtle.penup()
    turtle.goto((i - BOARD_SIZE//2) * size, (j - BOARD_SIZE//2) * size)
    turtle.pendown()
    turtle.fillcolor(color)
    turtle.setheading(0)

    turtle.begin_fill()
    for _ in range(4):
        turtle.forward(size)
        turtle.left(90)
    turtle.end_fill()

def board_to_screen(position):
    y, x = position
    return ((x - BOARD_SIZE//2) * WIDTH + WIDTH / 2, (y - BOARD_SIZE//2) * WIDTH + WIDTH / 2)

def move():
    global position

    positions = []

    for j_delta in (-1, 0, 1):
        if 0 <= position[0] + j_delta < BOARD_SIZE:
            for i_delta in (-1, 0, 1):
                if 0 <= position[1] + i_delta < BOARD_SIZE:
                    if board[position[0] + j_delta][position[1] + i_delta]:
                        new_position = (position[0] + j_delta, position[1] + i_delta)
                        if new_position != position:
                            positions.append(new_position)
    j, i = position

    if positions:
        board[j][i] = False
        mysquare(tess, i, j, COLOR_VISITED, WIDTH)
        position = choice(positions)
        screen.ontimer(move, 1000)
    else:
        mysquare(tess, i, j, COLOR_FAILED, WIDTH)

    tess.penup()
    tess.goto(board_to_screen(position))
    screen.update()

tess = Turtle(shape='turtle')
tess.speed('fastest')

screen = Screen()
screen.tracer(0)

board = []

for j in range(BOARD_SIZE):
    board.append(list())
    for i in range(BOARD_SIZE):
        board[j].append(True)
        square_color = COLOR_EMPTY
        if (i, j) in blocked_squares:
            square_color = COLOR_BLOCKED
            board[j][-1] = False
        mysquare(tess, i, j, square_color, WIDTH)

screen.update()

position = (3, 3)
tess.penup()
tess.goto(board_to_screen(position))

screen.ontimer(move, 1000)

screen.exitonclick()

这可能最好使用多个海龟来避免一些移动,并且板上的海龟可以是 GIF 图像而不是内置的海龟形状。黑色方块可能应该是随机生成的(但要小心),乌龟板上的初始起始位置也应该如此。

在此处输入图像描述

于 2016-12-04T04:09:06.250 回答