디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

8계월차의 srpg 코드모바일에서 작성

핼월(58.142) 2025.02.08 22:08:40
조회 115 추천 1 댓글 4

코딩 8계월차가 쓴 코든데 괜찮은지 봐주셈 파이썬 용으로 씀

.import numpy as np


# 맵 크기

MAP_WIDTH = 10

MAP_HEIGHT = 10


# 직업 정의

class Job:

    def __init__(self, name, symbol, hp, attack, defense, range, special):

        self.name = name

        self.symbol = symbol  # 맵에서 표시될 심볼

        self.hp = hp

        self.attack = attack

        self.defense = defense

        self.range = range  # 공격 범위

        self.special = special  # 특수 능력 (예: 힐링, 마법 공격 등)


# 직업 종류

JOBS = {

    "healer": Job("힐러", "H", 50, 5, 3, 2, "heal"),

    "tank": Job("탱커", "T", 100, 10, 10, 1, "shield"),

    "ranged": Job("원거리 딜러", "R", 60, 15, 5, 3, "snipe"),

    "melee": Job("근거리 딜러", "M", 70, 20, 7, 1, "slash"),

    "mage": Job("마법사", "W", 40, 25, 2, 2, "fireball")

}


# 캐릭터 클래스

class Character:

    def __init__(self, name, x, y, job, is_player):

        self.name = name

        self.x = x

        self.y = y

        self.job = job

        self.hp = job.hp

        self.max_hp = job.hp

        self.cooldown = 0  # 쿨타임 변수 추가

        self.is_player = is_player  # 아군인지 적군인지 구분


    def move(self, dx, dy, characters):

        new_x = self.x + dx

        new_y = self.y + dy

        if 0 <= new_x < MAP_WIDTH and 0 <= new_y < MAP_HEIGHT:

            # 이동하려는 위치에 다른 캐릭터가 있는지 확인

            if not any(c.x == new_x and c.y == new_y for c in characters):

                self.x = new_x

                self.y = new_y

                return True

            else:

                print("이동할 수 없는 위치입니다. 다른 캐릭터가 있습니다.")

                return False

        else:

            print("이동할 수 없는 위치입니다.")

            return False


    def take_damage(self, damage):

        damage = max(0, damage - self.job.defense)  # 방어력 적용

        self.hp -= damage

        if self.hp <= 0:

            print(f"{self.name}이(가) 쓰러졌습니다!")

        else:

            print(f"{self.name}이(가) {damage} 데미지를 입었습니다. 남은 체력: {self.hp}")


    def heal(self, amount):

        self.hp = min(self.max_hp, self.hp + amount)

        print(f"{self.name}이(가) {amount}만큼 치유되었습니다. 남은 체력: {self.hp}")


    def attack_target(self, target):

        distance = abs(self.x - target.x) + abs(self.y - target.y)

        if distance <= self.job.range:

            print(f"{self.name}이(가) {target.name}을(를) 기본 공격!")

            target.take_damage(self.job.attack)

        else:

            print(f"{target.name}이(가) 공격 범위 내에 없습니다.")


    def use_special_ability(self, target=None):

        if self.cooldown > 0:

            print(f"{self.name}의 {self.job.special}은(는) 아직 준비되지 않았습니다. (쿨타임: {self.cooldown}턴)")

            return False


        if self.job.special == "heal":

            if target:

                target.heal(10)  # 힐러는 아군을 10만큼 회복

            else:

                print("치유할 대상을 선택하세요.")

                return False

        elif self.job.special == "shield":

            print(f"{self.name}이(가) 방어막을 생성했습니다! (다음 공격 피해 감소)")

        elif self.job.special == "snipe":

            if target:

                print(f"{self.name}이(가) {target.name}을(를) 저격했습니다! (추가 피해)")

                target.take_damage(self.job.attack * 1.5)

            else:

                print("공격할 대상을 선택하세요.")

                return False

        elif self.job.special == "slash":

            if target:

                print(f"{self.name}이(가) {target.name}을(를) 베어 출혈 상태로 만들었습니다! (지속 피해)")

                target.take_damage(self.job.attack)

            else:

                print("공격할 대상을 선택하세요.")

                return False

        elif self.job.special == "fireball":

            print(f"{self.name}이(가) 불덩이를 던져 넓은 범위를 공격했습니다!")

            # 범위 내 모든 적에게 피해를 입히는 로직 추가

            for dx in [-1, 0, 1]:

                for dy in [-1, 0, 1]:

                    if dx == 0 and dy == 0:

                        continue  # 자기 자신은 제외

                    target_x = self.x + dx

                    target_y = self.y + dy

                    # 범위 내의 적 찾기

                    for enemy in enemy_characters:

                        if enemy.x == target_x and enemy.y == target_y:

                            print(f"{enemy.name}이(가) 불덩이에 맞았습니다!")

                            enemy.take_damage(self.job.attack)


        self.cooldown = 3  # 쿨타임 설정 (예: 3턴)

        return True


    def reduce_cooldown(self):

        if self.cooldown > 0:

            self.cooldown -= 1


    def __str__(self):

        return f"{self.name} ({self.x}, {self.y}) {self.job.name} HP: {self.hp}/{self.max_hp}"


