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;
}
}
}
}
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! Answer 3
0
진행이 안 되는 버그는
일시 정지 버튼을 누르면 현재 코드가 멈추는데 어디서 헤매고 있는지를 찾아보면 됩니다.
콜스택을 보면 위와 같네요.
즉 위 함수에서 계속 뺑뻉이를 돌고 있는데, 왜 죽지 않을까? 살펴보면
죽는 조건이 hp < 0입니다.
즉 hp 가 0이 되어도 죽은 상태가 아니라는 것이죠.
<=0 으로 수정이 필요합니다.
0
크래시 난 부분에서 마우스를 갖다 대면 player가 null인 것을 알 수 있습니다.
player를 할당을 왜 안 해줬는지를 찾으면 되겠죠!
player = 대입하는 부분이 없네요.
이렇게 바꿔주시면 됩니다.
0
이런 디버깅 연습은 시간 낭비가 아니라 꼭 거쳐야 하는 과정입니다.
NULL 크래시는 크래시 중에서도 가장 빈번하며,
어느 객체가 생성되지 않았을 때 발생하는데
왜 생성이 누락되었는지를 유심히 살펴보면 됩니다.
아무튼 눈으로 봐선 저도 잘 찾기 어려우니,
문제 해결이 안 되면 전체 프로젝트 압축해서 rookiss@naver.com 로 보내주시기 바랍니다.
너무감사합니다 ㅠㅠ
혼자할때는 이런게 왜이렇게 안보이는지..