1차과제 마지막문제는 뱀게임을 만드는 문제입니다.
뱀게임은 뱀이 지나가다가 벽이나 자기가 지나온 경로를 부딪힐경우에는 죽는 게임입니다.
문제 요구사항은
1. 사용자에게 명령을 입력받아 행렬을 'a'로 채웁니다. 갈곳이 'a'밖에 없거나 벽쪽으로 갈경우에는 END를 출력합니다.
2. 명령을 받을때마다 새로운창에서 시행하게 해야합니다.
여기서 의아했던 점은 보통의 뱀게임은 지나가다가 벽이나 자기가 지나온경로를 부딪혀서 죽는게 맞지만, 문제 요구사항은 부딪히기전에 갈곳이 없는 경우를 생각해야만 했습니다.
#include<iostream>
#define MazeSize 7//미로크기 선언
using namespace std;
int main()
{
char command;
char maze[MazeSize][MazeSize];
bool finish = false;
for (int i = 1; i < MazeSize - 1; i++)
{
for (int j = 1; j < MazeSize - 1; j++)
{
maze[i][j] = '0';
}
}
maze[1][1] = 'a';
for (int i = 1; i < MazeSize - 1; i++)
{
for (int j = 1; j < MazeSize - 1; j++)
{
cout << maze[i][j];
}
cout << "\n";
}
for (int i = 1; finish != true;)
{
for (int j = 1; finish != true;)
{
cout << "Command : ";
cin >> command;
system("cls");//방향을 받을때마다 새로운창
switch (command)
{
case 'w': if (maze[i - 1][j] == maze[i][j] || maze[i - 1][j] < 0)//w를 받을경우
{
for (int a = 1; a < MazeSize - 1; a++)
{
for (int b = 1; b < MazeSize - 1; b++)
{
cout << maze[a][b];
}
cout << "\n";
}
cout << "Command : END" << endl;
finish = true;
}
else {
maze[i - 1][j] = 'a';
i--;
for (int a = 1; a < MazeSize - 1; a++)
{
for (int b = 1; b < MazeSize - 1; b++)
{
cout << maze[a][b];
}
cout << "\n";
}
}break;
case 's': if (maze[i + 1][j] == maze[i][j] || maze[i + 1][j] < 0)//s를 받을경우
{
for (int a = 1; a < MazeSize - 1; a++)
{
for (int b = 1; b < MazeSize - 1; b++)
{
cout << maze[a][b];
}
cout << "\n";
}
cout << "Command : END" << endl;
finish = true;
}
else {
maze[i + 1][j] = 'a';
i++;
for (int a = 1; a < MazeSize - 1; a++)
{
for (int b = 1; b < MazeSize - 1; b++)
{
cout << maze[a][b];
}
cout << "\n";
}
}break;
case 'a': if (maze[i][j - 1] == maze[i][j] || maze[i][j - 1] < 0)//a를 받을경우
{
for (int a = 1; a < MazeSize - 1; a++)
{
for (int b = 1; b < MazeSize - 1; b++)
{
cout << maze[a][b];
}
cout << "\n";
}
cout << "Command : END" << endl;
finish = true;
}
else {
maze[i][j - 1] = 'a';
j--;
for (int a = 1; a < MazeSize - 1; a++)
{
for (int b = 1; b < MazeSize - 1; b++)
{
cout << maze[a][b];
}
cout << "\n";
}
}break;
case 'd': if (maze[i][j + 1] == maze[i][j] || maze[i][j + 1] < 0)//d를 받을경우
{
for (int a = 1; a < MazeSize - 1; a++)
{
for (int b = 1; b < MazeSize - 1; b++)
{
cout << maze[a][b];
}
cout << "\n";
}
cout << "Command : END" << endl;
finish = true;
}
else {
maze[i][j + 1] = 'a';
j++;
for (int a = 1; a < MazeSize - 1; a++)
{
for (int b = 1; b < MazeSize - 1; b++)
{
cout << maze[a][b];
}
cout << "\n";
}
}break;
}
}
}
}
저의 문제 접근방식은 7*7배열을 만들어서
배열의 인덱스가 6인경우에 벽에 부딪혔다고 판정을 내리게하고
아래와 같이 명령의 경우를 나눴습니다.
1. 'w'를 받은경우 : 위로 한칸
2. 'a'를 받은경우 : 왼쪽으로 한칸
3. 's를 받은경우 : 아래로 한칸
4. 'd'를 받은경우 : 오른쪽으로 한칸
지나온길에 부딪힌 판정을 내리는 방법은
자기가 지나온 길을 'a'라고 바꿨으므로, 'a'인 경우에는 END를 출력 시키면 됩니다.
미로의 크기를 넘어선 경우는 벽에 부딪혔다고 판정을 내고 END를 출력시켰습니다.
마지막으로 매 시행마다 새로운 창으로 하는법은
system("cls");//방향을 받을때마다 새로운창
system함수를 사용하는방법입니다.
아래는 결과화면 사진입니다.
나중에 system함수를 알아보는 시간도 가져보겠습니다.
#이 문제의 출처는 kw대학교 컴퓨터정보공학부 2021년 1학기 객체지향프로그래밍 과제문제입니다.
2-2 단어장 만드는 프로그램 (0) | 2021.07.15 |
---|---|
2-1 2차원배열의 행정렬 (0) | 2021.07.14 |
1-7 1차나 상수식을 검증하는 프로그램 (0) | 2021.07.12 |
1-6 체크섬을 구하는 문제 (0) | 2021.07.09 |
1-5 반복되는 문자 압축 후, 압축된 수만큼 출력 (0) | 2021.07.08 |
댓글 영역