Curriculum/AI웹개발자_내일배움캠프

Story 3. 캠프 2주차 주간회고록 (WIL)

작은코딩 2021. 12. 26. 23:51

시작에 앞서 저번 주 목표였던 타임어택 구현 테스트를 리뷰하지 못했다. 반성하자,,

변명이 아니라 이번 주는 정말 시간이 없었다,,

월~수요일은 파이썬 과제, 목~월요일은 html, css과제를 위해 공부하고 구현하느라 매일 시간을 갈아넣는 일상의 반복이었다. 

 

분명 임시저장을 해놨는데 작성중이던 글이 날아갔다. 다음부턴 그냥 비공개 작성을 해두면서 수정을 하자.

2시간 분량의 자료가 날아갔기에 시간 절약을 위해 이번 주에 했던 과제와 코드, 느낀점을 간략하게 적고 넘어가자.

 


 

1. 월~수요일 파이썬 과제


UP & DOWN 게임 / 베스킨라빈스 31 게임 / 턴제 rpg 게임


- UP & DOWN 게임

1부터 100까지의 수를 컴퓨터가 랜덤으로 정하고 플레이어가 숫자를 입력하면 up or down으로 범위를 알려주어 맞추는 게임이며 기회는 5번으로 구현하였다.

 

(코드를 보려면 더보기를 클릭!)

더보기
더보기
from random import *

random_num = randrange(1, 101)
print('GAME START')
# print(random_num)

for i in range(1, 6):
    input_num = int(input('1 to 100: '))
    if input_num <= 100:
        if random_num > input_num:
            print("up")
        elif random_num < input_num:
            print('down')
        else:
            print('YOU WIN!')
            break
    else:
        print('please input again')
else:
    print('YOU LOST')
    print(f'Answer : {random_num}')

 

업다운게임 ai는 최솟값과 최댓값 업데이트를 통해 범위를 줄여나가도록 구현했다. list를 이용하여 소거하는 방법도 괜찮은 방법이다.

 

(코드를 보려면 더보기를 클릭!)

더보기
더보기
print('GAME START')
min = 0
max = 100
count = 1
computer_num = 0

input_num = int(input('1 to 100: '))
while input_num not in range(min, max+1):
    input_num = int(input('please input again: '))

while input_num != computer_num:
    computer_num = round(min + ((max-min)/2))
    print(computer_num)

    if input_num == computer_num:
        print(f'Success tyr num:{count}')
        break

    input_updown = input('up & down: ')

    while (input_updown == 'down' and computer_num < input_num) or (input_updown == 'up' and input_num < computer_num):
        input_updown = input('pleas input again: ')

    if input_updown == 'up':
        count += 1
        min = computer_num
        computer_num = round(min + ((max-min)/2))

    elif input_updown == 'down':
        count += 1
        max = computer_num
        computer_num = round(min + ((max-min)/2))

    else:
        print('please input again: ')
else:
    print(f'{computer_num} Success tyr num:{count}')

 

- 베스킨라빈스 31 게임

 

컴퓨터와 1:1 모드

 

(코드를 보려면 더보기를 클릭!)

더보기
더보기
from random import *
# 시작변수 설정
computer = 0
player1 = 1
game_start = 0
# 게임 플레이 변수
play_num = 0
end_num = 31
play_num_array = 3

# 구상 : 컴퓨터가 선공하는 함수, 플레이어가 선공하는 함수 2개의 함수를 만들어 시작 함수로 진행

# end_num 에서 play_num 를 뺏을 때 play_num_array 보다 작다면 randrange 범위 체인지


def computer_play():
    global play_num, end_num, play_num_array
    print('computer turn')
    sub = end_num - play_num
    if sub < 3:
        c_play_num = randrange(1, sub+1)
        for i in range(1, c_play_num+1):
            print(play_num+i)
    else:
        c_play_num = randrange(1, play_num_array+1)
        for i in range(1, c_play_num+1):
            print(play_num+i)
    play_num += c_play_num


