콘텐츠 내 자동삽입광고

광고1

posted by 초코생크림빵 2025. 9. 16. 18:39
반응형

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'을 입력하기 전까지 게임이 계속 반복됩니다.


코드의 주요 부분

  1. import random
    • random 모듈을 가져옵니다. 이 모듈은 무작위 숫자 생성에 사용됩니다. 주사위 게임처럼 예측 불가능한 결과를 만들 때 유용합니다.
  2. print("주사위 게임 시작")
    • 게임을 시작한다는 알림 메시지를 출력합니다.
  3. throw = input('Enter를 치세요')
    • input() 함수를 사용해 사용자로부터 입력을 받습니다. 이때 입력된 내용은 throw 변수에 저장됩니다. 이 부분은 게임을 시작하기 위해 사용자가 엔터 키를 누르도록 유도하는 역할을 합니다.
  4. while throw != '0':
    • while 루프는 throw 변수의 값이 '0'이 아닐 때까지 블록 안의 코드를 반복해서 실행합니다. 즉, 사용자가 종료를 원하지 않는 한 게임은 계속 진행됩니다.
  5. com = random.randint(1, 6)
    • random.randint(1, 6) 함수는 1과 6 사이의 무작위 정수를 생성합니다. 이 값은 컴퓨터의 주사위 눈이 됩니다.
  6. user = int(input('num: '))
    • input('num: ')를 통해 사용자에게 숫자를 입력받습니다.
    • int() 함수는 입력받은 문자열을 **정수(integer)**로 변환합니다. input() 함수는 기본적으로 문자열을 반환하므로, 숫자로 계산하려면 반드시 형 변환을 해야 합니다.
  7. if com > user:
    • if 조건문은 컴퓨터의 주사위 눈(com)이 사용자의 숫자(user)보다 큰지 확인합니다.
    • 만약 이 조건이 참이면 컴퓨터가 승리한 것이므로, win 변수에 'com'을 할당합니다.
    • else는 if 조건이 거짓일 때 실행됩니다. 이 경우 컴퓨터의 눈이 사용자보다 작거나 같으므로 사용자가 승리한 것이며, win 변수에 'user'를 할당합니다.
  8. print(f'com {com} : user {user}, {win} win')
    • f-string을 사용해 게임 결과를 출력합니다.
    • {com}과 {user}는 각각 컴퓨터와 사용자의 주사위 눈을 나타냅니다.
    • {win}은 승자를 나타냅니다.
  9. 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(빈 문자열)면 반복 계속.

주어진 실행 결과(예시) 해석

출력 로그를 보면:

  1. 처음 Enter를 치세요에서 사용자가 Enter(빈 문자열)를 눌러 게임을 시작했음 → throw == '' 이므로 while 진입.
  2. num: 4 입력 → user = 4. com = 3(무작위). 비교 결과 user가 더 커서 user win 출력.
  3. 재시작에서 사용자가 Enter(빈 문자열)을 눌러 반복 계속.
  4. 두 번째 라운드: num: 2, com = 1 → user win.
  5. 마지막에 재시작 : ... 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') == '' 같은) 를 고민할 수 있음 — 다만 명확성이 떨어질 수 있으니 권장하진 않습니다.
반응형

콘텐츠 내 자동삽입광고