9. 숫자 맞추기 게임

【파일구조】

c:\workshop\numbergame.py    1개

1숫자 맞추기 게임 프로그램

가. 숫자 맞추기 게임 프로그램

숫자 맞추기 게임 프로그램은 랜덤 함수를 이용하여 숫자를 지정한 후, 사용자가 생각하는 숫자를 입력하여, 비교하고 10번의 기회 동안 숫자를 맞추는 프로그램이다. 이 프로그램은 사용자의 즐거움을 줄 수 있는 게임을 간단한 프로그램으로 만들어 보았다. 자세한 설명은 아래의 숫자 맞추기 게임 프로그램을 전체적으로 프로그램 코딩한 후, 프로그램의 원리를 학습하여 보도록 하자.

이미지. 숫자 맞추기 게임 프로그램을 설명한 동영상의 스크린샷.
<숫자 맞추기 게임 프로그램>

# 숫자 비교 함수

def number_compare(number, g_number):


    choice="y" # 숫자 비교 상태 변숫값

    if(number<g_number): # 숫자를 비교하여 입력된 숫자가 높을 경우

        print("입력한 숫자가 정답보다 큽니다.") # 출력

        print("숫자를 다시 입력하세요.") # 출력

        print("─────") #출력


    elif(number>g_number): # 숫자를 비교하여 입력된 숫자가 낮을 경우

        print("입력한 숫자가 정답보다 작습니다.") # 출력

        print("숫자를 다시 입력하세요.") # 출력

        print("─────") # 출력


    else:

        print("정답!") # 비교한 숫자가 정답일 경우

        print("─────") # 출력

        print("축하!! 정답입니다. 숫자를 잘 찾으셨군요.^^") # 출력

        choice=input("다시 하시겠습니까(y/n)? : ") # 게임 선택

        if(choice=='n'):

            print("프로그램을 종료합니다.")

            return choice

    return choice

import random # 랜덤 모듈 임포트


choice="y" # 게임 상태 변수

guess_number=0 # 숫자 게임 입력값

index=0 # 10번의 기회에 관한 변수 초깃값


random_number=random.randint(1, 50) # 랜덤 함수에 따른 숫자 값


print("숫자 맞추기 게임\n") # 출력

print("─────") # 출력

print("1에서 50 이하의 숫자만 입력하세요. \n") # 출력

print("숫자를 맞출 수 있는 기회는 10번 입니다.\n") # 출력


while(choice=="y"): # 반복문 choice 값이 y일 경우 반복


    if(index==10): # index 값이 10일 경우

        print("10번의 기회가 끝났습니다.") # 출력

        print("프로그램을 종료합니다.") # 출력

        break # 반복문 빠져나옴


    elif(random_number==guess_number): # 게임이 다시 시작된 경우

        index=0 # index 값 초기화

        random_number=random.randint(1, 50) # 랜덤함수로 숫자 값 입력


    else:

        print("─────") # 출력

        guess_number=int(input("숫자 입력 : ")) # 숫자 입력

        print("") # 출력

        #숫자비교

        choice=number_compare(random_number, guess_number)

        index+=1 # 숫자 비교하는 횟수 증가

나. 숫자 맞추기 게임 프로그램 코딩 해설

1) 숫자 비교 함수 선언

숫자 맞추기 게임 프로그램의 전체적인 프로그램 코딩을 하였다면, 부분으로 나누어서 자세히 알아보도록 하자. 가장 처음에 나오는 프로그램 코딩은 숫자 비교 함수이다. 이 함수 안에 있는 프로그램 코딩은 아래와 같다.

# 숫자 비교 함수

def number_compare(number, g_number):


    choice="y" # 숫자 비교 상태 변숫값

    if(number<g_number): # 숫자를 비교하여 입력된 숫자가 높을 경우

        print("입력한 숫자가 정답보다 큽니다.") # 출력

        print("숫자를 다시 입력하세요.") # 출력

        print("─────") #출력


    elif(number>g_number): # 숫자를 비교하여 입력된 숫자가 낮을 경우

        print("입력한 숫자가 정답보다 작습니다.") # 출력

        print("숫자를 다시 입력하세요.") # 출력

        print("─────") # 출력


    else:

        print("정답!") # 비교한 숫자가 정답일 경우

        print("─────") # 출력

        print("축하!! 정답입니다. 숫자를 잘 찾으셨군요.^^") # 출력

        choice=input("다시 하시겠습니까(y/n)? : ") # 게임 선택

        if(choice=='n'):

            print("프로그램을 종료합니다.")

            return choice

    return choice

