Схема: Мутирующие элементы в массиве для шахмат

Я работал над простой шахматной программой на Схеме, и одна из определенных мной вспомогательных функций потребляет фигуру и ее координаты (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))
Другие вопросы по тегам