# 맵 클래스

class Map:

    def __init__(self, width, height):

        self.width = width

        self.height = height

        self.grid = np.full((width, height), ".", dtype=str)  # 빈 공간은 "."으로 표시


    def place_character(self, character):

        # 아군은 대문자, 적군은 소문자로 표시

        symbol = character.job.symbol.upper() if character.is_player else character.job.symbol.lower()

        self.grid[character.x][character.y] = symbol


    def display(self):

        for row in self.grid:

            print(" ".join(row))


# 적 AI: 플레이어를 향해 이동 및 공격

def enemy_ai(enemy, player_characters, all_characters):

    closest_player = min(player_characters, key=lambda p: abs(enemy.x - p.x) + abs(enemy.y - p.y))

    if enemy.x < closest_player.x:

        enemy.move(1, 0, all_characters)

    elif enemy.x > closest_player.x:

        enemy.move(-1, 0, all_characters)

    elif enemy.y < closest_player.y:

        enemy.move(0, 1, all_characters)

    elif enemy.y > closest_player.y:

        enemy.move(0, -1, all_characters)


    # 공격 범위 내의 플레이어 공격

    for player in player_characters:

        distance = abs(enemy.x - player.x) + abs(enemy.y - player.y)

        if distance <= enemy.job.range:

            print(f"{enemy.name}이(가) {player.name}을(를) 공격합니다!")

            enemy.attack_target(player)


# 게임 초기화

player_characters = [

    Character("P1", 0, 0, JOBS["healer"], is_player=True),

    Character("P2", 1, 0, JOBS["tank"], is_player=True),

    Character("P3", 2, 0, JOBS["ranged"], is_player=True),

    Character("P4", 3, 0, JOBS["melee"], is_player=True),

    Character("P5", 4, 0, JOBS["mage"], is_player=True)

]


enemy_characters = [

    Character("E1", 9, 9, JOBS["healer"], is_player=False),

    Character("E2", 8, 9, JOBS["tank"], is_player=False),

    Character("E3", 7, 9, JOBS["ranged"], is_player=False),

    Character("E4", 6, 9, JOBS["melee"], is_player=False),

    Character("E5", 5, 9, JOBS["mage"], is_player=False)

]


all_characters = player_characters + enemy_characters

game_map = Map(MAP_WIDTH, MAP_HEIGHT)


# 게임 루프

turn = 0  # 턴 수

