두 사람이 하는 가위, 바위, 보 게임을 만들어보자 두 사람의 이름은 '로미오'와 '줄리엣'으로 한다. 먼저 "로미오>>"를 출력하고 '로미오'로부터 "가위", "바위", "보" 중 하나의 문자열을 입력받고, 다시 "줄리엣>>"을 출력하고 '줄리엣'으로부터 "가위", "바위", "보" 중 하나의 문자열을 입력받는다. 누가 이겼는지 판단하여 승자를 출력한다. 비기게 되면 "비겼습니다."라고 출력하고 프로그램을 종료한다.
#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;
}
이렇게 개선해줬다. 확실히 이 코드가 더 좋아보인다.
'C++' 카테고리의 다른 글
[명품 C++ Programming] 3장 실습 문제 (1) | 2025.04.26 |
---|---|
[명품 C++ Programming] 3장 Open Challenge (지수 표현 클래스 만들기) (0) | 2025.04.26 |
[명품 C++ Programming] 4장 실습 문제 (0) | 2025.04.08 |
[명품 C++ Programming] 2장 실습 문제 (2) | 2025.01.14 |
C++ 빌드 프로세스와 주요 오류의 이해 (4) | 2025.01.13 |