본문 바로가기
메이플스토리

[CRP] 몬스터 땅따먹기

by lms0806 2023. 2. 2.
728x90
반응형

캐릭터가 메이플스토리의 몬스터가 되어 이동하면서 서로 땅따먹기 게임을 하는 미니게임입니다.

미니게임판은 이런식으로 양 끝에서 2명~4명의 플레이어가 시작합니다.

WASD나 ←→↑↓로 이동합니다.

 

이런식으로 이동하면서, 이동한 칸에는 색깔을 입히게 됩니다.

 

주황버섯과 예티처럼 예티가 지나간 길을 주황버섯이 지나가게 되면 색깔이 주황버섯의 색깔로 변경됩니다.

 

최종적으로 가장 많이 먹은 캐릭터가 이깁니다.

 

ex) 소스코드

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>

using namespace std;

int winner, max_eat_box;
int map[21][21];
bool visited[21][21];
vector<pair<int, int>> player(4);
int dx[] = { 1, 0, -1, 0 };
int dy[] = { 0, 1, 0, -1 };

int main()
{

	vector<string> moves(4);
	for (int i = 0; i < 4; i++) {
		string move;
		cin >> move;

		moves.push_back(move);
	}// 예시로 입력받은 움직임을 모두 저장

	int size = 0;
	for (int i = 0; i < moves.size(); i++) {
		int size = moves[i].size();
		size = max(size, size);
	}// 예시로 가장 많이 이동한 캐릭터의 길이를 최대로 지정

	for (int i = 0; i < size; i++) {
		for (int j = 0; j < 4; j++) {
			if (moves[j].size() < i) {
				continue;
			}// 예시로 주어진 문자열길이가 i보다 작으면 무시
			move(moves[j][i], j);
		}
	}

	bool same_winner = false;
	for (int i = 0; i < 21; i++) {
		for (int j = 0; j < 21; j++) {
			if (!visited[i][j] && map[i][j]) {
				int eat_box = bfs(i, j, map[i][j]);
				if (max_eat_box < eat_box) {
					max_eat_box = eat_box;
					winner = map[i][j];
					same_winner = false;
				}
				else if (max_eat_box == eat_box) {
					same_winner = true;
				}
			}
		}
	}

	if (same_winner) {
		cout << "공동 우승";
	}
	else {
		cout << winner;
	}
}

int bfs(int x, int y, int num) {
	queue<pair<int, int>> queue;
	visited[x][y] = true;
	queue.push({ x, y });

	int sum = 0;
	while (!queue.empty()) {
		int nowx = queue.front().first;
		int nowy = queue.front().second;
		queue.pop();

		sum++;

		for (int i = 0; i < 4; i++) {
			int nx = nowx + dx[i];
			int ny = nowy + dy[i];

			if (nx >= 0 && nx < 21 && ny >= 0 && ny < 21) {
				if (!visited[nx][ny] && map[nx][ny] == num) {
					queue.push({ nx, ny });
					visited[nx][ny] = true;
				}
			}
		}
	}
	return sum;
}

void move(char c, int idx) {
	int x = player[idx].first;
	int y = player[idx].second;

	if (c == 'W' && x > 0) {
		x--;
	}
	else if (c == 'S' && x < 20) {
		x++;
	}
	else if (c == 'A' && y > 0) {
		y--;
	}
	else if (c == 'D' && y < 20) {
		y++;
	}//범위랑 입력한 문자랑 해서 이동할 수 있으면 이동

	if (map[x][y] != idx + 1) {
		map[x][y] = idx + 1;
	} // 이건 사용자 별로 나눔 1~4(핑크빈, 예티, 주황버섯, 슬라임)

	player[idx] = {x, y};
}

 

728x90
반응형

댓글