while True:

    print(f"\n=== 턴 {turn} ===")

    game_map.grid = np.full((MAP_WIDTH, MAP_HEIGHT), ".", dtype=str)  # 맵 초기화


    # 죽은 캐릭터 제거

    for character in all_characters[:]:

        if character.hp <= 0:

            print(f"{character.name}이(가) 전투에서 제외됩니다.")

            all_characters.remove(character)

            if character in player_characters:

                player_characters.remove(character)

            elif character in enemy_characters:

                enemy_characters.remove(character)


    # 캐릭터 배치

    for character in all_characters:

        game_map.place_character(character)

    game_map.display()


    # 플레이어 상태 출력

    print("\n[플레이어]")

    for player in player_characters:

        print(player)

    print("\n[적]")

    for enemy in enemy_characters:

        print(enemy)


    # 플레이어 턴

    print("\n[플레이어 턴]")

    for player in player_characters:

        if player.hp <= 0:

            continue  # 체력이 0 이하인 캐릭터는 건너뜀


        while True:

            print(f"\n{player.name}의 차례입니다.")

            direction = input("이동할 방향을 입력하세요 (w: 위, s: 아래, a: 왼쪽, d: 오른쪽, q: 넘어가기): ").lower()

            if direction == 'q':

                print(f"{player.name}이(가) 행동을 넘어갑니다.")

                break

            elif direction in ['w', 's', 'a', 'd']:

                dx, dy = 0, 0

                if direction == 'w':

                    dx, dy = -1, 0

                elif direction == 's':

                    dx, dy = 1, 0

                elif direction == 'a':

                    dx, dy = 0, -1

                elif direction == 'd':

                    dx, dy = 0, 1

                if player.move(dx, dy, all_characters):

                    break

            else:

                print("잘못된 명령입니다. 다시 입력하세요.")


        if player.hp > 0:

            while True:

                action = input(f"행동을 선택하세요 (a: 공격, s: 스킬 (쿨타임: {player.cooldown}턴), q: 넘어가기): ").lower()

                if action == 'q':

                    print(f"{player.name}이(가) 행동을 넘어갑니다.")

                    break

                elif action == 'a':

                    target_name = input("공격할 적을 선택하세요 (E1, E2, E3, E4, E5): ").upper()

                    target = next((e for e in enemy_characters if e.name == target_name), None)

                    if target:

                        player.attack_target(target)

                        break

                    else:

                        print("잘못된 대상입니다. 다시 입력하세요.")

                elif action == 's':

                    if player.cooldown > 0:

                        print(f"{player.name}의 {player.job.special}은(는) 아직 준비되지 않았습니다. (쿨타임: {player.cooldown}턴)")

                        continue

                    target_name = input("스킬 대상을 선택하세요 (아군 또는 적): ").upper()

                    target = next((c for c in all_characters if c.name == target_name), None)

                    if target:

                        if player.use_special_ability(target):

                            break

                    else:

                        print("잘못된 대상입니다. 다시 입력하세요.")

                else:

                    print("잘못된 명령입니다. 다시 입력하세요.")


    # 적 턴

    print("\n[적 턴]")

    for enemy in enemy_characters:

        if enemy.hp > 0:

            enemy_ai(enemy, player_characters, all_characters)


    # 턴 종료 후 쿨타임 감소

    for player in player_characters:

        player.reduce_cooldown()

    for enemy in enemy_characters:

        enemy.reduce_cooldown()


    # 게임 종료 조건

    if all(player.hp <= 0 for player in player_characters):

        print("모든 플레이어가 쓰러졌습니다. 게임 오버!")

        break

    if all(enemy.hp <= 0 for enemy in enemy_characters):

        print("모든 적을 쓰러뜨렸습니다. 승리!")

        break


    turn += 1

추천 비추천

