← 파이썬 강의 목록으로
실습 프로젝트 (Practice) · ★
조건문·반복문·random

Lv1 · 가위바위보 (3판 2선승)

사용자와 컴퓨터가 가위·바위·보를 내고 3판 2선승으로 승부를 가립니다. 잘못된 입력 재요청, 통산 전적 누적까지 다룹니다.

조건문반복문random
소요 시간
1~2시간
난이도
📊 기초 응용
선수 조건
🎯 기초 4-5주차 (조건문, 반복문, random)
결과물
if/elif/else 와 while 로 흐름을 제어하는 첫 작은 게임

이 강의에서 배우는 것

  • 1사용자 입력의 유효성을 검사한다
  • 2random.choice 로 컴퓨터 패를 결정한다
  • 3승·무·패 판정 로직을 함수로 분리한다
  • 4while 로 2승 조건이 만족될 때까지 반복한다

프로젝트 개요

  • 기초 4주차의 1회성 가위바위보를 3판 2선승 + 통산 전적으로 확장
  • 잘못된 입력은 재요청 (가위/바위/보 또는 r/p/s)
  • 매치 종료 후 '한 게임 더?' 재시작 옵션

요구사항

  • 입력: 가위/바위/보 (한글) 또는 r/p/s
  • 컴퓨터는 random.choice
  • 라운드마다 결과 + 현재 스코어 출력
  • 3승 먼저 = 매치 승자
  • 통산 전적(매치 단위) 누적

입출력 예시

text
[1라운드] 선택(가위/바위/보): 가위
컴퓨터: 보  → 사용자 승!  (1 : 0)

[2라운드] 선택: 바위
컴퓨터: 바위 → 무승부 (1 : 0)

🏆 매치 승자: 사용자 (3:1)

한 게임 더? (y/n): n

[통산 전적]  사용자 1 매치, 컴퓨터 0 매치

도전 과제

  • 컴퓨터가 사용자 패턴을 학습 (마지막 3개 입력 → 다음 예측)
  • 통산 전적을 파일로 저장

채점 체크리스트

  • 잘못된 입력 재요청
  • 3판 2선승 로직 정확
  • 통산 전적 누적
  • 함수 3개 이상 분리

💻 예제 (examples)

실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.

solution.py전체 동작 코드
CODE
"""가위바위보 — 3판 2선승 + 통산 전적"""
import random

CHOICES = ["가위", "바위", "보"]
SHORT = {"r": "가위", "p": "바위", "s": "보"}
WIN = {"가위": "보", "바위": "가위", "보": "바위"}

def get_user_choice():
    while True:
        raw = input("선택(가위/바위/보 또는 r/p/s): ").strip().lower()
        if raw in CHOICES:
            return raw
        if raw in SHORT:
            return SHORT[raw]
        print("  ⚠️ 가위/바위/보 중 하나를 입력하세요")

def play_round(round_num, user_score, com_score):
    print(f"\n[{round_num}라운드]  현재 스코어 ({user_score} : {com_score})")
    user = get_user_choice()
    com = random.choice(CHOICES)
    print(f"컴퓨터: {com}", end="  ")
    if user == com:
        print("→ 무승부")
        return user_score, com_score
    if WIN[user] == com:
        print("→ 사용자 승!")
        return user_score + 1, com_score
    print("→ 컴퓨터 승!")
    return user_score, com_score + 1

def play_match():
    us = cs = 0
    r = 1
    while us < 3 and cs < 3:
        us, cs = play_round(r, us, cs)
        r += 1
    winner = "사용자" if us >= 3 else "컴퓨터"
    print(f"\n🏆 매치 승자: {winner} ({us}:{cs})")
    return winner

def main():
    user_wins = com_wins = 0
    while True:
        winner = play_match()
        if winner == "사용자":
            user_wins += 1
        else:
            com_wins += 1
        if input("\n한 게임 더? (y/n): ").strip().lower() != "y":
            break
    print(f"\n[통산 전적]  사용자 {user_wins} 매치 승, 컴퓨터 {com_wins} 매치 승")

if __name__ == "__main__":
    main()
▶ 실행 결과
[1라운드]  현재 스코어 (0 : 0)
선택(가위/바위/보 또는 r/p/s): 가위
컴퓨터: 보  → 사용자 승!
...
🏆 매치 승자: 사용자 (3:1)
한 게임 더? (y/n): n
[통산 전적]  사용자 1 매치 승, 컴퓨터 0 매치 승

📝 과제 (exercises)

직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.

과제 1

프로젝트 구현

목표: 위 사양대로 직접 작성한다.

요구사항
  • WIN 딕셔너리로 승패 판정
  • play_round 와 play_match 함수 분리
  • 통산 전적 누적
💡 힌트

WIN[user] == com 이면 사용자 승

while us < 3 and cs < 3

입출력 예시
🏆 매치 승자: 사용자 (3:1)
채점
  • · 함수 분리
  • · 잘못된 입력 처리
정답 코드 펼치기 / 접기
SOLUTION
# 위 solution.py 와 동일
▶ 실행 결과
(예제 참고)
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