디시인사이드 갤러리

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

갤러리 본문 영역

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

핼월(58.142) 2025.02.08 22:08:40
조회 100 추천 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/02/17 - -
이슈 [디시人터뷰] 모델에서 배우로, 떠오르는 스타 이수현 운영자 25/02/21 - -
AD [베이비챗] 제약 없는 AI 채팅, 숨김없이 솔직하게 운영자 25/02/20 - -
2817428 누가 대한민국 청년을 지키는가? [2] ♥멸공의냥덩♥갤로그로 이동합니다. 02.11 62 1
2817427 옛날에 나님이 만들었던 가상머쉰 ㅁㅌㅊ? ♥멸공의냥덩♥갤로그로 이동합니다. 02.11 58 1
2817423 수백만구독자 대형유튜버들 잇달아 윤석열 대통령 지지 선언 ♥멸공의냥덩♥갤로그로 이동합니다. 02.11 54 0
2817421 이태원 참사는 간첩들의 테러행위 ㄷㅅㄷ ♥멸공의냥덩♥갤로그로 이동합니다. 02.11 72 0
2817419 세ㄱ스 ♥멸공의냥덩♥갤로그로 이동합니다. 02.11 40 0
2817417 이젠 어디서나 전라도 화법이 일반화 된 거 같네. 프갤러(49.165) 02.11 49 3
2817416 느그들은 이바닥 몇년보냐? [2] 프갤러(118.235) 02.11 74 0
2817415 오늘의 동남아 코딩 갑니다!!! [6] 40대프린이(124.217) 02.11 106 0
2817409 내가 아는 중국어는 >> 下载 [3] ㅇㅇ(59.151) 02.11 59 0
2817407 북한 간첩들이 대한민국 파괴 시킬 계획 시도 폭로 ♥멸공의냥덩♥갤로그로 이동합니다. 02.11 61 0
2817406 소비를 줄여야 하는데, 넥도리아(223.62) 02.11 43 0
2817405 난 일하러 간다 칭쿠들- [2] 프갤러(121.172) 02.11 63 1
2817404 머신렁잉 할때 VRAM 높은게 좋냐 ? 속도 높은게 좋냐 ? [1] 머스크멜론(218.234) 02.11 55 0
2817403 폰허브가 깃허브 따라한줄 알았는데 [4] 헬마스터갤로그로 이동합니다. 02.11 121 0
2817402 8살 여자아이 - 여교사가 수차례 칼로 찔러- 프갤러(121.172) 02.11 72 2
2817400 개발떄려치고 노가다했다 [1] 프갤러(211.48) 02.11 75 0
2817399 너네들은 토익이나 토익스피킹같은건 공부안하냐 [1] ㅇㅇ(183.99) 02.11 67 0
2817398 방금 만들어봤는데, 백갤러(221.165) 02.11 57 1
2817397 허ㅜ시발 요새 왜 일자리가없냐 ㅇㅇ(211.234) 02.11 58 0
2817396 아레스 벽돌깨기 - 작업 상황 프갤러(121.172) 02.11 63 1
2817395 여교사 = 정신병자 ♥멸공의냥덩♥갤로그로 이동합니다. 02.11 53 0
2817394 청년층 취업,이직이 힘든 이유는 종북내란당 때문 ♥멸공의냥덩♥갤로그로 이동합니다. 02.11 45 0
2817393 저 이마트 과천점 뭔가를 사려합니다. [2] 넥도리아(223.62) 02.11 63 0
2817392 공기업 전산 가면 ㅇㅇ(182.217) 02.11 60 0
2817390 오늘 프로그래밍 다하고, 내일 블로그에 올릴 글 뭐 쓰지 병렬프로그래밍? [4] ㅆㅇㅆ(124.216) 02.11 88 0
2817389 프로그래머로태어나서 딥시크로 엔비디아 털린새끼 없지? [6] 공기역학갤로그로 이동합니다. 02.11 106 0
2817388 나는 가끔 미래봄 살펴봄 뒷통수한방(1.213) 02.11 48 0
2817383 중국 블로그 운영하면서 느끼는데 중국인들 하나같이 존나 예의바름.. [5] ㅆㅇㅆ(124.216) 02.11 82 0
2817377 [자유 대한민국] 행동 목표 설립 프갤러(121.172) 02.11 51 1
2817372 유동한테 댓글달았는데 고닉이 알림온다며 짜증냄 ㅇㅇ(211.234) 02.11 50 3
2817369 차단했다면서 작성글 내용은 알고 있음 ㅇㅇ(211.234) 02.11 55 4
2817368 기술 블로그 운영하는데, 중국인에게 내 얼굴은 잘생긴건가. [6] ㅆㅇㅆ(124.216) 02.11 123 0
2817364 사람들 딥시크 선동 당해서 거르기하는거 ㅈㄴ 웃기네 ㅇㅇ(223.62) 02.11 77 0
2817363 아스카 사택 이사할 듯합니다 [12] 아스카영원히사랑해갤로그로 이동합니다. 02.11 164 1
2817362 사업아이템 떠오름 [1] 프갤러(211.210) 02.11 64 0
2817361 오늘날 IT의 아버지 김대통령 ㅇㅇ갤로그로 이동합니다. 02.11 70 1
2817360 ㅆㅇㅆ는 진짜 개발자 인거 같은데 [2] ㅇㅇ(61.75) 02.11 112 1
2817358 나님 펀드 레이징 전 전력질주 중 ㅠ.... AppHiki갤로그로 이동합니다. 02.11 54 0
2817356 작업 다시 혀야겄다 [1] ㅆㅇㅆ(124.216) 02.11 62 0
2817355 출근 중 딱님갤로그로 이동합니다. 02.11 55 0
2817353 국비지원 부트캠프 추천 부탁드립니다 형님들 [8] 프갤러(106.101) 02.11 345 0
2817352 나도 ㅆㅇㅆ처럼 지식 생산자가 되고싶다 [1] hrin(211.234) 02.11 73 1
2817349 우리나라는 너무 유행만 좇는 것 같음..ㅇㅅㅇ [3] 헤르 미온느갤로그로 이동합니다. 02.11 90 0
2817348 북한 정상국가된다, 제재아닌 대북관세 추진 [2] ㅇㅇ(211.219) 02.11 79 0
2817345 샹.. 어제 카메라 가지고 나갔어야 하는건데..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 02.11 47 0
2817344 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 02.11 56 0
2817343 제네릭 프로그래밍에 대한 단상 [15] ㅆㅇㅆ(124.216) 02.11 842 11
2817341 아오 메이플템 진짜 드럽게 안팔리네 ㅇㅇ(123.213) 02.11 50 1
2817338 인지과학조져라 손발이시립디다갤로그로 이동합니다. 02.11 48 0
2817336 ai코더 완벽히되면 러스트 세상오나 [1] ㅇㅇ(223.38) 02.11 68 0
뉴스 황치열, 신곡 ‘웃기는 소리 같겠지만’ 미리 듣기 공개… 27일 발매 디시트렌드 02.21
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2