Доска для рисования с цветными блоками и цифрами в черепахе Python - PullRequest
0 голосов
/ 25 мая 2019

У меня есть list из list под названием ListOfValues. Я хочу нарисовать доску в соответствии с размером этого списка и раскрасить некоторые блоки черным цветом с белой заливкой, а другие - просто черным. Я попробовал и получил следующее:

2DBoard

И мой код:

import turtle

#sets screen characteristics
wn=turtle.Screen()
wn.bgcolor('lightblue')
wn.title('Chessboard')

#sets turtle characteristics
greg = turtle.Turtle()
greg.speed(0)

#draws and fills one square
def square(size,color):
    greg.color(color)
    greg.begin_fill()
    for i in range(4):
        greg.fd(size)
        greg.lt(90)

    greg.end_fill()
    greg.fd(size)    

#draws the whole chessboard  
def chessboard(size):
    greg.pu()
    greg.goto(-(size*4),(size*4))
    LR = len(listOfValues);
    for i in range(LR):
        for j in range(LR):
            if(SomeValue == 1 ):
                square(size,'white')
            else:
                square(size,'black')
        greg.rt(90)
        greg.lt(90)
        greg.goto(-(size*(4)),(size*(4 - i - 1)))
chessboard(50)

Мне не хватает двух вещей:

  • Мне нужно разместить строки в каждой строке и столбце, чтобы они выглядели как доска
  • Мне нужно поместить числовые значения из моего массива в середину каждого блока

Как мне этого добиться?

1 Ответ

1 голос
/ 26 мая 2019

Мне нужно разместить строки в каждой строке и столбце, чтобы они выглядели как доска

Это легко. Вместо установки цвета с помощью color(), который устанавливает цвета pen и fill , вместо этого используйте fillcolor(), который устанавливает только цвет fill , оставляя ручка цвет по умолчанию черный. Вам также нужно будет опустить перо во время рисования, но поднимать его после каждого ряда, пока оно возвращается к левому краю.

Мне нужно поместить значение из моего массива в середину блока

Этот вопрос сложнее, но в основном вам нужно определить listOfValues как list из list из int, где каждый int равен нулю или единице, или некоторым другим. Затем во вложенном цикле выполните SomeValue = listOfValues[i][j] перед проверкой его значения.

Если вы хотите написать число в блоке, я бы выделил отдельную маркер черепаху для записи чисел. И определите соответствующий шрифт.

Ниже я переделываю ваш код, где я реализую вышеупомянутое, а также пытаюсь правильно центрировать плату:

from turtle import Screen, Turtle

FONT_SIZE = 18
FONT = ('Arial', FONT_SIZE, 'normal')

listOfValues = [
    [0, 1, 1, 2, 1, 1, 0],
    [1, 2, 1, 1, 0, 1, 1],
    [1, 1, 0, 1, 1, 2, 1],
    [2, 1, 1, 0, 1, 1, 1],
    [1, 2, 1, 1, 0, 1, 2],
    [1, 1, 1, 1, 1, 1, 1],
    [1, 0, 1, 2, 1, 0, 1]
]

def square(size, color):

    ''' draw and fill one square '''

    greg.fillcolor(color)
    greg.pendown()
    greg.begin_fill()

    for _ in range(4):
        greg.forward(size)
        greg.left(90)

    greg.end_fill()

    greg.penup()
    greg.forward(size)

def chessboard(size):

    ''' draw the whole chessboard '''

    side = len(listOfValues)

    greg.penup()
    greg.goto(-size * side/2, size * side/2)

    for i in range(side):
        for j in range(side):
            someValue = listOfValues[i][j]
            text, color = ('black', 'white') if someValue == 1 else ('white', 'black')
            square(size, color)

            marker.goto(greg.xcor() - size/2, greg.ycor() + size/2 - FONT_SIZE/2)
            marker.pencolor(text)
            marker.write(someValue, align='center', font=FONT)

        greg.goto(-size * side/2, size * side/2 - size * (i + 1))

# set screen characteristics
screen = Screen()
screen.title('Chessboard')
screen.bgcolor('lightblue')

# set turtle characteristics
greg = Turtle()
greg.hideturtle()

# set marker characteristics
marker = Turtle()
marker.penup()
marker.hideturtle()

screen.tracer(False)  # because I have no patience
chessboard(50)
screen.tracer(True)

screen.mainloop()

enter image description here

...