파이썬 실습/게임 만들기

파이썬 로또 번호 맞추기 게임 만들기

파기차차 2022. 8. 9. 07:44
728x90
반응형
SMALL
728x90
ㅁ 개요
 
O 프로그램 소개
 
 - 파이썬을 이용하여 로또번호를 맞추는 게임입니다.

(본 블로그의 내용은 유튜브 동영상(파이썬 로또 번호 맞추기 게임 만들기)에서 더욱 자세히 보실 수 있습니다.)

 

 

 
 
O 완성된 프로그램 모습/실행 화면
 
 - 로또 번호 6개를 띄어쓰기로 입력하면 컴퓨터가 랜덤하게 생성한 6개의 번호와 비교 후 당첨여부를 알려주는 알려주고, 맞춘개수, 내가 맞춘 번호, 등수 등을 보여줍니다.
 

 

 
ㅁ 세부 내용
 
O 완성된 소스
 
#################################################################################
################### 1.당첨번호를 랜덤으로 추출 하는 부분
#################################################################################
import random

lotto = []                      # lotto 리스트를 만들고
while True:
    num = random.randint(1,45)  # 1~45의 숫자 중 랜덤한 수를 num변수에 저장
    if num not in lotto:        # lotto 리스트에 해당 숫자가 없으면 넣는다.
        lotto.append(num)

    if len(lotto) == 6:         # lotto 리스트에 6개의 숫자가 들어 있으면 빠져 나온다.
        break;                  # while문을 빠져 나옴

print(lotto)                    # 당첨 번호 확인




#################################################################################
################### 2.내가 입력한 번호를 저장
#################################################################################
#################################################################################
################### 4.사용자의 입력값이 올바른지 점검 후 예외 처리
#################################################################################
inputStr = input("내 로또번호 입력(띄어쓰기로 6개 입력): ").split(" ") # split()함수로 input의 문자열을 " "으로 구분
print(inputStr)                 # inputStr 리스트안에 문자열로 저장됨
# print(type(inputStr))           # inputStr 타입을 확인(list)

mine = []
for n in inputStr:              # inputStr 리스트의 내용물을 하나씩 int로 타입을 변경 후 mine 리스트에 넣어줌

    #################################################################################
    # 4.1.사용자가 입력한 값을 하나씩 숫자인지(isdigit()) 확인하고, 해당 숫자가 1~45 사이인지 확인, 맞으면 mine 리스트에 추가
    #################################################################################
    if n.isdigit() == True and (int(n) >=1 and int(n) <=45):
        mine.append(int(n))
    else:
        break;                  # 사용자가 입력한 값이 1~45사이의 숫자가 아니면 for문을 빠져나옴


print(mine)                     # mine 리스트안에 숫자로 저장됨



#################################################################################
################### 3.당첨번호와 내가 입력한 번호를 비교
#################################################################################
                                #################################################################################
if len(mine) !=6:               # 4.2.사용자가 입력한 값이 숫자이지만, 6개가 아낸 경우 예외처리 해줌     
                                #################################################################################
    print("입력값이 올바르지 않거나(숫자아님), 6개가 아닙니다.")

else:
    # 내 번호가 lotto 당첨번호 리스트에 포함되어 있는지 체크
    same = 0
    mynum = ""
    for myN in mine:                # mine 리스트의 내용물을 하나씩 확인 후 lotto 리스트에 있으면 same(맞춘 개수)dmf 1개씩 늘려줌
        if myN in lotto:
            same = same + 1
            mynum = mynum + str(myN) + " "

    print("맞춘 개수는 : ", same)   # 내가 입력한 숫자(mine)와 랜덤하게 생성된 숫자(lotto) 사이에 동일한 숫자가 몇 개인지 출력


    #당첨번호와 내번호가 같은지 눈으로 확인하는 테스트 코드
    print("당첨번호 ", lotto)
    print("내번호 ", mine)
    print("내가 맞춘 번호는 : ", mynum)    


    #same에 따라 인덱싱해서 등수 표기
    score = [0,6,5,4,3,2,1]
    if same == 0:                   # same(맞춘개수)이 0이면 그에 맞는 메시지 출력
        print("동일한 번호가 하나도 없습니다.")
    else:
        print(f"{same}개 맞음, {score[same]} 등 당첨!!!") # 1개 맞춘 경우(same=1) score[1]이므로 6등임

 

 

 

O 핵심 내용
 
1. num = random.randint(1,45) : 1~45 사이의 랜덤한 수를 생성 후 num변수에 할당

 

2. lotto.append(num) : lotto 리스트에 num 추가(리스트에 추가할때 append() 함수 사용)
 
3. break;           : 루프를 빠져 나갈때 사용(여기서는 while에서 lotto리스트의 길이가 6이 아니면 빠져나감)
 
4. n.isdigit()      : n이 숫자인지 아닌지를 판단(True 또는 False를  반환)

 

 

 

O 기본 내용(단계적 구성으로 최종 소스 완성)
 

 - 당첨번호를 랜덤하게 생성하기 위해서 random.randint(1,45)를 사용하여 1~45사이의 숫자 6개를 lotto 리스트에 넣습니다. 변수를 리스트에 담기 위해서 append를 사용하였습니다.

 

 

 

 - 마찬가지로 내가 입력한 번호를 저장하기 위해서 입력값을 inputStr로 받고, mine리스트에 담습니다.

 

 

 - 당첨번호와 내가 입력한 번호를 비교 후 맞춘 개수(same)를 셉니다.

 

 

 - 동일한 번호가 있으면 맞춘 개수를 표시해 주고, 그렇지 않으면 맞추지 못함을 알려줍니다.

 

 

 - 프로그램에서 오류가 존재하는데, 사용자 입력시 문자를 입력하거나, 1~45 숫자가 아닌 수를 입력하거나, 6개 숫자가 아닌 1개 또는 7개 등을 입력시 에러가 발생함을 확인합니다.

 

 

 - 문자 입, 1~45 숫자가 아닌 수 입력, 6개 숫자가 아닌 1개 또는 7개 등을 입력시 에러에 대하여 아래와 같이 if문을 활용하여 수정해 줍니다.

 

 


 
ㅁ 정리
 
O 우리가 배운 내용
 

 - 리스트에 값을 추가하는 방법을 알았습니다.(xx.append)

 - 루프에서 빠져나가는 방법을 배웠습니다.(break;)

 - 에러 발생시 에러를 처리 하는 예외처리 방법을 알았습니다.(try~ except)

 
O 추가 개선할 점
 

 - 위의 프로그램은 한가지 문제점이 있습니다. 사용자가 동일한 숫자를 입력시 해당 숫자가 당첨되는 경우 중복 카운드를 한다는 것입니다.

 - 예를 들어 아래에서 보듯이 33을 2번 입력하면 내가 맞춘 번호에 33 한번 나오는 것이 아니라 33 33 2번으로 카운트 하는 오류가 발생합니다.

 - 아래 오류를 개선하는 프로그램을 직접 스스로 만들어 보시기를 적극 권장 드립니다.

 

 

 

 

오늘은 이렇게 윈도우 계산기를 작성하는 소스코드를 작성해보고 실습해 보았습니다.

 

내용 중 이해가 되지 않거나, 더 좋은 방법들이 있다면 댓글로 의견을 주시기 바라며,

내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.

 

 

감사합니다.

728x90
반응형
LIST