두 사람이 하는 가위, 바위, 보 게임을 만들어보자 두 사람의 이름은 '로미오'와 '줄리엣'으로 한다. 먼저 "로미오>>"를 출력하고 '로미오'로부터 "가위", "바위", "보" 중 하나의 문자열을 입력받고, 다시 "줄리엣>>"을 출력하고 '줄리엣'으로부터 "가위", "바위", "보" 중 하나의 문자열을 입력받는다. 누가 이겼는지 판단하여 승자를 출력한다. 비기게 되면 "비겼습니다."라고 출력하고 프로그램을 종료한다. 

#include <iostream>
#include <string>
using namespace std;

int main() {
	string ro, jul;
	cout << "가위 바위 보 게임을 합니다. 가위, 바위, 보 중에서 입력하세요.\n";
	cout << "로미오>>";
	getline(cin, ro);
	cout << "줄리엣>>";
	getline(cin, jul);

	if ((ro == "가위" && jul == "보") || (ro == "바위" && jul == "가위") || (ro == "보" && jul == "바위"))
		cout << "로미오가 이겼습니다." << endl;
	else if (ro == jul)
		cout << "로미오와 줄리엣이 비겼습니다." << endl;
	else
		cout << "줄리엣이 이겼습니다." << endl;
}

 

코드를 작성하고 나니 좀 많이 아쉬운 점이 있다.

가위, 바위, 보가 숫자로 0,1,2 일 경우 입력받은 하나의 값에서 1을 더하고 3의 나머지를 구함으로써 승패 여부를 간단하게 할 수 있는데 위의 지저분한 논리식이 마음에 들지 않았다 

그래서 이를 고려하여 다시 코드를 작성하였다.

 

배열을 사용하여 코드의 반복은 간소화하고 위의 논리식을 간소화 하였다 

#include <iostream>
#include <string>
using namespace std;

struct user {
	char name[7];
	string in;
	int in_n;
};


int main() {
	struct user u[2] = { {"로미오"}, {"줄리엣"} };
	string rjb[] = { "가위", "바위", "보" };
	int i, j;

	cout << "가위 바위 보 게임을 합니다. 가위, 바위, 보 중에서 입력하세요.\n";
	for (i = 0; i < sizeof(u) / sizeof(struct user); i++) {
		cout << u[i].name << ">>";
		getline(cin, u[i].in);

		for (j = 0; j < sizeof(rjb) / sizeof(rjb[0]); j++) {
			if (u[i].in == rjb[j]) {
				u[i].in_n = j;
				break;
			}
		}
		if (j == sizeof(rjb) / sizeof(rjb[0])) {
			cout << "입력된 값이 유효하지 않습니다.\n";
			return -1;
		}
	}
	if ((u[0].in_n + 1) % 3 == u[1].in_n)
		cout << u[1].name << "가 이겼습니다." << endl;

	else if (u[0].in_n == u[1].in_n)
		cout << u[0].name << "과 " << u[1].name << "이 비겼습니다. \n";

	else
		cout << u[0].name << "이 이겼습니다." << endl;

}

 c언어에서처럼 char *rjb[] = {"가위", "바위", "보"}; 했더니 에러가 났다, c++은 이 방식이 불가하고 대신 string 배열을 대신 사용한다.

이전 코드보다 확장성, 유지보수성, 안정성이 높아졌다. 

해당 코드를 chatgpt에 넣어보고 더 개선할점을 요구했다. 

 

#include <iostream>
#include <string>
using namespace std;

struct user {
    string name;
    string in;
    int in_n;
};

constexpr int RJB_COUNT = 3;
const string rjb[RJB_COUNT] = { "가위", "바위", "보" };

int getInputIndex(const string& input, const string rjb[], int size) {
    for (int i = 0; i < size; i++) {
        if (input == rjb[i]) return i;
    }
    return -1; // 유효하지 않은 입력
}

int determineWinner(int p1, int p2) {
    if ((p1 + 1) % 3 == p2) return 2; // 플레이어 2 승리
    if (p1 == p2) return 0;           // 무승부
    return 1;                         // 플레이어 1 승리
}

int main() {
    user u[2] = { {"로미오"}, {"줄리엣"} };
    int result;

    cout << "가위 바위 보 게임을 합니다. 가위, 바위, 보 중에서 입력하세요.\n";

    for (int i = 0; i < 2; i++) {
        while (true) {
            cout << u[i].name << ">> ";
            getline(cin, u[i].in);

            u[i].in_n = getInputIndex(u[i].in, rjb, RJB_COUNT);
            if (u[i].in_n != -1) break;

            cout << "입력된 값이 유효하지 않습니다. 다시 입력해주세요.\n";
        }
    }

    result = determineWinner(u[0].in_n, u[1].in_n);
    if (result == 1)
        cout << u[0].name << "이 이겼습니다." << endl;
    else if (result == 2)
        cout << u[1].name << "가 이겼습니다." << endl;
    else
        cout << u[0].name << "과 " << u[1].name << "이 비겼습니다." << endl;

    return 0;
}

이렇게 개선해줬다. 확실히 이 코드가 더 좋아보인다. 

+ Recent posts