파이썬, 주사위게임 소스
import random
print("주사위 게임 시작")
throw = input('Enter를 치세요')
while throw != '0':
com = random.randint(1,6)
user=int(input('num: '))
if com>user:
win = 'com'
else:
win = 'user'
print(f'com {com} : user {user}, {win} win')
throw = input("재시작 : Enter, 종료 : 0")
결과)
주사위 게임 시작
Enter를 치세요
num: 4
com 3 : user 4, user win
재시작 : Enter, 종료 : 0
num: 2
com 1 : user 2, user win
재시작 : Enter, 종료 : 00
파이썬 소스 및 결과 입니다. 소스 설명)
전체적인 코드 설명
이 코드는 주사위 게임을 구현한 파이썬 스크립트입니다. random 모듈을 사용해 1부터 6까지의 무작위 숫자를 생성하고, 사용자가 입력한 숫자와 비교하여 승자를 결정합니다. 사용자가 '0'을 입력하기 전까지 게임이 계속 반복됩니다.
코드의 주요 부분
- import random
- random 모듈을 가져옵니다. 이 모듈은 무작위 숫자 생성에 사용됩니다. 주사위 게임처럼 예측 불가능한 결과를 만들 때 유용합니다.
- print("주사위 게임 시작")
- 게임을 시작한다는 알림 메시지를 출력합니다.
- throw = input('Enter를 치세요')
- input() 함수를 사용해 사용자로부터 입력을 받습니다. 이때 입력된 내용은 throw 변수에 저장됩니다. 이 부분은 게임을 시작하기 위해 사용자가 엔터 키를 누르도록 유도하는 역할을 합니다.
- while throw != '0':
- while 루프는 throw 변수의 값이 '0'이 아닐 때까지 블록 안의 코드를 반복해서 실행합니다. 즉, 사용자가 종료를 원하지 않는 한 게임은 계속 진행됩니다.
- com = random.randint(1, 6)
- random.randint(1, 6) 함수는 1과 6 사이의 무작위 정수를 생성합니다. 이 값은 컴퓨터의 주사위 눈이 됩니다.
- user = int(input('num: '))
- input('num: ')를 통해 사용자에게 숫자를 입력받습니다.
- int() 함수는 입력받은 문자열을 **정수(integer)**로 변환합니다. input() 함수는 기본적으로 문자열을 반환하므로, 숫자로 계산하려면 반드시 형 변환을 해야 합니다.
- if com > user:
- if 조건문은 컴퓨터의 주사위 눈(com)이 사용자의 숫자(user)보다 큰지 확인합니다.
- 만약 이 조건이 참이면 컴퓨터가 승리한 것이므로, win 변수에 'com'을 할당합니다.
- else는 if 조건이 거짓일 때 실행됩니다. 이 경우 컴퓨터의 눈이 사용자보다 작거나 같으므로 사용자가 승리한 것이며, win 변수에 'user'를 할당합니다.
- print(f'com {com} : user {user}, {win} win')
- f-string을 사용해 게임 결과를 출력합니다.
- {com}과 {user}는 각각 컴퓨터와 사용자의 주사위 눈을 나타냅니다.
- {win}은 승자를 나타냅니다.
- throw = input("재시작 : Enter, 종료 : 0")
- 다시 input() 함수를 호출하여 사용자에게 게임을 계속할지, 종료할지 물어봅니다.
- 사용자가 '0'을 입력하면 while 루프의 조건(throw != '0')이 거짓이 되어 게임이 종료됩니다. 엔터 키를 누르는 등 다른 값을 입력하면 루프가 계속 실행되어 게임이 재시작됩니다.
결과 분석
결과는 코드가 의도한 대로 동작하고 있음을 보여줍니다.
- 첫 번째 게임: 사용자가 4를 입력했고, 컴퓨터는 3을 뽑았습니다. if com > user (3 > 4)는 거짓이므로 else 블록이 실행되어 user가 승리했습니다. com 3 : user 4, user win이 정확하게 출력되었습니다.
- 두 번째 게임: 사용자가 2를 입력했고, 컴퓨터는 1을 뽑았습니다. if com > user (1 > 2)는 거짓이므로 else 블록이 실행되어 user가 승리했습니다. com 1 : user 2, user win이 정확하게 출력되었습니다.
- 게임 종료: 마지막에 0을 입력하면서 while 루프가 종료되고 프로그램이 끝납니다.
개선한 소스코드 설명)
좋습니다 — 보내주신 파이썬 코드와 실행 결과를 한 줄씩, 흐름대로 자세히 설명하고 문제점·개선안까지 함께 드릴게요. 이해하기 쉽게 한국어로 풀어쓰겠습니다.
코드(한 줄씩) 설명
import random
- random 모듈을 가져옵니다. 주사위처럼 무작위 수를 만들 때 씁니다.
print("주사위 게임 시작")
- 화면에 주사위 게임 시작을 출력합니다.
throw = input('Enter를 치세요')
- 사용자로부터 한 줄 입력을 받습니다. 입력은 문자열로 저장됩니다.
- 사용자가 그냥 Enter 키만 누르면 throw에는 빈 문자열 ''이 들어갑니다.
while throw != '0':
- throw가 문자열 '0'이 아니면 반복(while)을 계속합니다.
- 즉, 정확히 '0'을 입력하면 반복이 끝나고 프로그램이 종료됩니다. ('00'이나 ' 0' 등은 '0'과 다르므로 종료되지 않습니다.)
com = random.randint(1,6)
- 컴퓨터의 주사위 값(1~6 사이, 양끝 포함)을 무작위로 정합니다. randint(a,b)는 a와 b를 포함합니다.
user = int(input('num: '))
- 사용자에게 숫자를 입력받아 int()로 정수로 변환합니다.
- 주의: 사용자가 정수가 아닌 값을 입력하거나 빈 문자열(Enter만 누름)을 입력하면 ValueError가 발생해 프로그램이 에러로 종료됩니다.
if com>user:
win = 'com'
else:
win = 'user'
- 컴퓨터 값이 더 크면 win = 'com'. 그 외(사용자가 더 크거나 같은 경우)는 win = 'user'.
- 버그 포인트: 동점(같은 값)일 때에도 else가 실행되므로 사용자 승으로 처리됩니다. 동점을 별도 처리하려면 elif나 == 비교가 필요합니다.
print(f'com {com} : user {user}, {win} win')
- f-string을 이용해 결과를 출력합니다. 변수의 실제 값이 문자열 안에 들어갑니다.
throw = input("재시작 : Enter, 종료 : 0")
- 반복 조건을 갱신하기 위해 다시 입력을 받습니다. 사용자가 정확히 '0'을 입력하면 while을 빠져나갑니다. Enter(빈 문자열)면 반복 계속.
주어진 실행 결과(예시) 해석
출력 로그를 보면:
- 처음 Enter를 치세요에서 사용자가 Enter(빈 문자열)를 눌러 게임을 시작했음 → throw == '' 이므로 while 진입.
- num: 4 입력 → user = 4. com = 3(무작위). 비교 결과 user가 더 커서 user win 출력.
- 재시작에서 사용자가 Enter(빈 문자열)을 눌러 반복 계속.
- 두 번째 라운드: num: 2, com = 1 → user win.
- 마지막에 재시작 : ... 00처럼 보이는데, 만약 실제로 '00'을 입력했다면 종료되지 않습니다 ('00' != '0'). 종료하려면 정확히 '0'을 입력해야 합니다.
문제점(요약)
- 동점(무승부)을 별도로 처리하지 않음 → 동점은 현재 사용자 승으로 처리됨(의도치 않은 동작).
- int(input(...))에서 사용자가 숫자가 아닌 값을 넣으면 ValueError로 프로그램이 종료됨.
- throw 변수명과 제어 방식이 직관적이지 않음. (시작/종료용 입력을 따로 받는 구조)
- 재시작 입력은 문자열 비교 '0'만 검사하므로 '00', ' 0' 등은 종료 조건으로 인정되지 않음.
- 사용자 입력값 범위(1~6) 체크 없음 — 7이나 음수를 넣어도 비교 가능하지만 논리적으로 맞지 않음.
개선된 예제 코드 (안전 처리 + 무승부 처리)
아래 코드는 입력 오류 처리, 1~6 범위 검사, 무승부 처리, 종료키(0) 허용 등을 추가한 예시입니다.
import random
print("주사위 게임 시작")
while True:
cmd = input("시작하려면 Enter, 종료하려면 0을 입력하세요: ").strip()
if cmd == '0':
print("게임을 종료합니다.")
break
s = input("num (1~6 입력, 종료하려면 0 입력): ").strip()
if s == '0':
print("게임을 종료합니다.")
break
try:
user = int(s)
except ValueError:
print("숫자(1~6)를 입력하세요. 다시 시도합니다.\n")
continue
if not 1 <= user <= 6:
print("1에서 6 사이의 숫자만 입력하세요. 다시 시도합니다.\n")
continue
com = random.randint(1, 6)
if com > user:
result = "컴퓨터 승"
elif com < user:
result = "사용자 승"
else:
result = "무승부"
print(f'com {com} : user {user} -> {result}\n')
이렇게 하면 다음이 개선됩니다:
- 빈 입력이나 문자 입력 시 프로그램이 즉시 에러로 끝나지 않고 친절히 안내한 뒤 다시 반복합니다.
- 동점(무승부)을 올바르게 처리합니다.
- 1~6 범위가 아닌 입력은 거르고 다시 받습니다.
- 종료 조건(0)을 두 곳에서 처리해 언제든 종료 가능하게 했습니다.
추가 팁(원하면 더 도와드릴 수 있어요)
- 게임 기록(점수 누적) 기능 추가: user_score, com_score 두고 승리 카운트.
- 베스트오브 N(예: 3전 2선승제)로 변경.
- 주사위 그래픽(ASCII)으로 보여주기.
- 자동으로 입력 오류를 막고 재시도 횟수 제한 두기.
- '00' 같이 공백/여러 문자 입력을 허용해 '0'으로 취급하려면 strip() 후 '0' 포함 체크(if s.strip().lstrip('0') == '' 같은) 를 고민할 수 있음 — 다만 명확성이 떨어질 수 있으니 권장하진 않습니다.