TIL 0109 TextRPG (팀) / 양방향 연결리스트

강성원·2024년 1월 9일
0

TIL 오늘 배운 것

목록 보기
12/69

오늘부터는 TextRPG를 팀 단위로 진행하게 됐다.
진행을 위해서 의논도 하고 깃허브도 다같이 실험해보고 의견도 나누는 시간은 있었지만 지금 당장 쓸 것은 없어보인다..

그리고 아직도 컨디션이 많이 좋지 않아 예전에 공부한 연결리스트와 짧게 작성한 코드 하나만..올려보도록한다.


양방향 연결 리스트

예전에 C++로 작성해본 양방향 연결리스트가 있어서 가져와봤다.

하나의 노드

  • 양방향 연결리스트는 여러 연결된 노드들을 가지고 있다.
    하나의 노드에는 데이터, 앞, 뒤가 있고 앞에는 앞 노드 포인터, 뒤에는 뒷 노드 포인터가 있다.
template <typename T>
struct Node {
	T			data;
	Node<T>*	prev;
	Node<T>*	next;//본인을 가리킬 때에는 템플릿 매개변수 명시 필요X
	
    //첫 번째 생성자
	Node()
		:data(),
		prev(nullptr),
		next(nullptr)
	{}
    
	//두 번째 생성자
	Node(const T& rData, Node<T>* pPrev, Node<T>* pNext)
		:data(rData),
		prev(pPrev),
		next(pNext)
	{}

};

두 번째 생성자를 보면 데이터와 앞에 올 노드의 포인터, 뒤에 올 노드의 포인터를 전달 받는다.

노드들의 연결, 리스트

//리스트 헤더 & 리스트 길이
template <typename T>
class List {
private:
	Node<T>* head;
	Node<T>* tail;
	int		 count;

public:
	List();
	~List();

public:
	void pushback(const T& rData);
	void pushfront(const T& rData);
};

//List 기본 생성자
template <typename T>
List<T>::List()
:head(nullptr),
tail(nullptr),
count(0)
{

}
  • 하나의 리스트는 맨 앞 노드(head)와 맨 뒷 노드(tail)가 있다.
    그리고 총 개수를 세기 위한 count가 있다.

  • 앞과 뒤에 새로운 노드를 추가하는 pushback과 pushfront 멤버 함수가 있다.

  • 생성자에는 특이할 것 없이 노드의 초기화만 있다.

노드 추가

아래 함수는 리스트 뒤쪽에 노드를 넣는 함수이다.

//뒤에 데이터 삽입
template <typename T>
void List<T>::pushback(const T& rData) {// 1. 데이터 받음
	Node<T>* newNode = new Node<T>(rData, nullptr, nullptr); // 2. 새로운 노드 생성

	// 3.처음 입력이라면
	if (nullptr == this->head)
	{
		this->head = newNode;
		this->tail = newNode;
	}
	else //4. 처음 입력 아니라면
	{//1개 이상이라면 
		// @node 'n'은 생성해서 리스트에 넣을 노드
		//1. node n-1이 node n을 next로 가리킴 [node n-1] => [node n]
		//2. node n이 node n-1을 prev로 가리킴 [node n-1] <= [node n]
		//3. List의 tail이 node n을 가리킴
		tail->next = newNode;
		newNode->prev = tail;
		tail = newNode;
	}
	
	++count;
}
  1. 데이터를 매개변수로 받는다.(타입은 템플릿)
  2. 받은 매개변수로 새로운 노드를 만든다.
  3. 노드가 하나도 없었다면 리스트의 맨 앞 노드와 맨 뒷 노드는 새로운 노드가 된다.
  4. 노드가 존재했다면,
    새로운 노드는 원래 존재하던 맨 끝노드의 '뒷 노드'가 된다.
    새로운 노드의 '앞 노드'는 원래 존재하던 맨 끝 노드가 된다.
    맨 끝 노드의 자리에 새로운 노드가 들어간다.

조금 헷갈리지만 찬찬히 보면 쉬우며, 자리만 바꾸는 것을 볼 수 있다.

pushfront는 생략


이름 입력 받아 플레이어 생성

#region 캐릭터 생성
public void CharacterCreation()
{
    string name = string.Empty;
    string input = string.Empty;

    while(true)
    {
        Console.Clear();
        Console.WriteLine("===== 캐릭터 생성 =====");
        Console.WriteLine("이름을 입력하십시오.");

        name = Console.ReadLine();

        if (name == "")
        {
            Console.WriteLine("입력 값이 없습니다.");
            Console.ReadLine();
            continue;
        }

        Console.Clear();
        Console.WriteLine("===== 캐릭터 생성 =====");
        Console.WriteLine($"입력하신 이름은 {name} 입니다.");

        Console.WriteLine("1. 저장");
        Console.WriteLine("2. 취소");

        Console.Write("");
        input = Console.ReadLine();

        switch(input)
        {
            case "1":
                break;
            case "2":
                continue;
            default:
                continue;
        }

        Console.Clear();
        Console.WriteLine("===== 캐릭터 생성 =====");
        Console.WriteLine($"이름 : {name}");
        Console.ReadLine();
        Console.Clear();
        break;
    }
             
    player = new Player(1, name, PlayerClass.Worrior, 10, 5, 100, 100, 1500);
}
#endregion
  • 이름 입력 받고 그 문자열을 Player 생성자에 전달해준다.
profile
개발은삼순이발

0개의 댓글