Project (1) 숫자야구 게임 만들기

PM/iOS Developer KimKU·2022년 1월 15일
0
post-thumbnail

Project (1) 숫자야구🎮 게임 만들기

학창시절 쉬는시간 혹은 수업시간에 친구들과 즐기던 게임인 '숫자야구' ⚾️ 를 파이썬을 통해 구현해 보려고 한다.

이번이 첫 프로젝트라 많이 미숙하고 코드가 정신없을 수 있다. 코드를 보고 개선해야할 점이나 고쳤으면 하는 점들을 댓글에 달아주는것은 환영이다.🙌🏻 언제나 날카로운 태클을 기대하고 있다.


숫자야구 규칙

  1. 컴퓨터는 1 ~ 9까지의 숫자 중 4개를 중복없이 뽑는다.
  2. 컴퓨터는 중복없이 뽑은 4개의 숫자를 순서 상관없이 배열한다.
  3. 사용자는 컴퓨터가 뽑은 숫자와 배열을 맞춘다.
  4. 위치는 맞지 않지만 포함된 숫자를 맞추면 볼(Ball)
  5. 포함된 숫자도 맞고 위치도 맞으면 스트라이크(Strike)
  6. 사용자가 뽑은 숫자가 컴퓨터가 뽑은 숫자와 일치하는게 단 한개라도 없다면 아웃(Out)

예를 들어 컴퓨터가 '5 9 4 1' 를 뽑았다고 하자. 그럼 사용자는 1 ~ 9까지의 숫자 중 3개를 뽑아 컴퓨터에게 물어본다. 사용자가 '4 8 3 2' 이라는 숫자를 제시할 때 컴퓨터는 '1 Ball' 이라고 한다. 왜냐하면 4는 있지만 위치가 맞지 않기 때문이다. 그리고 사용자가 '5 4 8 2' 이라고 한다면 컴퓨터는 1 Strike 1 Ball 이라고 할 것이다. 사용자가 추리하는 과정을 거쳐 4 Strike를 이끌어내면 성공이다.


게임 진행 예시


과정 1) 랜덤 숫자 4개 뽑기

한 단계 한 단계 완성을 해 보자.

우리는 게임을 하기 위해 1 ~ 9 까지의 범위 안에서 중복 없이 4개의 숫자를 뽑아야 한다. 그게 게임의 시작이다. 4개의 숫자를 correct_number 라고 이름을 짓겠다.

일단 파이썬에서 랜덤한 숫자를 뽑기 위해선 'import random' 이라는 모듈이 필요하다. 'import random'은 파이썬에서 제공하는 모듈이다. C++ 에서 cstlib, ctime 같은 역할을 하고있다.

본인은 랜덤 생성한 숫자를 배열에 담아볼 생각이다. 그래서 correct_number = ["0", "0", "0", "0"] 이라고 하였다. 배열 안에 문자열로 초깃값을 넣은 이유는 파이썬 문법 중 사용자의 입력을 받아들이는 input() 함수의 특성때문이다. input() 함수는 사용자의 입력을 문자열로 받아들이기 때문이다. 그래서 배열의 값도 "0" 으로 정하였다.

import random #

correct_number = ["0", "0", "0", "0"]

과정 2) 랜덤 숫자 배정하기

corrcet_number 의 초깃값을 설정한 후 다음 단계로 첫 번째 배열에 1 ~ 9 까지의 범위 중 하나의 숫자 값을 주어야 한다. 파이썬에서는 randrange 라는 함수가 있다. randrange의 사용예를 보여주자면 random.randrange(1, 9, 1)'1 이상 그리고 9 미만의 숫자 중 랜덤으로 하나의 숫자를 뽑아라' 라는 뜻이다. 숫자야구 게임의 규칙은 1 이상 9 이하의 숫자를 뽑아야 하므로 random.randrange(1, 10, 1)로 하면 되겠다.

correct_number[0] = str(random.randrange(1, 10, 1))
correct_number[1] = str(random.randrange(1, 10, 1))
correct_number[2] = str(random.randrange(1, 10, 1))
correct_number[3] = str(random.randrange(1, 10, 1))


과정 3) 랜덤 배정받은 숫자 4개 중복 체크

이제 4개의 숫자를 랜덤으로 할당하였다. 하지만 4개의 숫자들은 서로 같으면 안된다. 그렇다면 서로의 숫자를 비교하여 같으면 다시 랜덤으로 숫자를 주어야 할 것이다. 본인은 4개의 숫자를 중복없이 배정하기 위해 while 문을 사용할 것이다.

While 문의 기본 구조

while [조건문]:
   [수행부분]

이런식으로 구성이 되어있다.

  • while 반복문은 [조건문]이 참(True)인 경우 내부의 수행 부분을 진행하고, [조건문]이 거짓(False)인 경우 while문을 빠져나간다.
  • while 문의 조건문 끝에는 꼭 클론(;)을 붙여야 한다.
  • while 반복문의 [수행부분]은 들여쓰기를 통해 구분을 해야한다.
  • while 반복문은 중첩해서 사용이 가능하다.

While 문의 사용 방법

