나른한 코딩 생활

[5일차] ABC 부트캠프 Python 기초 4 & 미니 프로젝트 본문

ABC 부트캠프

[5일차] ABC 부트캠프 Python 기초 4 & 미니 프로젝트

GerHerMo 2024. 6. 28. 16:42

오전에는 기초적인 함수 부분의 마무리를 하고

 

오후에는 미니 프로젝트를 해보는 것으로 장황했던 1주차 python 기초를 마무리 할 것이다.

 


Python 내장함수 

 

Python 자체에는 내장되어 있는 함수가 여럿 존재하는데 그 중 일부만 알아보도록 하자

# enumerate
## enumerate는 ‘열거하다’라는 뜻이다. 이 함수는 순서가 있는 데이터(리스트, 튜플, 문자열)를 입력
## 받아 인덱스 값을 포함하는 enumerate 객체를 리턴
for i, name in enumerate(['Yong', 'Jung', 'Bu']):
    print(i, name)
    
# 0 Yong
# 1 Jung
# 2 Bu
# id() 객체의 주소값을 반환한다
x = 10
id(x) # 164636264 # 해당 값은 컴파일 시점에 결정
#filter(func(), iterable)
## 해당 함수는 말 그대로 함수 fun()를 통해 iterable의 데이터를 걸러낸다
def filter_a(x):
    return x % 2 == 0
    
for i in filter(filter_a,[1,2,3,4,5]):
    print(i)
    
# 2
# 4
#zip
## zip(iterable) 함수는 동일한 개수로 이루어진 데이터들을 묶어서 반환함
list(zip([1, 2], [4, 5]))				
#[(1, 3), (2, 4)]
list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))		
#[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
list(zip("abc", "def"))					
#[('a', 'd'), ('b', 'e'), ('c', 'f')]

Python 표준 라이브러리

Python을 사용하면 기본적으로 설치되어 있는 (pip) 함수들을 알아보자

해당 함수들은 import 과정을 통해 사용할 수 있다.

import datatime
# 날짜와 관련된 기능
import math
# 수학연산 관련 기능 
import random
# 랜덤한 숫자 즉, 난수 설정
import glob
# 디렉토리 파일 리스트 조회

 


마지막으로 오늘 그리고 4일간의 기초 Python 교육의 총정리 형태로

파이썬 베이스볼 게임 만들기

미니 프로젝트를 진행해보았다.

 

먼저 베이스볼 게임의 룰과 제약사항 등은 다음과 같다

  • 임의의 3자리 숫자 생성, ( 0~9 ) 까지의 서로 다른 숫자
  • 사용자가 3자리 숫자 입력
  • 숫자와 자리가 같으면 스트라이크 / 숫자만 맞고 자리가 틀리면 볼
  • 결과로서 스트라이크와 볼의 개수를 사용자에게 알려준
  • 숫자를 모두 맞추면 게임을 종료하고, 재시작 여부를 물음

먼저 나는 random 함수를 반복 비교 하여 3가지의 다른 숫자를 가진 str_ballnum 변수를 만들었다.

str_ballnum = '' # 랜덤 숫자를 저장할 새로운 빈 문자열 생성

# 숫자 생성 후 검토, 이상 없을 시 랜덤숫자 return
def BallNumber():
    first_num = random.randint(0,9)
    second_num = random.randint(0,9)
    third_num = random.randint(0,9) 
    while first_num == second_num or second_num == third_num or first_num == third_num:
        if(first_num == second_num):
            second_num = random.randint(0,9)
        if(second_num == third_num or first_num == third_num):
            third_num = random.randint(0,9)
    if(first_num != second_num and second_num != third_num and third_num != first_num):
        str_ballnum = str(first_num) + str(second_num) + str(third_num)
    return str_ballnum

 

해당 코드는 first_num 이라는 첫번째 숫자를 생성한다.

이후 해당 숫자를 second_num, third_num 으로 생성한 랜덤 숫자와 같다면 다시 설정한다

이후 first / second / third 숫자를 문자열로 결합하여 str_ballnum을 return 한다

 

다음으로는 조건에 맞는 숫자를 받기 위한 함 Judge_able(str_input, str_ballnum) 을 생성했다.

