From f72400bf2216828d442d161bd48158508c4f4526 Mon Sep 17 00:00:00 2001 From: Loic Guegan Date: Wed, 8 May 2019 18:12:09 +0200 Subject: [PATCH] Add food management --- server/game.lisp | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/server/game.lisp b/server/game.lisp index 207b669..a43cd10 100644 --- a/server/game.lisp +++ b/server/game.lisp @@ -11,7 +11,12 @@ :accessor snake) (dir :initarg :initial-direction - :initform :right))) + :initform :right) + (grid-size + :initarg :grid-size + :initform (list 30 30)) + (food + :initform (make-array 0)))) ;;; Class constructor to initialize the snake (defmethod initialize-instance :after ((g game) &key) @@ -20,7 +25,7 @@ ;;; Pretty-print a game (defmethod print-object ((g game) stream) - (with-slots (snake dir) g + (with-slots (snake dir food) g (format t "Snake: ") (dotimes (i (first (array-dimensions snake))) (let ((elem (aref snake i))) @@ -28,7 +33,11 @@ (format t "<=")) (format t "(~a,~a)" (first elem) (second elem)))) (format t "~%Size: ~a" (first (array-dimensions snake))) - (format t "~%Direction: ~a" dir))) + (format t "~%Direction: ~a" dir) + (format t "~%Food: ~a" food))) + +(defgeneric add-food (g nb) + (:documentation "Add food on the game grid.")) (defgeneric refresh (g &key) (:documentation "Refresh the game g (move forward or change direction).")) @@ -86,3 +95,16 @@ ;; Check if we loose ) + +(defmethod add-food ((g game) nb) + (with-slots (snake grid-size food) g + (let ((snake-list (coerce snake 'list)) ; To be able to use the function member later + (food-list (coerce food 'list)) + (size-x (first grid-size)) + (size-y (second grid-size)) + (food-size (first (array-dimensions food)))) + (dotimes (i nb) + (let ((x (random size-x)) + (y (random size-y))) + (when (eq (member (list x y) snake-list) nil) ; Add if there is no conflict between snake and food position + (setf food (make-array (1+ food-size) :initial-contents `(,@food-list ,(list x y))))))))))