일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- socket io
- 카톡
- Class
- flask
- pandas
- docker
- 튜플
- Props
- 파이썬
- EC2
- S3
- 중급파이썬
- node
- RDS
- SSA
- lambda
- SAA
- 채팅
- MongoDB
- git
- wetube
- Vue
- merge
- AWS
- crud
- async
- react
- NeXT
- dict
- TypeScript
- Today
- Total
초보 개발자
첫 개인과제 up_and_down 본문
과제는 1단계, 2단계로 나뉘었다.
먼저 1단계에서는 컴퓨터가 1부터 ~ 100까지 임의의 숫자를 정하고 5번안에 맞춰나가는 게임이다.
#1단계
import random
# 1이상 101미만의 숫자가 나옴 (1 ~ 100)
random_num = random.randrange(1,101)
for i in range(5):
# 마지막 기회 알림
if (i == 4):
print('마지막 기회입니다.')
#유효한 숫자를 적도록 유도
while True:
my_num = int(input('숫자를 입력하세요 : '))
if 0 <= my_num <= 100:
break
print('1부터 100사이 숫자만 입력해주세요')
#up and down 조건
if random_num > my_num:
print('업')
elif random_num < my_num:
print('다운')
else:
print('정답 !')
break
#for에서 break가 실행되지 않으면 else로 빠진다. 게임에서 지면 나오는 문장
else:
print(f'게임에서 지셨습니다. 정답은 {random_num}이었습니다.')
dㅇ먼저 임의의 숫자를 구하기 위해 random.randrange를사용하였다. 이를통해 random_num에는 1부터 100까지의 숫자중 하나가 들어와 잇을 것이다.
for 문을 보면 i 가 4일 경우 즉 마지막일 기회일 경우 이를 알려주는 if문을 만들었다.
while문을 통해서 숫자가 제대로 입력이 되었는지를 확인한다. 다만 문자열로 입력을 하는 경우에는
ValueError: invalid literal for int()가 발생한다. 이 부분은 try except를 활용해야 하는건가?
그 이후 내가 입력한 값과 컴퓨터의 초기값을 비교하여 초기값이 크다면 '업'을 출력하고 반대로 작다면
'다운'을 출력하여 유추할 수 있도록 하였다. else문은 크지도, 작지도 않은 경우 즉 일치하는 경우에는 정답을 출력하도록 하였고 for문을 탈출하도록 break를 걸었다.
마지막으로 for에서 break로 탈출하지 않으면 else문으로 빠져서 게임에서 패배하셨습니다. 라는 문구를 출력하도록 하였다.
다음은 2단계이다.
이건 반대로 내가 초기값을 설정하고 컴퓨터가 맞추는 식이다.
import random
up_and_down_list = ['업','다운']
#초기값 설정 1~100
from_computer = random.randrange(1,101)
#컴퓨터가 말한 값을 저장하기 위한 딕셔너리
computer_dict = {'min':1,'now':from_computer,'max':100}
#숫자 유효성 검사
while True:
my_num = int(input('숫자를 입력하세요 : '))
if 0 <= my_num <= 100:
break
print('1부터 100사이 숫자만 입력해주세요')
while True:
#컴퓨터가 정답을 입력
print('컴퓨터 :',computer_dict['now'])
if computer_dict['now'] == my_num:
print('정답 !')
break
while True:
# 업 다운 입력
up_or_down = input('업 or 다운 : ')
# 오타 확인
if up_or_down not in up_and_down_list:
print('입력 가능 값 : 업 or 다운')
continue
# 거짓말 확인
if my_num > computer_dict['now'] and up_or_down == '다운':
print('다시 입력해주세요')
continue
elif my_num < computer_dict['now'] and up_or_down == '업':
print('다시 입력해주세요')
continue
break
#업, 다운 각각의 경우에 min,max를 바꿔줌
if up_or_down == '업':
computer_dict['min'] = computer_dict['now']
elif up_or_down == '다운':
computer_dict['max'] = computer_dict['now']
# (min,max) / 2 의 값을 반올림하여 now로 바꿔줌
computer_dict['now'] = round((computer_dict['min'] + computer_dict['max']) / 2)
업, 다운에 오타가 없는지 확인하기 위한 up_and_down_list를 만들었다.
from_computer라는 변수에 50으로 넣으면 재미없으니까 1~100사이 숫자를 램덤으로 넣었다.
이 문제의 조건 중 컴퓨터는 플레이어가 정한 수를 가장 빨리 맞힐 수 있도록 수를 말한다라는 조건이 있다.
보통 업 & 다운 게임을 할때 반으로 나누어 가는 것이 국룰아닌가? 따라서 이 방법이 제일 빠르지 않을까 라는 생각을하였고, 게임은 제일 작은수는 1, 제일 큰 수는 100으로 정해져있으니 첫 초기값으로 min = 0, max = 100으로 저장해두고 now에는 from_computer를 넣어 컴퓨터가 정답을 유추해 나가기 위한 dictionary를 만들었다.
첫 while문은 1부터 100사이 숫자를 잘 적었는지 유효성을 확인하기 위한 것이다.
두 번째 while문 부터 실제 게임이 시작이 된다. 먼저 컴퓨터는 초기값을 외치고 그것이 정답인지 아닌지 확인을 한다.
정답이라면 break로 while문을 탈출하고 게임을 끝내고 아니라면 계속 진행한다.
업, 다운 이외의 다른 문자열이 온다면 다시 입력하도록 새로운 while문을 만들었다.
그리고 내가 잘못적은 경우 즉 다운을 적어야 하는데 업을 적은 경우에는 다시 입력하도록 if문을 넣어주었다.
이 유효성 검사를 잘 통과한다면 두번째 while문을 break로 나올 것이다.
'업'인 경우에는 컴퓨터가 말한 값보다 내가 정한 값이 크다는 이야기이니까 dict['min']에 dict['now']을 넣어주고
'다운'인 경우에도 마찬가지로 컴퓨터가 말한 값보다 내가 정한 값이 작다는 이야기이니까 이번에는 dict['max']에 컴퓨터의 dict['now']을 넣어주었다.
dict['max']와 dict[min']의 값을 2로 나눈 뒤 소수로 나올 수 있으므로 round함수를 통해 반올림시킨 값을
dict['now']에 입력해주었다.
일련의 과정을 내가 처음 초기값을 75라고 설정하였다고 가정하고 적어보겠다.
1 25 100
컴퓨터 : 25(컴퓨터가 랜덤으로 정한 값)
나 : 업!
(25 + 100) / 2 = 63
25 63 100
컴퓨터 : 63
나 : 업!
(63 + 100) / 2 = 82
63 82 100
컴퓨터 82 !
나 : 다운!
(63 + 82) / 2 = 73
63 73 82
컴퓨터 73!
나 : 업 !
(73 + 82) / 2 = 78
73 78 82
컴퓨터 78!
나 : 다운!
(73 + 78) / 2 = 76
73 76 78
컴퓨터 76!
나: 다운!
(73 + 76) / 2 = 75
73 75 76
컴퓨터 75!
정답!
'AI 웹개발 트랙 - 내배캠 > 2주차' 카테고리의 다른 글
5번째 과제 인스타 화면 구현 및 튜터님 코드 분석 1 (0) | 2021.12.24 |
---|---|
네 번째 과제 카카오톡 프로필 구현 그리고 반응형 웹 ( %, vw, vh, em, rem) (0) | 2021.12.23 |
세 번째 개인 과제 고블린 사냥 (0) | 2021.12.21 |
두 번째 개인 과제 베스킨 라빈스 31 게임 (0) | 2021.12.21 |
2주차 링크드리스트 (0) | 2021.12.20 |