# 숫자 조건 판단후 CompareStringNum 실행
def Judge_able(str_input,str_ballnum):
    global statement
    global Contin
    while statement != 5:
        if len(str_input) == 3 and str_input[0] != str_input[1] and 
        str_input[1] != str_input[2] and str_input[2] != str_input[0]:
            CompareStringNum(str_input,str_ballnum)
        else :
            print("조건대로 입력해주세요")
        if statement != 5:
            str_input = input("다음 숫자 : ")
        else :
            break
    if (input("다시하려면 0을 누르세요")=='0'):
        statement = 0
    else :
        Contin = False

 

먼저 statement 와 Contin 이라는 변수를 전역변수로 설정한다.

해당 변수들은 각각 게임의 종료 여부와 게임 재실행 여부를 결정하는 int / boolean 타입의 변수이다.

 

statement ==5 일 경우 한 게임이 끝났다(숫자를 맞춤)

Contin  == False 일 경우 더 이상 추가게임을 하지 않겠다(main에서의 while문 종료)

 

이후 작성할 CompareStringNum 함수를 while 문 안에서 작동시켜 게임을 실행시킨다

그 전에 사용자가 입력한 숫자가 조건을 만족하지 않을 시 

첫번째 else 문을 실행해 ComapreStringNum함수를 작동시키지 않는다

또한 게임을 새로 재시작을 원하면 '0'값을 입력받고

이 외의 경우에는 Contin 값을 False로 설정하여 게임을 완전 종료 시킨다

 

마지막으로 CompareStringNum(str_input, str_ballnum) 함수이다

# 숫자 비교 후 힌트 출력 
def CompareStringNum(str_input,str_ballnum) : 
    int_strike = 0
    int_ball = 0
    global statement
    # 전체 글자 비교 ( 홈런 or 아웃 )
    if sorted(str_input) == sorted(str_ballnum): # ball + strike == 3
        for i in range(0,3):
            if str_ballnum[i] == str_input[i] :
                int_strike +=1 
                # global로 설정 안할시, statement 값이 함수 외부에서 변하지 않는다
            else :
                int_ball += 1
        if int_ball == 3 :   # 3 ball 
            statement = 3
            print("3ball")
        elif int_strike == 3: # 3 strike = homerun
            statement = 5
            print("HomeRun! You win!")
        elif int_ball == 1 and int_strike == 2 : # 1 ball 2 strike
            statement = -2 # 불가능한 수 
        else :  # 2 ball 1 strike
            statement = -1
            print("2ball 1strike")
    else : # ball + strike != 3
        for i in range(0,3):
            if str_ballnum[i] == str_input[i]:
                int_strike += 1
            elif str_ballnum[i] != str_input[i] and 
            (str_ballnum[i] == str_input[i-1] or str_ballnum[i] == str_input[i-2]):
                int_ball += 1
        if int_ball == 1 and int_strike == 1 : # 1 ball 1 strike
            statement = -3
            print("1ball 1strike")
        elif int_ball == 1 and int_strike == 0 : # 1 ball
            statemnet = 1
            print("1ball")
        elif int_ball == 2 and int_strike == 0 : # 2 ball
            statement = 2
            print("2ball")
        elif int_strike == 1 and int_ball == 0 : # 1 strike
            statement = -4
            print("1strike")
        elif int_strike == 2 and int_ball == 0 : # 2 strike 
            statement = -5 
            print("2strike")
        elif int_strike == 0 and int_ball == 0 : # out
            statement = 3
            print("Out!")

 

해당 코드문을 처음 작성할 당시 생각으로는 statement의 값을 match문에 할당해 print 함수를 실행할 예정이였으나,

 

statement 변수가 5(종료)일때를 제외하면 사용되어지지 않는 프로젝트이기에 statement 값이 0,5 이외에는 필요X

따라서 statement 는 삭제해도 상관 없어졌다

 

해당 식을 가동할 main문을 다음과 같이 작성했다

# main
Contin = True
while Contin:
    ran_num = BallNumber() 
    # 확인용 랜덤 숫자
    print(ran_num)
    inputnum = input("중복된 숫자 없는 3자리 숫자를 입력하세요 : ")
    Judge_able(inputnum,ran_num)

print('-----')

 

Contin 값이 True 일 경우 새로운 게임을 계속 재실행 할 수 있도록 설정하며,

