이번 문제는 원형 연결리스트를 이용한 러시안룰렛을 구현하는 문제입니다.
"러시안룰렛"이라고 들어보셨나요?
러시안룰렛은 전식 연발 권총의 여러 개의 약실 중 하나에만 총알을 넣고 총알의 위치를 알 수 없도록 탄창을 돌린 후, 참가자들이 각자의 머리에 총을 겨누고 방아쇠를 당기는 게임입니다.(출처 위키백과)
리볼버형식의 권총을 사용하기때문에 원형으로 돌아가는것을 알게되고, 이 원형으로 돌아가는것을 원형 연결리스트와 연결해서 쓸 수 있습니다.
이번 문제에서 지켜야 할 규칙들입니다.
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학기 객체지향 프로그래밍 과제 문제입니다.
3-1 연결리스트를 통한 영단어 끝말잇기 (0) | 2021.12.20 |
---|---|
2-8 먹이사슬 동물레이싱 경주-(1) : 경로표시 (0) | 2021.08.11 |
2-8 먹이사슬 동물레이싱 경주-(0) : 초기작업 (0) | 2021.08.11 |
댓글 영역