이 함수는 숫자 두 개를 인자 값으로 받아 숫자를 비교해주는 함수이다. 함수의 인자 값으로 하나는 랜덤 함수를 이용하여 만들어진 숫자 값과 다른 하나는 사용자가 만들어진 숫자 값을 맞추기 위해 입력한 숫자 값이다. 따라서 number 변수에는 랜던 함수로 만들어진 숫자 값이 들어 있고, g_number 변수에는 사용자가 입력한 숫자 값이 들어있게 된다. 숫자를 비교해주는 number_compare() 함수가 호출되면, 다음으로는 숫자를 비교하게 되는데, 만약 사용자가 입력한 숫자 값이 맞추고자 하는 숫자 값보다 클 경우에는 if 조건문이 시작된다. 그리고 이 조건문 안에 프로그램 코딩이 실행되는데, print() 함수를 사용하여 “입력한 숫자가 정답보다 큽니다”와 “숫자를 다시 입력하세요”라는 문구를 출력하고 함수는 choice 변숫값을 함수가 호출한 곳으로 반환하며, 함수를 끝내게 된다.

그리고 만약 g_number(사용자가 입력한 값) 변수가 number(사용자가 맞추고자 하는 값) 변수의 값 보다 작을 경우에는 print() 함수로 “입력한 숫자가 정답보다 작습니다.”와 “숫자를 다시 입력하세요”라는 문구를 호출하고 choice 값을 함수가 호출된 곳으로 반환하게 된다.

마지막으로 정답을 맞혔을 경우에는 else의 조건문이 실행되고, else 조건문 안에 있는 프로그램 코딩이 실행된다. 여기서 print() 함수로 “정답”과 “축하!! 정답입니다. 숫자를 잘 찾으셨군요^^”라는 문구가 출력된다. 그리고 게임을 다시 할 것인지를 질문하는 문구와 입력을 받게 되는데, “choice=input("다시 하시겠습니까(y/n)? : ")”와 같다.

그런데 choice의 값을 입력할 때, 주의 사항은 ‘y’ 와 ‘n’은 영어로 소문자만 입력해야 하며, 선택에 따라 게임을 계속 진행할 수도 있고, 게임을 종료할 수도 있다. 여기서 choice의 변수가 어떤 역할을 하는지 알아봐야 하는데, 초기에는 choice 변수에 ‘y’ 값을 입력되어 있어서 함수가 반환될 때, 대부분 ‘y’ 값을 반환하지만 마지막 else 조건문에서는 게임을 종료하고자 choice 변수에 “n” 값을 넣는다면 함수가 반환되는 곳에 “n” 값을 반환하여 프로그램을 종료시키게 된다.


2) 숫자 맞추기 게임 실행

앞에서는 숫자 맞추기 게임의 함수 부분을 설명했다면, 다음으로 학습할 프로그램 코딩 부분은 실제적으로 프로그램이 실행되어 함수를 호출하고, 실행하며 종료하게 되는 과정에 관한 부분이다. 먼저 아래의 프로그램 코딩을 살펴보도록 하자.

import random # 랜덤 모듈 임포트


choice="y" # 게임 상태 변수

guess_number=0 # 숫자 게임 입력값

index=0 # 10번의 기회에 관한 변수 초깃값


random_number=random.randint(1, 50) # 랜덤 함수에 따른 숫자 값


print("숫자 맞추기 게임\n") # 출력

print("─────") # 출력

print("1에서 50 이하의 숫자만 입력하세요. \n") # 출력

print("숫자를 맞출 수 있는 기회는 10번 입니다.\n") # 출력


while(choice=="y"): # 반복문 choice 값이 y일 경우 반복


    if(index==10): # index 값이 10일 경우

        print("10번의 기회가 끝났습니다.") # 출력

        print("프로그램을 종료합니다.") # 출력

        break # 반복문 빠져나옴


    elif(random_number==guess_number): # 게임이 다시 시작된 경우

        index=0 # index 값 초기화

        random_number=random.randint(1, 50) # 랜덤함수로 숫자 값 입력


    else:

        print("─────") # 출력

        guess_number=int(input("숫자 입력 : ")) # 숫자 입력

        print("") # 출력

        #숫자비교

        choice=number_compare(random_number, guess_number)

        index+=1 # 숫자 비교하는 횟수 증가

가장 먼저 실행 부분에 있어서, 알아두어야 하는 것은 임포트이다. 여기에서 랜덤이라는 내장 함수를 사용하기 위해서 random이라는 모듈을 임포트 하게 된다. 따라서 random의 모듈을 임포트 했기 때문에, random 모듈 안에 있는 random.randint() 함수를 사용할 수 있게 된다. 임포트의 프로그램 코딩은 간단하다. “import random”에서처럼 모듈 이름 앞에 임포트만 넣으면 해당하는 모듈을 가져와 사용할 수 있게 된다. 그다음으로는 이 프로그램에서 필요한 변숫값들이 초기화된다.