Judge_able 함수에서 Contin 값이 False로 설정되면 이 코드는 마지막 print 문 시행 후 종료한다

 

다음은 코드의 완성본이다

# 완성본 // statement 변수는 사실상 필요없음
import random

str_ballnum = ''
statement = 0 
# 1 ball = 1 / 2 ball = 2 / 3 ball = 3 / out = 4 / homerun = 5
# 2 ball 1 strike  = -1 / 1 ball 2 strike = -2 불가능  / 1 ball 1 strike = -3
# 1 strike = -4 / 2 strike = -5 을 구분 짓는 변수 
### 이후 과정에서 거의 필요 없어짐

# 숫자 생성 후 검토 
def BallNumber():
    first_num = random.randint(0,9)
    second_num = random.randint(0,9)
    third_num = random.randint(0,9) 
    while first_num == second_num or second_num == third_num or first_num == third_num:
        if(first_num == second_num):
            second_num = random.randint(0,9)
        if(second_num == third_num or first_num == third_num):
            third_num = random.randint(0,9)
    if(first_num != second_num and second_num != third_num and third_num != first_num):
        str_ballnum = str(first_num) + str(second_num) + str(third_num)
    return str_ballnum
    
# 숫자 조건 판단후 CompareStringNum 실행
def Judge_able(str_input,str_ballnum):
    global statement
    global Contin
    while statement != 5:
        if len(str_input) == 3 and str_input[0] != str_input[1] and str_input[1] != str_input[2] and str_input[2] != str_input[0]:
            CompareStringNum(str_input,str_ballnum)
        else :
            print("조건대로 입력해주세요")
        if statement != 5:
            str_input = input("다음 숫자 : ")
        else :
            break
    if (input("다시하려면 0을 누르세요")=='0'):
        statement = 0
    else :
        Contin = False

# 숫자 비교 후 힌트 출력 
def CompareStringNum(str_input,str_ballnum) : 
    int_strike = 0
    int_ball = 0
    global statement
    # 전체 글자 비교 ( 홈런 or 아웃 )
    if sorted(str_input) == sorted(str_ballnum): # ball + strike == 3
        for i in range(0,3):
            if str_ballnum[i] == str_input[i] :
                int_strike +=1
            else :
                int_ball += 1
        if int_ball == 3 :   # 3 ball 
            print("3ball")
        elif int_strike == 3: # 3 strike = homerun
            print("HomeRun! You win!")
        elif int_ball == 1 and int_strike == 2 : # 1 ball 2 strike
            statement = -2 # 불가능한 수 
        else :  # 2 ball 1 strike

            print("2ball 1strike")
    else : # ball + strike != 3
        for i in range(0,3):
            if str_ballnum[i] == str_input[i]:
                int_strike += 1
            elif str_ballnum[i] != str_input[i] and (str_ballnum[i] == str_input[i-1] or str_ballnum[i] == str_input[i-2]):
                int_ball += 1
        if int_ball == 1 and int_strike == 1 : # 1 ball 1 strike
            print("1ball 1strike")
        elif int_ball == 1 and int_strike == 0 : # 1 ball
            print("1ball")
        elif int_ball == 2 and int_strike == 0 : # 2 ball
            print("2ball")
        elif int_strike == 1 and int_ball == 0 : # 1 strike
            print("1strike")
        elif int_strike == 2 and int_ball == 0 : # 2 strike 
            print("2strike")
        elif int_strike == 0 and int_ball == 0 : # out
            print("Out!")
        
# main
Contin = True
while Contin:
    ran_num = BallNumber() 
    # 확인용 랜덤 숫자
    print(ran_num)
    inputnum = input("중복된 숫자 없는 3자리 숫자를 입력하세요 : ")
    Judge_able(inputnum,ran_num)

print('-----')

 

이렇게 장황했던 ABC 부트캠프의 1주차가 끝이 났다.

python은 이미 한 두번 기초를 경험해 보았으나 아직도 부족하다고 느끼는 점이 많다

 

미니 프로젝트 도중에도 모르거나 헷갈리는 부분이 있었으니...

기반을 다지는 것은 중요하다

 

다음주에도 Python 프로그래밍을 공부하겠지만 새로운 강사님과 함께

더욱 심화된 내용을 공부하게 될 것이다

 

오늘의 포스트는 여기서 끝내겠다!