def player_play():
    global play_num,play_num_array

    while True:
        try:
            p_play_num = int(input('player turn: '))
        except:
            p_play_num = 0
    while p_play_num not in range(1, play_num_array+1) or p_play_num + play_num > end_num:
        p_play_num = int(input('please input again: '))
    for i in range(1, p_play_num+1):
        print(play_num+i)
    play_num += p_play_num


def start_game():
    global game_start, computer, player1, play_num, play_num_array, end_num
    print('GAME START')
    game_start = randrange(0, 2)
    if computer == game_start:
        print('computer first')
        while play_num != end_num:
            computer_play()
            if play_num == end_num:
                print('player win')
                break
            player_play()
            if play_num == end_num:
                print('computer win')
                break
    else:
        print('player first')
        while play_num != end_num:
            player_play()
            if play_num == end_num:
                print('computer win')
                break
            computer_play()
            if play_num == end_num:
                print('player win')
                break


start_game()

 

컴퓨터 필승 ai

 

(코드를 보려면 더보기를 클릭!)

더보기
더보기
from random import *
# 시작변수 설정
computer = 0
player1 = 1
game_start = 0
# 게임 플레이 변수
play_num = 0
end_num = 31
play_num_array = 3
# AI를 위한 컴퓨터와 플레이어의 선택 수를 변수에 저장
c_play_num = 0
p_play_num = 0

# 구상 : 컴퓨터가 선공하는 함수, 플레이어가 선공하는 함수 2개의 함수를 만들어 시작 함수로 진행

# end_num 에서 play_num 를 뺏을 때 play_num_array 보다 작다면 randrange 범위 체인지

def computer_play():
    global play_num, end_num, play_num_array, p_play_num, c_play_num
    print('computer turn')
    if play_num == 0:
        c_play_num = 2
        for i in range(1, c_play_num + 1):
            print(play_num + i)
        play_num += c_play_num

    elif play_num == 1:
        c_play_num = 1
        for i in range(1, c_play_num + 1):
            print(play_num + i)
        play_num += c_play_num

    elif play_num == 2 or play_num == 6 or play_num == 10 or play_num == 14 or play_num == 18 or play_num == 22 or play_num == 26 or play_num == 30:
        c_play_num = randrange(1, play_num_array + 1)
        for i in range(1, c_play_num+1):
            print(play_num+i)
        play_num += c_play_num

    elif play_num == end_num - 1:
        c_play_num = 1
        for i in range(1, c_play_num + 1):
            print(play_num + i)
        play_num += c_play_num

    else:
        if (play_num_array + 1) - p_play_num == 3:
            c_play_num = 3
            for i in range(1, c_play_num + 1):
                print(play_num + i)
            play_num += c_play_num

        elif (play_num_array + 1) - p_play_num == 2:
            c_play_num = 2
            for i in range(1, c_play_num + 1):
                print(play_num + i)
            play_num += c_play_num

        else:
            c_play_num = 1
            for i in range(1, c_play_num + 1):
                print(play_num + i)
            play_num += c_play_num


def player_play():
    global play_num, play_num_array, end_num, p_play_num
    p_play_num = int(input('player turn: '))
    while p_play_num not in range(1, play_num_array + 1) or p_play_num + play_num > end_num:
        p_play_num = int(input('please input again: '))
    for i in range(1, p_play_num+1):
        print(play_num+i)
    play_num += p_play_num


def start_game():
    global game_start, computer, player1, play_num, play_num_array, end_num
    print('GAME START')
    game_start = randrange(0, 2)
    if computer == game_start:
        print('computer first')
        while play_num != end_num:
            computer_play()
            if play_num == end_num:
                print('player win')
                break
            player_play()
            if play_num == end_num:
                print('computer win')
                break
    else:
        print('player first')
        while play_num != end_num:
            player_play()
            if play_num == end_num:
                print('computer win')
                break
            computer_play()
            if play_num == end_num:
                print('player win')
                break


start_game()

이 부분은 4로 나누어 나머지를 처리하는 방법이 떠오르지 않아 일일이 변수를 설정하다 보니 컴퓨터가 바보가 되어버렸다.

플레이어가 2를 입력하면 숫자를 두개밖에 말하지 않는다,, (미안하다 컴퓨터야ㅠ 내가 실력이 부족해서,,)

 

 

