디시인사이드 갤러리

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

갤러리 본문 영역

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

핼월(58.142) 2025.02.08 22:08:40
조회 129 추천 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/08/11 - -
AD 가전디지털, 휴대폰 액세서리 SALE 운영자 25/08/08 - -
공지 프로그래밍 갤러리 이용 안내 [92] 운영자 20.09.28 46349 65
2881844 ai도 써보면 ㅇㅇ(114.205) 05:01 12 0
2881842 님들 저 졸업작품 주제 추천좀 ㅠㅠㅠㅠㅠㅠㅠㅠ 공기역학갤로그로 이동합니다. 04:25 17 0
2881840 winapi는 ui책이 명성1등먹은게 말이안됨 [1] 공기역학갤로그로 이동합니다. 04:11 20 0
2881838 요즘 공부한 것들 구현한것들 yaml 명세로 넣는중 ㅆㅇㅆ(124.216) 04:07 10 0
2881836 The Trum.. Show 발명도둑잡기갤로그로 이동합니다. 03:58 11 0
2881835 내일 노래방 관련 소설, 영화 실마리를 쓸 예정이다 발명도둑잡기갤로그로 이동합니다. 03:40 10 0
2881834 남자들이 치근대지 않는, 여성에게 적합한 직업 발명도둑잡기갤로그로 이동합니다. 03:36 14 0
2881832 성형외과에서 일했던 사람이 했었던 충격적인 업무 발명도둑잡기갤로그로 이동합니다. 03:18 11 0
2881831 트럼프의 달러 무기화 속에 전세계는 지금 달러와 이혼 중 발명도둑잡기갤로그로 이동합니다. 03:02 16 0
2881830 음기 충전 발명도둑잡기갤로그로 이동합니다. 02:50 15 0
2881829 영화 <웨폰> 인기래서 생각나는 예전 글 발명도둑잡기갤로그로 이동합니다. 02:35 9 0
2881828 유심없는 폰으로 테러글 올리면 어케잡냐는애 있었는데 밀우갤로그로 이동합니다. 02:34 20 0
2881827 DAVICHI '그걸 사랑이라고 말하지마' 발명도둑잡기갤로그로 이동합니다. 02:16 10 0
2881824 <기억의 미래> 발명도둑잡기갤로그로 이동합니다. 02:03 10 0
2881823 오늘의 작사 실마리: '트'란 제목의 노래 발명도둑잡기갤로그로 이동합니다. 01:50 12 0
2881821 음양론에 따른 노래 구분 발명도둑잡기갤로그로 이동합니다. 01:36 13 0
2881820 "새벽 5시40분 입장" 장범준, '미라클 모닝' 공연한다 발명도둑잡기갤로그로 이동합니다. 01:15 10 0
2881807 관심경제의 부작용과 자본주의 관계 발명도둑잡기갤로그로 이동합니다. 00:49 16 0
2881801 나는요. 24년 2월 24일 탈당했었어요. [1] 넥도리아(175.196) 00:19 26 0
2881800 요즘 코딩 배운다는게 이런거냐 [2] ㅇㅇ(220.89) 00:09 49 0
2881799 하루에 3경조줄 감사의 코딩 공기역학갤로그로 이동합니다. 00:00 32 0
2881798 스프링5 처음 시작하면 추천할만한 글 프갤러(121.133) 08.15 50 0
2881796 세대론, '노인을 위한 나라는 없다' 관련 생각나는 예전 글 발명도둑잡기갤로그로 이동합니다. 08.15 22 0
2881793 오늘 김치찜 먹었는데 맛있더라 ㅇㅅㅇㅋㅋ ㅇㅇ(223.39) 08.15 14 0
2881792 방금 전 트위터 자동 추천 발명도둑잡기갤로그로 이동합니다. 08.15 19 0
2881790 오늘의 소설, 영화 실마리: CIA 신고열풍 신고했다 간첩으로 포섭 [2] 발명도둑잡기갤로그로 이동합니다. 08.15 22 0
2881785 에구궁 허리야.. ♥냥덩이♥갤로그로 이동합니다. 08.15 31 0
2881783 챗티너무 느려서 코파일럿 제미나이쓰게된다 [2] 헬마스터갤로그로 이동합니다. 08.15 43 0
2881782 근데 지금 2030세대가 아버지 세대보다 [1] ㅇㅇ(211.234) 08.15 36 0
2881781 ♥냥덩이♥갤로그로 이동합니다. 08.15 29 0
2881779 일하는거 존나 쉬운데 프갤러(121.139) 08.15 45 1
2881778 변영주 감독 <낮은 목소리> 발명도둑잡기갤로그로 이동합니다. 08.15 15 0
2881777 광복과 이재명 [1] 발명도둑잡기갤로그로 이동합니다. 08.15 28 0
2881776 Java 전문가 마스터 봐라. [1] 프갤러(59.16) 08.15 43 0
2881773 양양 후기 ♥냥덩이♥갤로그로 이동합니다. 08.15 38 0
2881772 여름바다는 확실히 습하당 ♥냥덩이♥갤로그로 이동합니다. 08.15 27 0
2881771 도와주세용ㅠ 11갤로그로 이동합니다. 08.15 24 0
2881770 나님이 마시는 술⭐+ ♥냥덩이♥갤로그로 이동합니다. 08.15 33 0
2881769 유튜브 뮤직 알고리즘 너무 구리더라 [2] 헬마스터갤로그로 이동합니다. 08.15 39 0
2881768 썩은내 적은 쓰레기에서 극심한 쓰레기가 됩니다. 프갤러(220.84) 08.15 22 0
2881766 윤미향 비난의 상당수 원인은 성매수, 성추행에 대한 죄책감 때문이다 발명도둑잡기갤로그로 이동합니다. 08.15 24 0
2881765 신봉선과 냥덩이의 결혼을 허가합니다 [2] 발명도둑잡기갤로그로 이동합니다. 08.15 32 0
2881764 오늘의 소설 영화 실마리: FBI, CIA 등에 마약 수사로 포섭된 래퍼 발명도둑잡기갤로그로 이동합니다. 08.15 30 0
2881763 게임 개발 공부하려고 프리서버 뜯어보고 있는데 ㅇㅇ갤로그로 이동합니다. 08.15 27 0
2881762 AI 나오고 느끼는 것이 AI가 최고의 스승이다. [2] ㅆㅇㅆ(124.216) 08.15 52 0
2881761 전광훈 현상의 뿌리를 파헤치다 [기자의 추천 책] 발명도둑잡기갤로그로 이동합니다. 08.15 14 0
2881757 요즘 느끼는 것이 그냥 하면 해볼만하더라 [1] ㅆㅇㅆ찡갤로그로 이동합니다. 08.15 43 0
2881756 여름밤바다⭐+✨☀+⚡+☄++ ♥냥덩이♥갤로그로 이동합니다. 08.15 31 0
2881755 술먹고도 안피곤하단걸 자랑으로 생각하는 애들이 있네... ㅇㅇ(223.39) 08.15 19 0
뉴스 '톡파원 25시' 배우 김성령, 전현무의 ‘우리 누나’ 등극? 스튜디오를 발칵 뒤집은 두 사람의 유쾌한 티키타카 예고! 디시트렌드 08.15
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2