LINUX.ORG.RU

История изменений

Исправление 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))))))))