- 턴제 rpg 게임

 

(코드를 보려면 더보기를 클릭!)

더보기
더보기
from random import randrange
from time import sleep


# 게임 결과를 담은 변수
result = ''


# 부모 클래스 생성(모든 유닛의 공통 속성)
class Unit:
    def __init__(self, name, hp, damage, dead):
        self.name = name
        self.hp = hp
        self.damage = damage
        self.dead = dead

    def attack(self, target):
        if self.dead == False:
            target.hp = target.hp - self.damage
            print(f'{self.name} : {target.name} 공격. {target.name} 남은 체력: {target.hp}')


# 자식 클래스 생성
class Player(Unit):
    def magic(self, target):
        if self.dead == False:
            magic_damage = 50
            target.hp = target.hp - magic_damage
            print(f'{self.name} : {target.name} 마법공격. {target.name} 남은 체력: {target.hp}')


class Monster(Unit):
    def turn_pass(self):
        if self.dead == False:
            print(f'{self.name} : 아무런 행동도 하지 않았다.')
            pass

    def recovery(self):
        if self.dead == False:
            recovery_hp = 10
            self.hp += recovery_hp
            print(f'{self.name} : 자신의 체력을 {recovery_hp}만큼 회복. {self.name} 남은 체력: {self.hp}')


def hp_information(p1, monsters):
    print(f'{p1.name} 현재 체력: {p1.hp}')
    for monster in monsters:
        if monster.hp > 0:
            print(f'{monster.name} 현재 체력: {monster.hp}')


def player_t(p1):
    print('=====================PLAYER TURN======================')
    p_action = input('공격 or 마법: ')
    if p_action == '공격':
        target = input('공격 대상 :')
        for i in range(len(monsters)):
            if target == monsters[i].name:
                target = monsters[i]
        p1.attack(target)

    elif p_action == '마법':
        target = input('마법공격 대상 :')
        for i in range(len(monsters)):
            if target == monsters[i].name:
                target = monsters[i]
        p1.magic(target)

    else:
        print('잘못된 정보를 입력하여 턴이 종료됩니다.')
    print('=======================TURN END=======================')


def m_dead_c(result):
    count = 0
    for i in range(len(monsters)):
        if monsters[i].dead == False and monsters[i].hp <= 0:
            monsters[i].dead = True
            print(f'{monsters[i].name} 사망')
        if monsters[i].dead == True:
            count += 1
        if count == len(monsters):
            return '승리'


# 오류발생!! monsters list에서 hp가 0이하인 monster를 제거하는 방법
# def m_dead_c(result):
#     for i in range(len(monsters)):
#         if monsters[i].hp <= 0: # for 문을 반복하다 mosters의 list del하면 list길이가 줄어들어 오류가 발생 (클래스 생성시 사망여부 인자 생성하는 방법으로 변경)
#             del monsters[i]
#     if monsters == []:
#         result = '승리'
#         return result


def monster_t(monsters):
    print('====================MONSTERS TURN====================')
    for i in range(len(monsters)):
        m_action = randrange(0, 6)
        if 0 <= m_action <= 2:
            monsters[i].attack(p1)
        elif 3 <= m_action <= 4:
            monsters[i].recovery()
        else:
            monsters[i].turn_pass()
    print('=======================TURN END=======================')


def p_dead_c(result):
    if p1.hp <= 0:
        p1.dead = True
        print(f'{p1.name} 사망')
        return '패배'


# 인스턴스 생성
p1 = Player('전사', 100, 10, False)
m1 = Monster('미니고블린', 10, 10, False)
m2 = Monster('고블린', 30, 30, False)
m3 = Monster('슈퍼고블린', 50, 50, False)


# 몬스터 일괄 관리
monsters = []
monsters.append(m1)
monsters.append(m2)
monsters.append(m3)

print('************************주의사항************************\n\n예외 처리가 되어있지 않으니 오타에 주의하세요.\n\n*******************************************************')
sleep(1)
print('======================GAME START======================')
while True:
    sleep(1)
    hp_information(p1, monsters)
    sleep(1)
    player_t(p1)
    sleep(1)
    result = m_dead_c(result)
    if result == '승리' or result == '패배':
        sleep(1)
        print(result)
        break
    sleep(1)
    monster_t(monsters)
    sleep(1)
    result = p_dead_c(result)
    if result == '승리' or result == '패배':
        sleep(1)
        print(result)
        break

 

