Схема: Мутирующие элементы в массиве для шахмат
Я работал над простой шахматной программой на Схеме, и одна из определенных мной вспомогательных функций потребляет фигуру и ее координаты (current-location) и помещает ее в указанные координаты (move-here) на шахматной доске, отключение любой части, которая может быть расположена в координатах перемещения. Функция работала, как я и надеялся, но теперь по какой-то причине она больше не работает должным образом. Я понятия не имею, что может быть причиной этого, и некоторое время пытался найти и пересмотреть код, пытаясь найти ошибку. Я надеюсь, что кто-то сможет пролить свет на ситуацию.
Вот код для функции частичного переключения, а также структуры, используемые в коде:
(define-struct place (row column piece))
;; Place is a structure (make-place r c p) where r is the rank of a piece
;; which is a symbol of 'Pawn, 'Rook, 'Knight, 'Bishop, 'King or 'Queen
;; and column and place. Together c and p give the placement coordinates,
;; where column is one symbol from '(a b c d e f g h) and row is a number from
;; 1 - 8 inclusive.
(define-struct piece (rank color))
;; Piece is a structure (make-piece r col) where rank is as described for a place structure,
;; and colour is a symbo either 'black or 'white.
(define move-counter 1) ; Keeps track of the current number of mves made.
;; Odd indicates white to move, else black to move.
;; Swap-in: '(Symbol Symbol Nat) '(Symbol Nat) -> '(-2- void)
;; Conditions:
;; Pre: Swap-in is '(rank column row) From is '(column row)
;; Post: produces list of lists containing -2- and void. where void represents
;; any changed values.
;; Purpose: Swap-piece is a helper for any X-Move function that dictates the legal
;; moves of a given piece.
(define (swap-piece swap-in from)
(map (λ (x)
(map (λ (piece)
(cond
[(and (= (third swap-in) (place-row piece))
(symbol=? (second swap-in) (place-column piece)))
(set-place-piece! piece
(make-piece (first swap-in) (cond
[(odd? move-counter) 'white]
[else 'black])))]
[(and (= (second from) (place-row piece))
(symbol=? (first from) (place-column piece)))
(set-place-piece! piece (make-piece empty empty))]
[else void]))
x))
board))
Вот два примера; первый из которых - то, что он выводит, а второй - то, что он должен выводить (в примере, есть небольшая модификация Swap-части, так что один из его параметров - плата, чтобы не использовать весь массив, который у меня есть для моей шахматной доски).
(define Example-board (list
(list
(make-place 8 'a (make-piece 'Rook 'black))
(make-place 7 'a (make-piece 'Pawn 'black)))
(list
(make-place 4 'a (make-piece 'Queen 'white))
(make-place 6 'b (make-piece 'King 'White)))))
> (swap-piece '(Queen a 4) '(a 7) Example-board)
(shared ((-2- void)) (list (list -2- (void)) (list (void) -2-)))
Поэтому я звоню в Примерную доску, чтобы получить обновленную доску:
> Example-board
(list
(list
(make-place 8 'a (make-piece 'Rook 'black))
(make-place 7 'a (make-piece empty empty)))
(list
(make-place 4 'a (make-piece 'Queen 'white))
(make-place 6 'b (make-piece 'King 'White))))
Тем не менее, я ожидаю вывод:
> Example-board
(list
(list
(make-place 8 'a (make-piece 'Rook 'black))
(make-place 7 'a (make-piece 'Queen 'white)))
(list
(make-place 4 'a (make-piece empty empty))
(make-place 6 'b (make-piece 'King 'White))))
Извините, за длинный пост, однако я просто не могу понять, что является причиной этого. Как я уже сказал, я уверен, что этот код работал всего несколько часов назад.
РЕДАКТИРОВАТЬ: Я должен добавить, что список, доска, на которой действует функция карты в моей функции Swap-piece, является шахматной доской.
1 ответ
Я понял, что стало причиной неправильного размещения / замены кусочка. У меня была часть подкачки задом наперед, почти наверняка, потому что я неправильно обозначил свои параметры. Мой код в основном сказал: "Если координаты квадрата, на который я смотрю, равны координатам фигуры, которую я помещаю, не меняйте квадрат", что, очевидно, лишает цели перемещения фигуры. Для тех, кто заинтересован, правильный код:
(define (swap-piece swap-in from)
(map (λ (x)
(map (λ (piece)
(cond
; comparing coordinates of current square to swap-in
[(and (= (third swap-in) (place-row piece))
(symbol=? (second swap-in) (place-column piece)))
; If they are equal place, remove swap-in from that square
(set-place-piece! piece (make-piece empty empty))]
; If the coordinates of the square equal the coordinates of From
; place the swap-in piece there
[(and (= (second from) (place-row piece))
(symbol=? (first from) (place-column piece)))
(set-place-piece! piece
(make-piece (first swap-in) (cond
[(odd? move-counter) 'white]
[else 'black])))]
[else void]))
x))
board))