1

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 소속 연예인 논란에 잘 대응하지 못하는 것 같은 소속사는? 운영자 25/04/21 - -
2846624 지수연(JI SUYEON) - 종이더미 발명도둑잡기갤로그로 이동합니다. 01:54 19 0
2846623 ZIA(지아) _지독하게 가슴 아픈 사랑 발명도둑잡기갤로그로 이동합니다. 01:52 19 0
2846622 케틀그립 발명품 발명도둑잡기갤로그로 이동합니다. 01:47 19 0
2846621 시간을 갖자 말하고 밥먹으면서 싱글생글 웃었어 [2] 프갤러(1.242) 01:43 34 0
2846620 뉴프로에서 싸움 벌어졌다 [4] 헬마스터갤로그로 이동합니다. 01:40 85 0
2846619 빅뱅 이전, 또 다른 우주가 존재했다?! | 현대 천문학이 설명하지 못하 발명도둑잡기갤로그로 이동합니다. 01:37 18 0
2846618 왜 은하의 나선팔은 더 꼬이지 않을까? 발명도둑잡기갤로그로 이동합니다. 01:35 48 0
2846617 uv 왜씀? [2] 프갤러(49.165) 01:33 43 0
2846616 MLSys 갤러리로 놀러오세요!! [3] PyTorch갤로그로 이동합니다. 01:22 70 0
2846615 흔히 여자들이 3천밖에 못모았다는데 난 3천도 모으기 힘들어 [4] 프갤러(183.101) 01:16 67 0
2846614 ㅆㅇㅆ 도 포프아저씨같은 유튜버될듯 [1] ㅇㅇ(183.101) 01:12 55 0
2846612 오픈챗에서 구인하는 줄서기업체 알바해본 갤러있음? 이거 해도 돼는거냐? 온소성갤로그로 이동합니다. 01:05 32 0
2846609 화교의 속마음 프갤러(211.210) 00:59 31 0
2846608 나는 배틀쿠루져 스타크래프트갤로그로 이동합니다. 00:57 27 0
2846607 게임 개발도 나처럼 기본적으로 게임을 잘해야 뭘 하지 [1] 프갤러(110.10) 00:54 38 0
2846606 좆고아새끼 [1] 멍유(58.228) 00:52 100 0
2846605 입자들의 패턴을 분석하자, 갑자기 3차원 공간의 수학적 규칙들이 나타나기 발명도둑잡기갤로그로 이동합니다. 00:50 21 0
2846604 Ada: 실행 파일 만들기 *루비*갤로그로 이동합니다. 00:20 31 0
2846603 그알에서 프갤러 찾는다 [7] cvs.갤로그로 이동합니다. 00:11 105 0
2846602 그래서 ㅆㅇㅆ이 잘 될려면 RyuDOG갤로그로 이동합니다. 00:10 42 0
2846600 ㅆㅇㅆ는 깊이가 너무 없음 RyuDOG갤로그로 이동합니다. 00:01 50 0
2846599 아니 파이썬 이 병신언어는 왜 오류 있으면 바로바로 말 안하냐 [3] ㅇㅇ갤로그로 이동합니다. 00:01 45 0
2846598 인텔리제이같은거 상업용으로 못쓴다고 하는데 [7] 프갤러(58.237) 04.20 57 0
2846597 찐 s급 프로그래머들은 다 불법적인일 한다던데 맞음? [1] 프갤러(14.34) 04.20 59 0
2846595 다급해진 트럼프...시진핑이 노리는 마지막 반격 카드는 '이것 발명도둑잡기갤로그로 이동합니다. 04.20 19 0
2846594 여자친구가 사랑한 유럽 비디오들 가지고 왔습니다. 넥도리아(175.196) 04.20 41 0
2846593 AI의 다음 연구는 무엇이 될까? - AI 대부의 GTC 2025 인터뷰 발명도둑잡기갤로그로 이동합니다. 04.20 18 0
2846592 한국어 배우는 미국 학생들이 말한 한국말의 특징 발명도둑잡기갤로그로 이동합니다. 04.20 27 0
2846591 이 파일은 만료되었습니다 << 이거 어떻게 해결함 [2] 프갤러(58.228) 04.20 36 0
2846589 컴공+심리학 복전해서 갈 수 있는 직무없나? [2] 프갤러(121.175) 04.20 47 0
2846588 종교가 모든 학문의 최고봉이다 RyuDOG갤로그로 이동합니다. 04.20 37 0
2846585 중국, 의회 주변 술집에 도청 장치 설치해 국가 기밀 빼돌려 [1] 발명도둑잡기갤로그로 이동합니다. 04.20 26 0
2846584 니넨 상사가 부당하면 말하냐? ㅇㅇ(211.234) 04.20 28 0
2846583 꼭 게임 발매하고 성공해서 결혼한다.. [2] ㅆㅇㅆ(124.216) 04.20 64 1
2846582 기독교에 사이비 많은 이유는 크게 2가지인데 [2] RyuDOG갤로그로 이동합니다. 04.20 41 0
2846580 딸배도 로봇에 따임 RyuDOG갤로그로 이동합니다. 04.20 31 0
2846579 Xx용 ♥냥덩소프트♥갤로그로 이동합니다. 04.20 35 0
2846578 국비 지인들 보니까 [2] 프갤러(211.235) 04.20 72 0
2846577 오늘의 소설, 영화 실마리: 기독교의 성스러운 것들 풍자 유머 발명도둑잡기갤로그로 이동합니다. 04.20 20 0
2846576 프론트엔드 면접 = 자소서 + 감성 포트폴리오 프갤러(180.80) 04.20 37 0
2846575 내 인생에 후회하는 것 2가지는 [3] ㅆㅇㅆ(124.216) 04.20 62 0
2846574 기독교 계열 사이비가 유달리 많은 이유는 종교 자체의 문제 때문입니다. [2] 발명도둑잡기갤로그로 이동합니다. 04.20 25 0
2846573 5년전으로 돌아가도 코딩 팠고 10년전으로 돌아가도 코딩팠음. [4] ㅆㅇㅆ(124.216) 04.20 51 0
2846572 아 피곤해 죽겠네. 전광훈 전한길 투전 안철수 대통령 후보 넥도리아(175.196) 04.20 22 0
2846570 나님 누엇어양⭐+ ♥냥덩소프트♥갤로그로 이동합니다. 04.20 25 0
2846569 양 극단 후보는 안 뽑힌다는 중위 투표자 정리, 투표제 불가능성 정리 발명도둑잡기갤로그로 이동합니다. 04.20 16 0
2846568 과유불급 이니라.. ♥냥덩소프트♥갤로그로 이동합니다. 04.20 50 0
2846567 10년 전이라- 프갤러(121.172) 04.20 41 1
2846566 철창에 갇혀 [4] 멍유(58.228) 04.20 54 0
2846564 무료 게임 리소스 사이트 정리 프갤러(121.172) 04.20 32 0
뉴스 [단독] ‘6월 결혼’ 미쓰에이 민 “결혼 실감 안 나…든든한 예비신랑과 잘 살게요” (직격인터뷰) 디시트렌드 14:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2