턴제 rpg 게임은 클래스를 만들어 플레이어와 몬스터를 생성하고 각각 행동 함수를 넣어 대결하는 게임이다.

클래스와 함수에 대한 이해도만 있다면 생각보다 쉽게 만들 수 있었는데 전역, 지역변수에 대한 개념이 명확하지 않다보니 처음에는 전역변수를 함수 내 global을 이용하는 방법으로 구현하거나, 인자를 받지 않고 값을 리턴해주지 않는(그냥 변수에다 바로 할당하는) 방법을 사용했다. 이게 나중에 필드에서 기피 시 하는 행동이라는 걸 알게 되었는데 전역변수를 로컬에서 건드릴 경우 그 경로가 명확하게 보이지 않으며(나중에 프로젝트가 커질 때 오류 찾기 힘들다) 팀원들과 교류 시 의도가 명확하게 전달되지 않는 등 문제가 있는 행동이었다.

 

앞으로 주의하자! global은 영원히 머릿속에서 지워버리는 걸로,,

 

 


 

2. 목~월요일 html, css 과제


카카오톡 UI clone 구현 / 인스타그램 UI clone (모바일) 구현 / 인스타그램 UI clone (데스크톱) 구현


 

- 카카오톡 UI clone 구현

https://github.com/GoHeeSeok/kakao_ui_clone.git

 

GitHub - GoHeeSeok/kakao_ui_clone: 카카오톡 ui 클론 테스트 입니다.

카카오톡 ui 클론 테스트 입니다. Contribute to GoHeeSeok/kakao_ui_clone development by creating an account on GitHub.

github.com

 

- 인스타그램 UI clone (모바일) 구현 

https://github.com/GoHeeSeok/instargram_uiclone.git

 

GitHub - GoHeeSeok/instargram_uiclone: 인스타그램 UI 클론 제작하기

인스타그램 UI 클론 제작하기. Contribute to GoHeeSeok/instargram_uiclone development by creating an account on GitHub.

github.com

 

 

- 인스타그램 UI clone (데스크톱) 구현

미 구 현 :)

 


 

3. 느낀점

인스타그램 데스크톱 모드는 구현 진행중이다,, 월요일까지 구현을 해야 되는데 가능할지 모르겠다.

일단 스파르타 내일배움캠프에서 제공하는 강의로는 카카오톡ui클론도 구현하기 힘들다.

왜냐? display flex 부분은 그냥 4인방 복붙하라고 배웠는데 이게 뭐하는 녀석인지, 정렬 방법은 뭐가 있는지 알려주지 않았고(처음에 justify 나 aligin은 center만 있는 줄 알았다,,), position에 대한 부분은 배우지도 않았으니,, position absolut 같은걸 쓸 수 있겠나,,

 

그래도 유튜브와 구글링 그리고 우리의 노마드코더 니꼬쌤의 강의를 통해 인스타 모바일용 UI 클론까지는 구현을 했는데 데스크톱 모드는 감이 안잡힌다. (사랑해요 니꼬쌤~ / 노마드 코더 알려준 우리팀 칭찬해~)

미디어 쿼리에 대한 지식도 없고 반응형으로 웹사이트를 제작할 때 html body를 어떻게 구상할지 모르겠다. ㅠ

물론 인터넷에 떠다니는 코드를 복붙해서 제출하면 된다지만 다른 코드를 가져와도 기본적으로 어떻게 사용할지는 머릿속에 있어야 내가 구현하고 싶은 모습이 나온다 생각하기에 지금은 힘들더라도 하나하나 이해하려고 노력 중이다.

(나는 분명 코딩을 배우러 왔는데 복붙만 하고 있으면 엄청난 자괴감이 몰려온다,,)

 

다음 주엔 조가 바뀌며 팀 프로젝트가 진행되는데 최대한 팀에 누가 되지 않게 담주도 파이팅!!

 

 

- 끝 -