2021. 12. 21. 23:57ㆍ개발일지/내일배움캠프 TIL
이번주 토요일이 크리스마스라니...
이렇게 나이를 또 먹는군요.
오늘은 바로 코드에 대한 리뷰를 해볼까합니다.
사실 어제보다 난이도가 있는 프로젝트를 진행했습니다.
바로 배스킨라빈스31 게임을 코딩하는 것입니다.
- 컴퓨터, 플레이어 선공은 랜덤으로 한다.
- 컴퓨터, 플레이어가 턴제로 돌아가며 게임을 진행한다.
- 숫자는 3개를 연속해서 부를 수 있으며 마지막 31을 부르는 사람이 지게 된다.
이러한 문제를 해결하기 위해서 다음과 같이
종이에 내용을 정리해봤습니다.
- Random 모듈을 이용하여 선공과 후공을 정한다.
- 플레이어의 숫자 입력 방식을 정한다.
- 컴퓨터의 숫자 입력 방식을 정한다.
- 마지막 승패 메시지를 표시한다.
다시 세부적으로 어떻게 코딩을 하면 좋을 것인지
생각하며 내용을 정리해봤습니다.
- random.randrange를 사용한다.
a = random.randrange(1, 3)
# 1일 경우 컴퓨터의 선공으로 한다.
if a == 1:
print("상대방 선공입니다.")
# 1이 아닐 경우 플레이어의 선공으로 한다.
else:
print("플레이어 선공입니다.")
- a가 1일 경우(컴퓨터 선공일 경우) random.randint를 사용하여 1~3까지의 수를 랜덤으로 입력해 공격할 수 있도록 한다.
# 초기값 num을 0으로 한다.
num = 0
# 선공과 후공 변수를 생성한다.
attack = random.randrange(1, 100)
# 50 이하일 경우 컴퓨터가 선공하도록 한다.
if attack <= 50:
# cpu 변수를 생성한다.
cpu = list()
# 마지막 수 31에서 초기값을 뺀 remain_num 변수를 생성한다.(이후 컴퓨터 공격에 사용한다.)
remain_num = 31 - num
# 3개까지 랜덤으로 입력가능한 cpu_num 변수를 생성한다.
cpu_num = random.randint(1, 3)
# 반복문을 생성한다.
# cpu_num을 반복할 수 있는 횟수는 3번까지이다. 즉 num에 1 or 2 or 3이 더해질수 있다는 뜻이다.
for value in range(cpu_num):
# num 변수에 1씩 더할 수 있도록 한다.
num += 1
# cpu 변수 list에 저장하도록 한다.
cpu.append(num)
# 값이 나올 경우
if num <= 3:
# fstring을 이용하여 print될 수 있도록 한다.
print(f"상대방 숫자 {num} 이에요.")
# while 문에는 플레이어 공격 방식과 이에 대한 컴퓨터 공격 방식을 적어 반복한다.
while True:
- 플레이어 숫자 입력을 위해 input 함수를 사용한다. 숫자를 모두 입력받게 하면 좋을 것 같다. 숫자 입력 방식을
1,2,3 과 같이 쉼표처리하게 했으면 좋겠다. 따라서 구분자 처리는 split이 좋겠고, 정수형으로 받아야하므로 int 변환이 필요하겠다. 이러한 상황에서 map을 활용하면 어떨까 싶다. 이를 list에 저장하고 변수로 만들어주는 작업이 필요하다.
while True:
player = list(map(int, input("플레이어는 숫자를 입력하세요: ").split(",")))
list( ) 처리를 하게 되면 비어있는 list가 생성된다. 우리는 input 함수를 int형의로 바꾸기 위해 map을 이용했다.
.split은 내일배움캠프 초반에 배웠으니 관련내용을 확인해보자.
그렇다면 이렇게 저장할 수 있는 변수를 컴퓨터에서 어떻게 확인하고 출력할 수 있을까.
(이부분은 혼자서 3시간이 넘게 고민했다. 결국 시간 내에 프로젝트를 제출할 수 없었던 1차 원인이 됐다.)
바로 내일배움캠프에서 배웠던 list의 길이를 알 수 있는
len 함수이다.
플레이어가 1을 적었다면 길이는 1이 될 것이고, 1,2를 적었다면 2가 될 것이다.
이러한 점을 활용하면 플레이어의 숫자 입력을 할 수 있는 코드가 어느정도 완성된다.
- 플레이어 숫자 입력은?
if len(player) == 3:
num = player[2]
elif len(player) == 2:
num = player[1]
elif len(player) == 1:
num = player[0]
이런식으로 작성을 해주면 플레이어가 숫자를 잘 입력하기만 한다면
문제 없이 플레이어의 숫자가 입력될 것이다.
근데 사람은 하라는데로 하기 싫어할 때가 있는 법이다.
또한 사람인지라 실수로 잘못 적을 수도 있는 법이다.
그래서 예외처리를 해주어야 한다.
사람들은 어떤 실수를 해서 위의 코드를 벗어날 수 있을까.
- 숫자를 연속해서 입력하지 않을 가능성이 있겠다.
- 콤마를 적지 않고 입력할 가능성이 있다.
- 글자수를 3초과하여 입력할 수 있다.
player[2] - player[1] != 1 or player[1] - player[0] != 1
세번째 입력 수와 두번째 입력 수의 차이, 두번째 입력 수와 첫번째 입력 수의 차이는 모두 1이 되어야 한다. 그러나 그 차이가 1이 아니라면 그것은 연속된 수를 입력하지 않았다는 뜻이 된다.
예외 처리를 해준다면 사라질 것이라 생각한다.
숫자가 아닌 영어 등을 입력할 때에도 이런 오류가 생기므로
예외처리는 중요한다.
꼭 하라는대로 하지 않는 사람이 있기 때문이다.
그러나,
사실 이부분은 개발자로서 굉장히 중요한 부분이라고 생각한다.
왜냐하면 내가 만든 것을 사용하다가 나의 설명이 부족하여
사용자가 좋지 않은 경험을 할 수 있기 때문이다.
회사의 서비스를 제공하는 중이었다면 그 회사의 이미지에 부정적인 영향을 줄 수 있을 것이다.
이러한 부분을 항상 염두에 두고 정신을 차려 코딩을 진행할 수 있도록 하는 것이 필요하다고 생각했다.
화려한 코딩 실력을 뽐내기 이전에 이런 마인드를 먼저 가질 필요가 있다고 생각한다.
if len(player) > 3:
print("숫자는 3개까지만 입력해주세요.ex)1,2,3")
continue
글자수를 3초과 해서 적으면 오류 메시지를 전달하고 continue 처리를 통해 계속 입력할 수 있도록 한다.
- 실패처리는 num이 31보다 크거나 같을 경우 지는 것으로 한다.
if num >= 31:
print("실패했어요.")
break
플레이어 실패 처리는 이렇다. break로 탈출한다.
if num >= 31:
break
if cpu_num <= remain_num:
print(f"상대방 숫자 {num} 이에요.")
continue
아까 만들었던 remain_num이 cpu_num보다 작거나 같을 경우 for 반복문으로 계속 반복하지만,
num이 31보다 크거나 같을 경우 break로 탈출한다.
- 플레이어의 승리 메시지 출력
if cpu[-1] == 31:
print("플레이어가 승리했어요.")
리스트의 마지막 값을 출력하기 위해서 [-1]처리를 한다. 이 값이 31이라면 플레이어의 승리가 나오도록 한다.
사실 이후 컴퓨터가 필승할 수 있는 ai를 만들었어야 했지만
필승법 공식을 모르는데 코딩을 하기가 난감하여 하지 않았다.
그래서 오늘 만들었던 코드를 복기하는 방법으로 오늘의 코딩 공부를 마무리하면 좋겠다고 생각했다.
오전 9시부터 시작한 코딩은 다음날 오전 2시가 되어서 끝나게 되었다.
때로는 지치고 흔들릴지언정 포기하진 않겠다는 마음가짐으로
오늘 하루도 정말 고생했다고 생각한다.
왜 앞에서 존칭으로 글을 쓰다가 바꿨냐면 그것은....
그것은,,,,,
그냥 내 마음이다.
'개발일지 > 내일배움캠프 TIL' 카테고리의 다른 글
9일차 내일배움캠프 개발일지 (0) | 2021.12.24 |
---|---|
8일차 내일배움캠프 개발일지 (0) | 2021.12.22 |
6일차 내일배움캠프 개발일지 (0) | 2021.12.20 |
5일차 내일배움캠프 개발일지 (0) | 2021.12.18 |
4일차 내일배움캠프 개발일지 (0) | 2021.12.17 |