가장 먼저 choice의 변수는 ‘y’ 값으로 초기화되어 있고, guess_number의 변수에는 0 값으로 초기화되어 있다. 그리고 index의 변수에는 0이라는 값이 저장되어 초기화된 상태이다. 처음에 초기화된 choice의 변수는 프로그램을 사용할 것인지에 대한 변수이고, guess_number 변수는 사용자가 숫자를 알아맞히기 위해서 입력하는 숫자를 저장하는 변수이다. 그리고 마지막으로 index 변수는 숫자를 맞추는데 무한 반복할 수 없음으로, 기회를 10번으로 한정하고, 숫자를 입력할 때마다 하나씩 증가하여 10이 되면, 프로그램을 종료할 수 있는 변수이다.

변수에 선언이 끝나고, 다음으로 random_number 변수에 랜덤 함수를 이용하여 값을 저장하게 된다. “random_number=random.randint(1, 50)” 이 부분은 random.randint() 함수를 호출하는데 인자 값으로는 1과 50을 넣어서 1에서 50 사이의 숫자 중에 불특정으로 숫자를 만들어 반환하도록 하는 함수이다. 그래서 random_number의 변수에는 1에서 50의 숫자 사이에 불특정인 숫자가 저장되게 된다. 그리고 그다음으로는 게임의 방법을 알려줄 수 있도록, print() 함수로 “숫자 맞추기 게임”, “1 에서 50 이하의 숫자만 입력하세요.”, “숫자를 맞출 수 있는 기회는 10번입니다.”와 같은 내용이 화면에 출력되게 된다.

게임 프로그램을 시작하기 전에 모든 준비가 끝난 후에는 반복문을 사용하여 게임을 시작하게 된다. while 반복문의 조건은 choice 변수의 값이 ‘y’일 경우에 반복문이 실행되게 된다. 따라서 choice 변수의 초깃값이 ‘y’이므로 반복문은 조건 없이 실행되게 된다. 반복문 안에는 조건문이 있는데, 조건문의 종류에는 index의 변수가 10인 경우, random_number 변수가 guess_number 변수와 같을 경우와 위의 두 조건이 아닐 경우로 나누어져 있다.

가장 첫 번째 조건문은 index 변수가 10인 경우인데, index의 변수는 10회라는 기회를 알려주는 변수로써 10번의 기회가 됐지만 숫자를 맞추지 못했을 때 실행되는 조건문이다. 따라서 index 변수가 10이 됐다면, “10번의 기회가 끝났습니다.”와 “프로그램을 종료합니다.” 문구를 출력하고 프로그램을 종료하게 된다. 그다음 조건문은 “elif(random_number==guess_number)”이다. 이 조건문이 있는 이유는 숫자를 맞추고 난 후에 프로그램을 다시 시작하려 했을 때, 랜덤 함수를 사용하여 숫자를 재설정하고, index 값을 초기화하기 위해서 만든 조건문이다. 따라서 이 조건문이 끝나고 나면 random_number 변수에는 새로운 숫자의 값이 저장되며, index 변수에는 0 값으로 초기화를 진행하게 된다. 그리고 마지막 조건문이 가장 중요한 조건문이다.

“else” 조건문에는 위와 같이 2개의 조건문에 해당 사항이 없을 때 실행되는 조건문이다. 따라서 이 조건문에서는 사용자로부터 사용자가 생각하는 숫자를 guess_number 변수에 입력받게 된다. 그리고 guess_number 변수에 값을 입력받은 후에 “choice=number_compare()” 함수를 호출하게 된다. number_compare() 함수의 인자 값으로는 random_number 변숫값과 guess_number 변수의 값을 넘겨주게 되는데, guess_number의 변숫값에 따라 random_number 변수와 비교하여 숫자가 크고 작은지 또는 정답인지를 사용자에게 알려주게 된다.

그런데 만약 정답이 아닌 경우에는 index 변숫값을 하나씩 증가시켜, 정답을 맞힐 때까지 else 조건문을 반복하게 된다. 그리고 정답을 맞혔을 경우에는 이 프로그램을 종료할지 또는 다시 실행할 것인지를 사용자에게 물어보고 프로그램을 종료하겠다고 하면, choice 변수에 값이 ‘n’으로 변경되어 프로그램이 종료하게 된다.