6장과 7장을 동시에 공략해보자.
6장의 경우에는 게임상의 맵을 지정하는 루틴이 나온다.
북/남/동/서/위층/아래층/기타 이런 식으로 배열로 해당하는 지도를 구성한다.
또한 7장에서는 초기화 루틴중에 보물과 몬스터를 배열하고, 마지막으로 각종 변수를 저장하는 부분이 나온다.
먼저 게임상의 맵을 구성해보자..
이제 7장에서 논의하는 4개의 보물과 4곳에 몬스터를 넣는 부분이다.
또한 추가로 두 개의 방안에 보물을 넣는다.
이제 다음으로 초기화 루틴 부분이다.
플레이어에 관한 정보에 대한 각종 변수를 초기화한다.
이제 다음장에서는 메인 이벤트 처리부분이 시작된다.

6장의 경우에는 게임상의 맵을 지정하는 루틴이 나온다.
북/남/동/서/위층/아래층/기타 이런 식으로 배열로 해당하는 지도를 구성한다.
또한 7장에서는 초기화 루틴중에 보물과 몬스터를 배열하고, 마지막으로 각종 변수를 저장하는 부분이 나온다.
먼저 게임상의 맵을 구성해보자..
(defvar *castle*
'((0 2 0 0 0 0 0)
(1 3 3 3 0 0 0)
(2 0 5 2 0 0 0)
(0 5 0 0 0 0 0)
(4 0 0 3 15 13 0)
(0 0 1 0 0 0 0)
(0 8 0 0 0 0 0)
(7 10 0 0 0 0 0)
(0 19 0 8 0 8 0)
(8 0 11 0 0 0 0)
(0 0 10 0 0 0 0)
(0 0 0 13 0 0 0)
(0 0 12 0 5 0 0)
(0 15 17 0 0 0 0)
(14 0 0 0 0 5 0)
(17 0 19 0 0 0 0)
(18 16 0 14 0 0 0)
(0 17 0 0 0 0 0)
(9 0 16 0 0 0 0)))
;;; 해당번호 방을 가져오는 함수
(defun get-room (room-num)
(nth (- room-num 1) *castle*))
;;; 방의 리스트에서 각 요소를 가져오는 함수
(defun get-rooms-element (room element)
(cond ((char= element #\n) (car room))
((char= element #\s) (nth 1 room))
((char= element #\e) (nth 2 room))
((char= element #\w) (nth 3 room))
((char= element #\u) (nth 4 room))
((char= element #\d) (nth 5 room))
((char= element #\m) (nth 6 room))
(t
nil)))
이제 7장에서 논의하는 4개의 보물과 4곳에 몬스터를 넣는 부분이다.
또한 추가로 두 개의 방안에 보물을 넣는다.
<br />;;; 모든 방의 mobs정보를 리셋<br />(defun reset-mobs ()<br /> (do ((i 1 (1+ i)))<br /> ((< (length *castle*) i))<br /> (setf (nth 6 (nth (- i 1) *castle*)) 0)))<br /><br />;;; 방 4개에 금을 넣기<br />(defun put-gold (how-much)<br /> (cond ((= how-much 0) nil)<br /> (t<br /> (let ((pos (random (length *castle*)))<br /> (gold (+ (random 100) 1)))<br /> (let ((gold-in-cell (get-rooms-element<br /> (get-room (+ pos 1))<br /> #\m)))<br /> (cond ((or<br /> (= pos 5)<br /> (= pos 10)<br /> (not (= 0 gold-in-cell))) <br /> (put-gold how-much))<br /> (t<br /> (progn <br /> (setf (nth 6 (nth (1+ pos) *castle*)) gold)<br /> (put-gold (1- how-much))))))))))<br /><br />;;; 방 4개에 monster 넣기<br />(defun put-mob (how-much)<br /> (cond ((= how-much 0) nil)<br /> (t<br /> (let ((pos (1- (random (length *castle*)))))<br /> (let ((gold-in-cell (get-rooms-element<br /> (get-room (+ pos 1))<br /> #\m)))<br /> (cond ((or<br /> (= pos 5)<br /> (= pos 10)<br /> (not (= 0 gold-in-cell))) (put-mob how-much))<br /> (t<br /> (progn <br /> (setf (nth 6 (nth (1+ pos) *castle*)) (- how-much))<br /> (put-mob (1- how-much))))))))))<br /><br /><br />;;; 4번방과 16번방에 추가적인 보물넣기<br />(defun set-init-treasure ()<br /> (setf (nth 6 (nth 3 *castle*)) (random 100))<br /> (setf (nth 6 (nth 15 *castle*)) (random 100)))<br />
이제 다음으로 초기화 루틴 부분이다.
플레이어에 관한 정보에 대한 각종 변수를 초기화한다.
<br />;;; 기본 변수들<br />(defvar *strength* nil)<br />(defvar *wealth* nil)<br />(defvar *food* nil)<br />(defvar *tally* nil)<br />(defvar *mk* nil)<br /><br />;; 게임상 사용 변수<br />(defvar *room* nil)<br />(defvar *sword* nil)<br />(defvar *amulet* nil)<br />(defvar *axe* nil)<br />(defvar *suit* nil)<br />(defvar *light* nil)<br />(defvar *char-name* nil)<br /><br />;;; 기본 변수 리셋<br />(defun init-var ()<br /> (setf *strength* 100)<br /> (setf *wealth* 75)<br /> (setf *food* 0)<br /> (setf *tally* 0)<br /> (setf *mk* 0))<br /><br />;;; 게임상 플레이어 stat 세팅하기<br />(defun get-player-name ()<br /> (let ((pname (read-line)))<br /> (setf *char-name* pname)<br /> (setf *room* 6)<br /> (setf *sword* 0)<br /> (setf *amulet* 0)<br /> (setf *axe* 0)<br /> (setf *suit* 0)<br /> (setf *light* 0)))<br />
이제 다음장에서는 메인 이벤트 처리부분이 시작된다.

댓글 없음:
댓글 쓰기