상세 컨텐츠

본문 제목

3-5 원형 연결리스트(circular linked list)를 이용한 러시안룰렛

과제/객체지향프로그래밍(C++)

by 근성 2021. 12. 21. 11:23

본문

이번 문제는 원형 연결리스트를 이용한 러시안룰렛을 구현하는 문제입니다.

 

"러시안룰렛"이라고 들어보셨나요?

러시안룰렛은 전식 연발 권총의 여러 개의 약실 중 하나에만 총알을 넣고 총알의 위치를 알 수 없도록 탄창을 돌린 후, 참가자들이 각자의 머리에 총을 겨누고 방아쇠를 당기는 게임입니다.(출처 위키백과)

리볼버 권총

리볼버형식의 권총을 사용하기때문에 원형으로 돌아가는것을 알게되고, 이 원형으로 돌아가는것을 원형 연결리스트와 연결해서 쓸 수 있습니다.

 

이번 문제에서 지켜야 할 규칙들입니다.

1. 원형 연결리스트의 리볼버를 만들어야합니다.

2. 총알을 리볼버에 넣고 회전해야합니다.

3. “shoot” / “rotate” 명령어로 쏘거나 회전할 수 있습니다.

4. “shoot” 명령어를 입력받았는데, 총알이 있는경우 "You died"가 뜨고 게임을 다시 시작합니다. 

5. 총알이 존재 하지않는다면 “You Survived!”가 3번 반복됩니다.

 

조건은 아래와 같습니다.

✓ 리볼버는 6개의 노드로 구성되어있고, class 생성자로부터 만들어집니다.

✓ “shoot” 명령어는 head를 확인 후, 다음 노드를 가르킵니다.

✓ “rotate” 명령어는 노드를 몇칸 옮길지 랜덤으로 정해진 후, 회전을 시킵니다.

✓ “rotate” 후에는 ‘system(“cls”)’ 로 화면을 깨끗하게 합니다.

 

노드를 만든후, 난수(어디에 총알이 담겨있는지)를 생성하고, 게임을 시작하면 됩니다.

#include<iostream> 
#include <time.h> 

using namespace std;

typedef struct _Node {
    int bullet;
    struct _Node* next;
}Node;

void MakeNode(Node** head, int bullet);
void Game();
void MakeRoulette(Node** head, int n);
void ClearRoulette(Node** head);

int main()
{
    int key=0;
    srand((unsigned)time(0));//랜덤 
    while (key!=1)
    {
        Game();//게임 시작
    }
    return 0;
}

void Game()
{
    int end = 0;
    int next=0;
    string choice;
    Node* head;
    MakeRoulette(&head, 6);//6명치의 노드 생성 
    cout << "Command list(shoot/rotate)" << endl;
    while (end!=1)
    {
        cout << "CMD >>";
        cin >> choice;
        if (choice == "shoot")//shoot입력시
        {
            if (head->bullet)//총알
            {
                printf("You Died...\n");
                ClearRoulette(&head);//러시안 룰렛 지우기
                exit(0);
            }
            else//없다면 
            {
                cout << "You Survived!" << endl;
                head = head->next;//다음으로 이동 
            }
        }
        else if (choice == "rotate")//rotate 입력시
        {
            srand((unsigned int)time(NULL));
            next = rand() + 0;
            next %= 6;
            for (int a = 0; a < next; a++)
            {
                head = head->next;//다음으로 이동
            }
            system("cls");//rotate를 입력받으면 cmd창을 전부 지우고 시작
        }
        else
            cout << "Wrong Command!" << endl;
    }
}
void MakeNode(Node** head, int bullet)
{
    Node* now = new Node;
    now->bullet = bullet;
    if ((*head) == NULL)
    {
        (*head) = now;
        now->next = now;
    }
    else
    {
        now->next = (*head)->next;
        (*head)->next = now;
    }
}
void MakeRoulette(Node** head, int n)
{
    int value = rand() % n + 1; //랜덤값 발생
    (*head) = NULL; 
    while (n > 0)
    {
        if (value == n)//check와 n이 같으면 
        {
            MakeNode(head, 1);//총알 장전
        }
        else//아니면 
        {
            MakeNode(head, 0);//총알없는 약실 
        }
        n--;
    }
}
void ClearRoulette(Node** head)
{
    Node* seek = (*head)->next;
    Node* prev = (*head);
    while (seek != (*head))
    {
        prev = seek;
        seek = seek->next;
        delete[]prev;
    }
    delete[] * head;
}

결과화면

주어진 문제는 원형 연결리스트를 사용해야합니다. 원형 연결리스트를 이용하기 위해 6명인원의 노드를 발생시키고, 그 6명의 노드중 하나를 time.h를 이용해서 매시도 마다 다른 난수를 생성해서 6발짜리인 약실에 랜덤으로 한곳에 탄알을 넣습니다. 그리고 shoot을 입력받고 그 난수에 해당하면 죽게 되고, 그 난수가 아닌경우에는 살게 됩니다. shoot과 rotate외에 다른 문자는 못받게 설정했고, rotate를 받을경우에는 unsigned int의 범위없이 아무난수를 출력하고 %6을 해서 나머지 만큼 총알을 rotate를 시켰습니다. 그리고 rotate를 받을경우에는 system(”cls”)를 사용하여 새창에 출력하게 했습니다. 원형 연결리스트를 사용한 재밌는 게임을 만드는 문제였습니다.

 

#이 문제의 출처는 kw대학교 컴퓨터 정보공학부 2021년 1학기 객체지향 프로그래밍 과제 문제입니다.

관련글 더보기

댓글 영역