✊
실습 프로젝트 (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 와 동일▶ 실행 결과
(예제 참고)