전체 코드

#include <iostream>
#include <cstdlib>  // rand, srand
#include <ctime>    // time

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;

        // 컴퓨터 선택 (1~3 랜덤)
        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 timecall srand
while (true)loop_start: ... jmp loop_start
if (input > 3)cmp input, 3jg end_loop
rand() % 3 + 1call randdiv 연산
switchcmpje 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
✅ 빈칸 채우기 문제
✅ 디버깅 실습 자료

필요하신 자료 있나요?
다음은 어떤 강의 정리해드릴까요? 😊
(바로 이어서 함수, 배열, 포인터 정리도 가능합니다!)

profile
李家네_공부방

0개의 댓글