전체 코드
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
srand(time(0));
const int SCISSORS = 1;
const int ROCK = 2;
const int PAPER = 3;
int wins = 0;
int total = 0;
while (true)
{
cout << "가위(1) 바위(2) 보(3)를 선택하세요!" << endl;
cout << "종료하려면 그 외의 숫자 입력" << endl;
cout << "> ";
int userInput;
cin >> userInput;
if (userInput < 1 || userInput > 3)
break;
int computerInput = (rand() % 3) + 1;
if (total == 0)
cout << "현재 승률: 계산 불가 (아직 결과 없음)" << endl;
else
cout << "현재 승률: " << (wins * 100) / total << "%" << endl;
switch (userInput)
{
case SCISSORS: cout << "당신: 가위"; break;
case ROCK: cout << "당신: 바위"; break;
case PAPER: cout << "당신: 보"; break;
}
cout << " vs ";
switch (computerInput)
{
case SCISSORS: cout << "컴퓨터: 가위"; break;
case ROCK: cout << "컴퓨터: 바위"; break;
case PAPER: cout << "컴퓨터: 보"; break;
}
cout << " -> 결과: ";
if (userInput == computerInput)
{
cout << "무승부" << endl;
}
else
{
total++;
if ((userInput == SCISSORS && computerInput == PAPER) ||
(userInput == ROCK && computerInput == SCISSORS) ||
(userInput == PAPER && computerInput == ROCK))
{
cout << "승리!" << endl;
wins++;
}
else
{
cout << "패배..." << endl;
}
}
}
cout << "게임 종료!" << endl;
return 0;
}
📚 상세 분석 (한 줄씩 해설)
| 코드 | 설명 |
|---|
srand(time(0)); | 난수 시드 설정 (실행마다 난수 다르게) |
const int SCISSORS = 1; | 가위=1, 바위=2, 보=3 상수 지정 |
while (true) | 무한 반복 (종료 전까지 계속) |
cin >> userInput; | 사용자 입력 받기 |
| `if (userInput < 1 | |
computerInput = (rand() % 3) + 1; | 컴퓨터 선택 (1~3) |
| 승률 출력 | (wins * 100) / total로 계산 |
switch (userInput) | 사용자 선택 출력 |
switch (computerInput) | 컴퓨터 선택 출력 |
| 가위바위보 판정 | 조건문 6가지로 처리 |
| 무승부 | 선택이 같으면 무승부 |
| 승리 | 이기는 경우 wins++ |
| 패배 | 지는 경우 아무 처리 없음 (total만 증가) |
📌 가위바위보 승패 규칙 정리
📦 메모리 흐름 (변수 상태 변화)
| 변수명 | 역할 | 초기값 | 변경 시점 |
|---|
| wins | 승리 횟수 | 0 | 승리 시 1씩 증가 |
| total | 총 게임 수 | 0 | 승패 확정 시 1씩 증가 |
| userInput | 사용자 선택 | - | 매 라운드마다 입력 |
| computerInput | 컴퓨터 선택 | - | 매 라운드마다 랜덤 생성 |
🎯 포인트 정리
| 개념 | 설명 |
|---|
| 난수 생성 | rand()와 srand() 사용 |
| 입력 받기 | cin으로 정수 입력 |
| 비교 | if, switch로 선택 비교 |
| 반복문 | 무한루프 (while(true)) |
| 조건 탈출 | 유효하지 않은 입력 시 break |
| 승률 계산 | (wins * 100) / total |
🧰 디스어셈블리적 관점
| C++ 코드 | 어셈블리 예시 |
|---|
srand(time(0)) | call time → call srand |
while (true) | loop_start: ... jmp loop_start |
if (input > 3) | cmp input, 3 → jg end_loop |
rand() % 3 + 1 | call rand → div 연산 |
switch | cmp → je case_label 반복 |
💡 주의할 점
| 주의사항 | 설명 |
|---|
| 시드 설정 필수 | 안 하면 매번 같은 값 |
| 정수 나눗셈 주의 | (float)로 캐스팅 필요 |
| 입력 범위 체크 | 1~3 외에는 반드시 종료 |
| 초기화 누락 금지 | wins, total 초기화 중요 |
| 무승부 처리 누락 | total++ 하면 안 됨 |
✨ 팁 & 응용
| 팁 | 설명 |
|---|
| 문자열로 변경 | enum과 문자열 매핑으로 깔끔하게 출력 |
| 반복횟수 제한 | round <= 10 같은 조건 추가 |
| 결과 누적 저장 | 로그 남기기 (파일 출력) |
| 컴퓨터 AI 강화 | 가중치 부여 (이전 선택 학습) |
🛠️ 요점 정리 표
| 개념 | 설명 |
|---|
| 난수 | rand(), srand() |
| 입력 | cin 사용 |
| 조건 | if, switch 사용 |
| 반복 | while(true) |
| 종료 | break 사용 |
| 승률 | (wins * 100) / total |
✅ 연습 문제 추천
| 난이도 | 문제 |
|---|
| ⭐ | 5판 3선승 가위바위보 만들기 |
| ⭐⭐ | 플레이어 이름 입력받기 |
| ⭐⭐⭐ | 플레이어 승패 로그 저장 (파일 출력) |
| ⭐⭐⭐⭐ | 컴퓨터 AI 강화 (최근 패턴 학습) |
📥 필요 자료
✅ 정리 PDF
✅ 빈칸 채우기 문제
✅ 디버깅 실습 자료
필요하신 자료 있나요?
다음은 어떤 강의 정리해드릴까요? 😊
(바로 이어서 함수, 배열, 포인터 정리도 가능합니다!)