1부터 100까지 수 중에서 홀수만 더한다고 했을때 아래와 같이 while 문을 사용할 수 있다

i = 0
result_even = 0

while i < 100:
    i  = i + 1
    if i % 2 == 0:
        result_even = result_even + i

이런식으로 while 문을 사용하게 되면 i가 0부터 하나씩 더해지면서 99가 될때 까지는 while 의 조건문이 True 가 되어서 아래 수행 부분을 수행하게 된다.

그러다가 i가 5번째 줄에서 1이 더해져서 100이 되고, 6, 7번째 코드를 수행하고 다시 4번 라인으로 왔을 때 while의 조건문이 False 가 되면서 while 문을 나오게 된다.

간단히 while 문 사용법을 알아봤으니 이제 코드에 녹여보자.

while(correct_number[0] == correct_number[1]):
    correct_number[1] = str(random.randrange(1, 10, 1))
    
while(correct_number[0] == correct_number[2] or correct_number[1] == correct_number[2]):
    correct_number[2] = str(random.randrange(1, 10, 1)`

while(correct_number[0] == correct_number[3] or correct_number[1] == correct_number[3] or xorrect_number[2] == correct_number[3]):
    correct_number[3] = str(random.randrange(1, 10, 1))

correct_number[0]correct_number[1]이 같다면 correct_number[1]에 다시 랜덤 숫자를 배정한다. 만약 랜덤으로 배정받은 숫자가 또 같다면 그 과정을 계속 반복하고, 다르다면 while 문을 탈출한다.


과정 4) 플레이어 숫자 입력받아 비교하기

이제 컴퓨터가 랜덤 숫자를 생성했으니 플레이어에게 숫자를 입력받아 비교를 해야한다. 그래서 자리와 숫자가 같다면 strike, 자리는 다르지만 숫자가 있다면 ball 을 추가해야 한다.

try_number = 0
strike_number = 0
ball_number = 0

print("숫자여구를 시작합니다.")
print("---------------------")

while(strike_number < 4):
    number =  str(input("숫자 4자리를 입력하세요: "))
    
    strike_number = 0
    ball_number = 0
    
    for i in range(0, 4):
        for j in range(0, 4):
            if(number[i] == str(correct_number[j]) and i == j):
                strike_number += 1
            elif(number[i] == str(correct_number[j]) and i != j):
                 ball_number += 1
    print("결과: [",strike_number,"]스트라이크 [",ball_number,"]볼")
    try_number += 1

과정 5) 마무리

이제 모든걸 완성하였다. 게임이 끝난 후 처리 과정만 추가하면 된다.

print("------------------------"
print("축하합니다! 정답입니다!")
print("[",try_number,"]번 만에 맞췄습니다")

전체 코드 및 리뷰

print("숫자야구 게임에 오신 여러분 환영합니다.")

import random #파이썬 랜덤 모듈
correct_number = ["0", "0", "0", "0"] #파이썬에서 input() 함수의 사용자 입력은 문자열이므로 "0" 문자열로 배열
correct_number[0] = str(random.randrange(1, 10, 1))
correct_number[1] = correct_number[0]
correct_number[2] = correct_number[0]
correct_number[3] = correct_number[0]

# 랜덤 숫자가 같다면 계속 반복
while(correct_number[0] == correct_number[1]):
    correct_number[1] = str(random.randrange(1, 10, 1))
while(correct_number[0] == correct_number[2] or correct_number[1] == correct_number[2]):
    correct_number[2] = str(random.randrange(1, 10, 1))
while(correct_number[0] == correct_number[3] or correct_number[1] == correct_number[3] or correct_number[2] == correct_number[3]):
    correct_number[3] = str(random.randrange(1, 10, 1))

print(correct_number)

try_number = 0
strike_number = 0
ball_number = 0

print("숫자야구를 시작합니다.")
print("--------------------------")
while (strike_number < 4):

    number = str(input("숫자 4자리를 입력하세요: "))

    strike_number = 0
    ball_number = 0

    for i in range(0, 4): # i 값의 범위 0~3
        for j in range(0, 4):
            if(number[i] == str(correct_number[j]) and i == j):
                strike_number += 1
            elif(number[i] == str(correct_number[j]) and i != j):
                ball_number += 1
    print("결과: [",strike_number,"]스트라이크 [",ball_number,"]볼")
    try_number += 1

print("--------------------------")
print("축하합니다! 정답입니다!")
print("[",try_number,"]번 만에 맞췄습니다")

프로그래밍을 배우고 처음으로 해본 게임 만들기이다. 비교적 할만했지만 중간에 헷갈린적도 많다.

이번엔 Python 이라는 언어를 사용하여 만들어 보았지만 좀 더 규모가 큰 프로젝트를 하게 된다면 Python 언어를 사용하지 않을것 같다. 직관적이라 편하고 틀도 다른 언어에 비해 자유롭지만 프로젝트를 하기에는 좀 많이 헷갈린다고 해야하나?

여튼 차라리 틀과 규칙이 자유롭지 않은 언어가 프로젝트를 진행하기에는 더 나은것 같다.

profile
With passion and honesty

0개의 댓글