인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

david42149815's profile image
david42149815

asked

[MMORPG Game Development Series with C# and Unity] Part 1: Introduction to Basic C# Programming

textrpg 두번째버전을 계속 실패합니다

Written on

·

182

0

using System;
using System.Collections.Generic;
using System.Text;

namespace trpg22
{
    public enum GameMode
    {
        None,
        Lobby,
        Town,
        Field
    }
    class Game
    {
        private GameMode mode = GameMode.Lobby;
        private Player player = null;
        private Monster monster = null;
        private Random rand = new Random();
        public void Process()
        {
            switch (mode)
            {
                case GameMode.Lobby:
                    ProcessLobby();
                    break;
                case GameMode.Town:
                    ProcessTown();
                    break;
                case GameMode.Field:
                    ProcessField();
                    break;
            }
        }

        public void ProcessLobby()
        {
            Console.WriteLine("직업을 선택하세요");
            Console.WriteLine("[1] 기사");
            Console.WriteLine("[2] 궁수");
            Console.WriteLine("[3] 법사");
            string input = Console.ReadLine();
            switch (input)
            {
                case "1":
                    player = new Knight();
                    mode = GameMode.Town;
                    break;
                case "2":
                    player = new Archer();
                    mode = GameMode.Town;
                    break;
                case "3":
                    player = new Mage();
                    mode = GameMode.Town;
                    break;
            }
        }

        public void ProcessTown()
        {
            Console.WriteLine("마을에 입장했습니다!");
            Console.WriteLine("[1] 필드로 가기");
            Console.WriteLine("[2] 로비로 돌아가기");

            string input = Console.ReadLine();
            switch (input)
            {
                case "1":
                    mode = GameMode.Field;
                    break;
                case "2":
                    mode = GameMode.Lobby;
                    break;

            }
        }
        public void ProcessField()
        {
            Console.WriteLine("필드에 입장했습니다!");
            Console.WriteLine("[1] 싸우기");
            Console.WriteLine("[2] 일정 확률로 마을 돌아가기");
            CreatRandomMonster();
            string input = Console.ReadLine();
            switch (input)
            {
                case "1":
                    ProcessFight();
                    break;
                case "2":
                    TryEscape();
                    break;
            }
        }
        private void TryEscape()
        {
           int randvalue = rand.Next(0, 101);
            if (randvalue < 33)
            {
                mode = GameMode.Town;
            }
            else
            {
                ProcessFight();
            }
        }
        private void ProcessFight()
        {
            while (true)
            {
                int damage = player.GetAttack();
                monster.OnDamaged(damage);
                if (monster.IsDead())
                {
                    Console.WriteLine("승리했습니다");
                    Console.WriteLine($"남은체력{player.GetHp()}");
                    break;
                }
                damage = monster.GetAttack();
                player.OnDamaged(damage);
                if (player.IsDead())
                {
                    Console.WriteLine("패배했습니다");
                    break;
                }
            }
        }
        private void CreatRandomMonster()
        {
            int randValue = rand.Next(0, 3);
            switch (randValue)
            {
                case 0:
                    monster = new Slime();
                    Console.WriteLine("슬라임이 생성되었습니다");
                    break;
                case 1:
                    monster = new Orc();
                    Console.WriteLine("오크가 생성되었습니다");
                    break;
                case 2:
                    monster = new Skeleton();
                    Console.WriteLine("해골이 생성되었습니다");
                    break;
            }
        }
    } 
}
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
3번째 강의까지는 문제 없이 되는데 마무리 단계를 따라하고 나면 문제가 발생합니다. 거꾸로 영상을 다시보기도 하고 처음부터 다시만들어 봤는데 이번엔 또 같은곳에서 다른 이유로 안되네요...ㅠㅠ
맨처음 만들었던건 nullreferenceexception이라는 오류가 떴고 지금 코드를 첨부한 두번째 시도는 이렇게 나오는데 혼자 며칠 고민해봐도
강의를 반복해서 봐도 어디서 실수를 했는지 도저히 찾지를 못하겠어서 도움을 요청드립니다
C#

Answer 3

0

rookiss님의 프로필 이미지
rookiss
Instructor

진행이 안 되는 버그는

일시 정지 버튼을 누르면 현재 코드가 멈추는데 어디서 헤매고 있는지를 찾아보면 됩니다.


콜스택을 보면 위와 같네요.

즉 위 함수에서 계속 뺑뻉이를 돌고 있는데, 왜 죽지 않을까? 살펴보면

죽는 조건이 hp < 0입니다.
즉 hp 가 0이 되어도 죽은 상태가 아니라는 것이죠.
<=0 으로 수정이 필요합니다.

0

rookiss님의 프로필 이미지
rookiss
Instructor


크래시 난 부분에서 마우스를 갖다 대면 player가 null인 것을 알 수 있습니다.
player를 할당을 왜 안 해줬는지를 찾으면 되겠죠!


player = 대입하는 부분이 없네요.

이렇게 바꿔주시면 됩니다.

david42149815님의 프로필 이미지
david42149815
Questioner

너무감사합니다 ㅠㅠ

혼자할때는 이런게 왜이렇게 안보이는지.. 

david42149815님의 프로필 이미지
david42149815
Questioner

계속 연습하겠습니다 감사합니다

0

rookiss님의 프로필 이미지
rookiss
Instructor

이런 디버깅 연습은 시간 낭비가 아니라 꼭 거쳐야 하는 과정입니다.
NULL 크래시는 크래시 중에서도 가장 빈번하며,
어느 객체가 생성되지 않았을 때 발생하는데
왜 생성이 누락되었는지를 유심히 살펴보면 됩니다.

아무튼 눈으로 봐선 저도 잘 찾기 어려우니,
문제 해결이 안 되면 전체 프로젝트 압축해서 rookiss@naver.com 로 보내주시기 바랍니다.

 

david42149815님의 프로필 이미지
david42149815
Questioner

메일 보내드렸습니다 도움 부탁드립니다

david42149815's profile image
david42149815

asked

Ask a question