6-е РЕДАКТИРОВАНИЕ: Вот два решения для вас:
- (как предлагает Брайан) либо запомните старое местоположение перемещенной фигуры, перерисуйте ее там (=> нарисуйте в цвете фона), перерисуйте в новом месте
- проще: очистить и перерисовать всю доску
5-е РЕДАКТИРОВАНИЕ: Хорошо, спасибо за удаление кода.
Объясните точно в чем проблема с вашим кодом для рисования на доске? 'Перемещенный фрагмент не удален из старого местоположения'? «Все фигуры нарисованы с неправильными координатами или цветами»? ...
Недопустимо просто сохранять дамп кода и говорить «Этот код не работает».
«Я не знаю, как перерисовать кусочки, не удаляя другие кусочки».
Я думаю, что это ваша проблема прямо здесь. Если вы объявляете и вызываете redrawBoard()
, он должен перерисовать ВСЕ фигуры (!), А не только перемещенную фигуру. Согласен? то есть вы должны выполнить итерацию по всей доске [] [] и вызывать drawPiece () для каждой фигуры. Но ваш код, кажется, уже делает это?
Позвольте мне предложить вам, как очистить существующий код рисования доски, и в этом процессе вы почти наверняка найдете свою ошибку.
Очевидно, вам нужно очищать и перерисовывать экран каждый раз, когда происходит какое-либо движение (или продвижение), вы на самом деле это делаете? Объявите FN redrawBoard()
для этого. Если вы не сделаете очистку, то после хода фигура будет отображаться в ее старых И новых местах, что, очевидно, будет неправильным?
(Комментарий о Частота кадров - это то, как часто холст будет обновляться каждую секунду. заставляет задуматься, когда вы перерисовываете, вам не нужно перерисовывать 10 раз в секунду, если у вас также нет часов или других изменяющихся данных Но, эй, это тоже работает.
Во-первых, настоятельно рекомендуем использовать перечисление для самостоятельного документирования значений , используемых в доске [] []
class Checkers():
EMPTY=0
RED_PIECE=1
RED_KING=2
BLACK_PIECE=3
BLACK_KING=4
Далее вы можете значительно убрать код рисования доски.
Так как все 4 случая рисования фрагментов вызывают общий случай, сделайте его fn и сделайте этот 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')
Разве это разложение не бесконечно легче читать и отлаживать? Это самодокументирование. Теперь ваша ошибка должна практически выпрыгнуть на вас.
(Кстати, в настоящее время вы рисуете королей точно так же, как фигуры, но я думаю, вы исправите это позже.)
4-е РЕДАКТИРОВАНИЕ: Вы заставляли нас смотреть не на те fns, грр ... вы говорите, что ваша ошибка на самом деле в коде рисования доски . Не могли бы вы исправить заголовок, который по-прежнему гласит «Реализация функции движения» ?
ОРИГИНАЛЬНЫЙ ОТВЕТ:
О том, что жаждет машина, это еще не вопрос - пока нет: расскажите, что вы сейчас пытаетесь и почему это не работает. Также удалите весь несвязанный код.
Похоже, у вас проблемы с функцией moveTo(i,j)
- но что именно?
(Глобал secondPass, secondPosition сигнализируют, что у вас могут быть проблемы ... знаете ли вы рекурсию? Если нет, то не беспокойтесь.)
Кроме того, в качестве стилистической вещи, и чтобы упростить вашу жизнь, эта реализация не ОО, глобалы кричат о плохой декомпозиции. Попробуйте переписать как класс Checkers
, сделать доску и т. Д. Членом, написать метод 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