История изменений
Исправление grouzen, (текущая версия) :
Как то так это было сделано в моем 3d тетрисе на CL:
(defparameter *figures*
(list
(make-array '(2 3) :initial-contents '((1 1 1) (1 0 0)))
(make-array '(2 3) :initial-contents '((1 1 1) (0 0 1)))
(make-array '(2 3) :initial-contents '((1 1 0) (0 1 1)))
(make-array '(2 3) :initial-contents '((0 1 1) (1 1 0)))
(make-array '(2 2) :initial-contents '((1 1) (1 1)))
(make-array '(1 4) :initial-contents '((1 1 1 1)))
(make-array '(2 3) :initial-contents '((1 1 1) (0 1 0)))))
(defgeneric rotate-figure (figure)
(:method ((figure figure))
(with-slots (body) figure
(let ((prev-body body))
(setf body (make-array (list (array-dimension prev-body 1)
(array-dimension prev-body 0))))
(do ((prev-w 0 (1+ prev-w))
(h (1- (array-dimension body 0)) (1- h)))
((< h 0))
(do ((prev-h 0 (1+ prev-h))
(w 0 (1+ w)))
((> prev-h (1- (array-dimension prev-body 0))))
(setf (aref body h w) (aref prev-body prev-h prev-w))))))))
Суть в том, что фигуры не то чтобы вращаются, у них есть всего два положения: горизонтальное и вертикальное. Например:
XXO горизонтальное
OXX
0X вертикальное
XX
X0
Выходит так, что фигуры отрисовываются всегда от верхнего левого края.
Исправление grouzen, :
Как то так это было сделано в моем 3d тетрисе на CL:
(defparameter *figures*
(list
(make-array '(2 3) :initial-contents '((1 1 1) (1 0 0)))
(make-array '(2 3) :initial-contents '((1 1 1) (0 0 1)))
(make-array '(2 3) :initial-contents '((1 1 0) (0 1 1)))
(make-array '(2 3) :initial-contents '((0 1 1) (1 1 0)))
(make-array '(2 2) :initial-contents '((1 1) (1 1)))
(make-array '(1 4) :initial-contents '((1 1 1 1)))
(make-array '(2 3) :initial-contents '((1 1 1) (0 1 0)))))
(defgeneric rotate-figure (figure)
(:method ((figure figure))
(with-slots (body) figure
(let ((prev-body body))
(setf body (make-array (list (array-dimension prev-body 1)
(array-dimension prev-body 0))))
(do ((prev-w 0 (1+ prev-w))
(h (1- (array-dimension body 0)) (1- h)))
((< h 0))
(do ((prev-h 0 (1+ prev-h))
(w 0 (1+ w)))
((> prev-h (1- (array-dimension prev-body 0))))
(setf (aref body h w) (aref prev-body prev-h prev-w))))))))
Суть в том, что фигуры не то чтобы вращаются, у них есть всего два положения: горизонтальное и вертикальное. Например:
XXOO горизонтальное
OXXO
0X вертикальное
XX
X0
Выходит так, что фигуры отрисовываются всегда от верхнего левого края.
Исходная версия grouzen, :
Как то так это было сделано в моем 3d тетрисе на CL:
(defparameter *figures*
(list
(make-array '(2 3) :initial-contents '((1 1 1) (1 0 0)))
(make-array '(2 3) :initial-contents '((1 1 1) (0 0 1)))
(make-array '(2 3) :initial-contents '((1 1 0) (0 1 1)))
(make-array '(2 3) :initial-contents '((0 1 1) (1 1 0)))
(make-array '(2 2) :initial-contents '((1 1) (1 1)))
(make-array '(1 4) :initial-contents '((1 1 1 1)))
(make-array '(2 3) :initial-contents '((1 1 1) (0 1 0)))))
(defgeneric rotate-figure (figure)
(:method ((figure figure))
(with-slots (body) figure
(let ((prev-body body))
(setf body (make-array (list (array-dimension prev-body 1)
(array-dimension prev-body 0))))
(do ((prev-w 0 (1+ prev-w))
(h (1- (array-dimension body 0)) (1- h)))
((< h 0))
(do ((prev-h 0 (1+ prev-h))
(w 0 (1+ w)))
((> prev-h (1- (array-dimension prev-body 0))))
(setf (aref body h w) (aref prev-body prev-h prev-w))))))))