2023.03.30(알고리즘강의, 팀과제 마무리)

Vinyl Stage·2023년 3월 30일
0

개발일지

목록 보기
20/42

투데이 아이 런ㄷ

스택/큐 정렬

스택과 큐는 주로 사용되는 선형 자료 구조이다.

스택 : 후입선출

큐 : 선입선출

정렬의 개념

데이터를 정해진 기준에 따라 재배치하는 것

대표적으로

-버블 정렬 : 요소를 쭉 순회하며 인접한 요소와 비교하고 정렬이 될때까지 인접한 요소와 바꿔치기하는 방법
 시간복잡도 : O(n^2)
-선택 정렬 : 요소들 중 최솟값을 찾아 맨 처음 값으로 대체하는식으로 반복하는 방법
 시간복잡도 : O(n^2)
-삽입 정렬 : 앞에서부터 차례대로 비교하여, 자신의 위치를 찾아 삽입하는 방식
 시간복잡도 : O(n^2)
-퀵 정렬 : 분할정복알고리즘의 일종으로,
		  1. 임의의 하나의 요소를 고른다(pivot)
          2. 피봇의 좌, 우를 기준으로 정렬한다.
          3.분할된 두 개의 작은 배열에 대해 재귀적으로 이 과정을 반복
 시간복잡도 : O(nlogn)

Python에서 사용되는 내장함수인 sorted()와 .sort()가 있는데 이 둘의 차이는 배열의 값을 아예 바꾸느냐 아니냐의 차이다.

대문자는 소문자로, 소문자는 대문자로
swapcase()

이 함수는 소문자와 대문자를 서로 바꿔주는 함수이다.

모두 대문자로 바꾸는 upper()이나 소문자로 바꾸는 lower()이 있지만 일일이 문자열을 찢어서 바꿀수 없기 때문에 좋다.

a = 'aadDdDk'
print(a.swapcase()) #AADdDdK

re.findall

이거슨 정규표현식 모듈인 re에 속한 함수로 문자열에서 정규표현식 패턴과 일치하는 모든 부분을 찾아 리스트로 반환한다.

import re

result = re.findall(pattern, string, flags=0)

pattern: 문자열에서 찾고자 하는 정규 표현식 패턴
string: 검색 대상 문자
flags(옵션): 정규 표현식에서 사용할 수 있는 추가적인 플래그

my_string = "hi12392"

print([int(n) for n in sorted(re.findall(r'\d', my_string))])

# [1, 2, 2, 3, 9]

이건 문자열에서 모든 숫자를 추출한 후 오름차순으로 정렬하여 정수형 리스트로 뱉는 코드이다.

re.findall함수를 사용하여 모든 숫자를 찾는다.r'\d'는 숫자를 찾는 정규표현식 패턴이다.
찾은 뒤 리스트로 반환하는데 이를 sorted()을 사용해 오름차순으로 정렬한 뒤 리스트컴프리헨션으로 리스트로 반환하고 int(n)으로 각 숫자 문자열을 정수로 반환한다.


그리고 팀과제 마무리

우여곡절이 있었지만 포기할것을 포기하고 더 다듬어 나간결과 마무리는 나쁘지 않은듯 싶다.

가장 짜증났던것은 __init__
이놈을 처음에 부모클래스에서 받는데 필요한 인자들만 골라서 받고 super()__init__로 초기화를 시켜줬더니 super에서 자꾸 오류가 생긴것이다.

왜 그런지는 아직도 잘 모르겠다. 좀더 알아봐야겠다.
아무튼 그래서 모든 인자들을 써주고 필요없는 값들을 0으로 했다.

character = [PEteacher('술을 마시지 못하지만 항상 얼굴이 빨갛게 달아올라 술고래로 오해받는 체육선생님', 1100, 0, 0, 170, 0, 200, 0.15, 60, 0, 0, 1, 0),
             AgentP('구청에서 메이플거래하다가 사기당하고 전재산 날려먹은 공익근무요원', 1200,
                    0, 100, 150,	0, 180, 0.1, 20, 10, 0, 1, 0),
             Barista('낮에는 바리스타, 밤에는 발이STAR인 커피를 잘 못만드는 바리스타',
                     1000, 0, 0, 150, 0, 150, 0.1, 30, 0, 0, 1, 0),
             KnowledgeYoutuber('평소에 공부를 하지 않았지만 인터넷에서 줏어들은 정보로만 채널을 운영하는 지식유튜버',
                               900, 0, 100, 150, 0, 140, 0.12, 25, 10, 0, 1, 0),
             Teacher('학교가 너무 가기싫어서 일도 대충하는 이세계학교의 담임선생님', 1000,
                     0, 100, 150, 0, 150, 0.1, 20, 10, 0, 1, 0),
             HandsomeThief('얼굴이 정말 잘생겼지만 손버릇이 좋지않아 여자들에게 퇴짜를 맞는 좀도둑',
                           899, 0, 100, 150, 0, 120, 0.3, 20, 10, 0, 1, 0)
             ]

이렇게 담고

def fight1(a):
    while (character[0].hp > 0 or character[1].hp > 0 or character[2].hp > 0 or character[3].hp > 0) and a.hp > 0:
        for player in character:
            if player.hp > 0:
                player.attack(a)
            else:
                pass
        a.status_check()
        if a.hp > 0:
            a.attack(zombie_attack(character))
        for i in range(4):
            levelup(character[i])
            check(character[i])

전투함수를 만들어줬다.

여기서의 attack()은 각각 캐릭터와 몬스터의 부모클래서에 넣어둔 함수이다.

처음에 실행하면 이 6개의 캐릭터중 2개를 버려서 del로 리스트에서 삭자하는 형식으로 하였으나 여기서 문제가 발생하였다.

N대N전투를 구현하려 했으나 N대1로만 구현한 큰 이유다

원래의도는 각각 대상을 선택하고 스킬을 선택하는 구도였는데 이걸 for문으로 정렬하지 않으면 character.hp 이런식으로 인자들을 불러올수가 없기 때문에 상당히 애를먹고 사망할시에 순서가 재정렬되는데 기본 캐릭터수를 선택하였으나 정렬로 불러오는 식에서 문제가 생겨 포기하였다.
뭔가 뭔가 문제가 많아서 다 생각나지가 않는다ㅠ

이 구현에 있어서 문제 외에는 대부분 오타였으며 그로인한 Attribute, Type, Value에러가 생겼다.

지금은 잘 작동한다.

def character_level(self):
        self.exp += 50
        if self.exp % 100 == 0:
            self.level += 1
            self.hp += 30
            self.atk += 30
            self.def_ += 30

이 함수와

def levelup(a):
    if a.hp > 0:
        a.character_level()

이 함수로 짬뽕해서 fight()함수내에 레벨업을 하고 상태체크를 한다.

총 10스테이로 구성되어있으며 5, 10스테이지에는 보스가있고
5스테이지에는 새로운 캐릭터가 추가된다.

이는

character.append(TraffiselfPolice('이세계 마법사였지만 마법세계에서 퇴출을 당하고 마법부에 쫓기고 있는 교통경찰',
                                          1000, 150, 0, 120, 200, 150, 0.15, 20, 0, 15, 1, 0))

이와같이 append()로 캐릭터가 담겨있는 리스트에 추가하여 불러왔다.

이거 붙잡느라고 고생많았다.
시간이 남으면 코드정리와 최적화를 시도해 봐야겠다.

https://github.com/jisukim908/zombie_game

profile
Life is Art

0개의 댓글