목차
어제는 캐릭터 생성까지 다뤄봤다.
이번에는 기본적인 몬스터 생성까지 해 봤는데
몬스터 생성에 덧붙여 이것저것 추가를 좀 더 해봤다.
1. MAX_HP , MAX_MP 추가
기존에는 그냥 HP, MP만 있어 체력 및 내공의 회복이 불가하였던 점을 개선.
2. ATT, DEF 추가
플레이어의 스탯 및 장비를 기반으로 변경되는 스테이터스.
추후 몬스터와의 전투시 사용
3. 몬스터 추가
여우, 토끼, 양아치 몬스터 추가.
여우와 토끼의 기본 레벨 2
양아치의 기본 레벨 4
위의 몬스터들은 랜덤으로 기본레벨 보다 높거나 낮은 수준으로 등장한다.
레벨에 따라 몬스터의 수준 및 경험치 또한 변경
4. 새로운 필드 2가지 제작
4-1. 집
집은 플레이어의 휴식 공간이자 상태를 점검하는 장소
휴식을 통해 체력 및 내공을 회복 할 수 있으며, 보유한 여분의 능력치를 부여 가능
4-2. 숲 초입
3에서 추가된 몬스터가 등장하는 사냥 필드.
각 45%의 확률로 여우와 토끼가 등장하며, 10%의 확률로 양아치가 등장한다.
위의 부분이 추가된 부분이다.
이래저래 간단하게 실습만 해본다는게 뭔가 재밌어서 자꾸 붙이다보니 코드가 IF 파티가 되어버렸다...
근데 뭐 어쩔수... 없지!
내일은 이래저래 바빠서 코딩을 할 수 있을진 모르겠지만
된다면 전투 + 경험치 획득에 따른 레벨업까지 구현 해 봐야겠다!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TextRPG
{
class Program
{
enum Forest1_MonsterType
{
Fox = 0,
Rabbit = 1,
Bully = 2
}
struct Monster
{
// 몬스터 이름
public string NAME;
// 몬스터 레벨
public int LV;
// 몬스터 타입(0 : 동물형 , 1 : 인간형)
public byte TYPE;
// 몬스터 공격력
public int ATT;
// 몬스터 방어력
public int DEF;
// 몬스터 체력
public int MAX_HP;
public int HP;
// 몬스터 내공
public int MAX_MP;
public int MP;
// 몬스터 사망시 경험치
public int EXP;
}
static Monster CreateMonster() {
Random rand = new Random();
int SpawnMonster = rand.Next(10001);
Monster mon;
switch (SpawnMonster / 4500)
{
case (int)Forest1_MonsterType.Rabbit:
Console.WriteLine("야생의 토끼가 나타났다...!");
mon.NAME = "토끼";
mon.LV = 2 + rand.Next(-1, 2);
mon.TYPE = 0;
mon.ATT = 11 + (mon.LV * 2);
mon.DEF = 9 + (mon.LV * 2);
mon.MAX_HP = 70 + (rand.Next(11) * mon.LV);
mon.HP = mon.MAX_HP;
mon.MAX_MP = 0;
mon.MP = 0;
mon.EXP = 125 + (10 * mon.LV);
break;
case (int)Forest1_MonsterType.Bully:
Console.WriteLine("뭔가 허접해 보이는 양아치가 나타났다...!");
mon.NAME = "양아치";
mon.LV = 4 + rand.Next(-1, 2);
mon.TYPE = 1;
mon.ATT = 16 + (mon.LV * 2);
mon.DEF = 16 + (mon.LV * 2);
mon.MAX_HP = 150 + (rand.Next(11) * mon.LV);
mon.HP = mon.MAX_HP;
mon.MAX_MP = 0;
mon.MP = 0;
mon.EXP = 330 + (10 * mon.LV);
break;
default:
Console.WriteLine("야생의 여우가 나타났다...!");
mon.NAME = "여우";
mon.LV = 2 + rand.Next(-1, 2);
mon.TYPE = 0;
mon.ATT = 8 + (mon.LV * 2);
mon.DEF = 13 + (mon.LV * 2);
mon.MAX_HP = 80 + (rand.Next(11) * mon.LV);
mon.HP = mon.MAX_HP;
mon.MAX_MP = 0;
mon.MP = 0;
mon.EXP = 130 + (10 * mon.LV);
break;
}
return mon;
}
struct Player
{
//플레이어 이름
public string NAME;
//플레이어 레벨
public byte LV;
//플레이어 체력
public int MAX_HP;
public int HP;
// 플레이어 내공
public int MAX_MP;
public int MP;
// 플레이어 근력
public int STR;
// 플레이어 민첩
public int DEX;
// 플레이어 오성(레벨 업 포인트로 부여 불가)
public int INT;
// 플레이어 행운(레벨 업 포인트로 부여 불가)
public int LUK;
// 플레이어 공격력
public int ATT;
// 플레이어 방어력
public int DEF;
// 추가 능력치
public int STAT;
// 레벨업 필요 경험치
public int EXP;
}
static void ShowStatus(ref Player user)
{
Console.WriteLine("-----------------------------");
Console.WriteLine("* 이름 : " + user.NAME);
Console.WriteLine("* 레벨 : " + user.LV);
Console.WriteLine("* 체력 : " + user.HP + "/" + user.MAX_HP);
Console.WriteLine("* 내공 : " + user.MP + "/" + user.MAX_MP);
Console.WriteLine("* 근력 : " + user.STR);
Console.WriteLine("* 민첩 : " + user.DEX);
Console.WriteLine("* 오성 : " + user.INT);
Console.WriteLine("* 행운 : " + user.LUK);
Console.WriteLine("* 잔여 능력치 : " + user.STAT);
Console.WriteLine("* 다음 레벨 필요 경험치 : " + user.EXP);
Console.WriteLine("-----------------------------\n");
if (user.STAT > 0)
{
Console.WriteLine("*능력치를 부여 할 수 있습니다*");
Console.WriteLine("[1]. 능력치부여");
// sel1 능력치 부여 선택
string sel1 = "0";
// sel2 능력치 부여 종료 선택
string sel2 = "0";
// sel3 능력치 투자 선택
int sel3 = 0;
sel1 = Console.ReadLine();
if (sel1 == "1")
{
while (sel2 == "0")
{
Console.WriteLine("현재 " + user.STAT + "개의 능력치가 있습니다.");
int Plus_Status;
do
{
Console.WriteLine("얼마나 투자하시겠습니까?");
Plus_Status = int.Parse(Console.ReadLine());
} while (Plus_Status <= 0 || Plus_Status > user.STAT);
Console.WriteLine(Plus_Status + "개의 능력치를 어디에 추가하시겠습니까?");
Console.WriteLine("[1]. 근력에 추가");
Console.WriteLine("[2]. 민첩에 추가");
Console.WriteLine("[3]. 체력에 추가");
Console.WriteLine("[4]. 내공에 추가");
Console.WriteLine("[-]. 다시");
sel3 = int.Parse(Console.ReadLine());
switch (sel3)
{
case 1:
user.STR += Plus_Status;
user.STAT -= Plus_Status;
break;
case 2:
user.DEX += Plus_Status;
user.STAT -= Plus_Status;
break;
case 3:
user.MAX_HP += Plus_Status;
user.STAT -= Plus_Status;
break;
case 4:
user.MAX_MP += Plus_Status;
user.STAT -= Plus_Status;
break;
default:
Console.WriteLine("잘못된 입력. 능력치 부여로 돌아갑니다.");
break;
}
Console.WriteLine("능력치 부여를 그만하시겠습니까?");
Console.WriteLine("[1]. 네");
Console.WriteLine("[2]. 아니요 (계속)"); ;
int sel4 = int.Parse(Console.ReadLine());
while (sel4 != 1 && sel4 != 2)
{
Console.WriteLine("다시 입력해주세요...");
sel4 = Console.Read();
}
if (sel4 == 1)
break;
}
}
else
{
Console.WriteLine("상태창을 종료합니다.");
}
}
}
static Player CreatePlayer()
{
Random rand = new Random();
Boolean end_sig = false;
byte cnt = 4;
Player user;
Console.WriteLine("무협 온라인에 온 것을 환영합니다.");
Console.WriteLine("당신의 이름은?");
user.NAME = Console.ReadLine();
Console.Write(user.NAME);
Console.WriteLine("... 좋은 이름이네요.\n 당신의 육체를 구성합니다...");
user.STAT = 0;
user.EXP = 1000;
do
{
user.LV = 1;
user.MAX_HP = 100 + rand.Next(-50, 51);
user.HP = user.MAX_HP;
user.MAX_MP = 100 + rand.Next(-50, 51);
user.MP = user.MAX_MP;
user.STR = 10 + rand.Next(-5, 6);
user.DEX = 10 + rand.Next(-5, 6);
user.INT = 10 + rand.Next(-9, 10);
user.LUK = 10 + rand.Next(-10, 11);
user.ATT = 10 + user.STR;
user.DEF = 0;
Console.WriteLine("완료되었습니다.\n 당신의 육체는 아래와 같습니다...");
ShowStatus(ref user);
while (cnt > 0)
{
Console.WriteLine(cnt + "번의 재구성 기회가 남아있습니다. \n[1]. 이대로 하겠습니다.\n[2]. 뭐야, 내 육체 돌려줘요");
string temp = Console.ReadLine();
if(temp == "1")
{
end_sig = true;
break;
}
else if(temp == "2")
{
break;
}
else
{
Console.WriteLine("잘못된 입력입니다. 다시 입력해주세요.");
}
}
} while (end_sig == false && cnt-- > 0);
user.STAT = 10;
Console.WriteLine("육체 구성이 완료되었습니다... 게임을 시작합니다.");
return user;
}
static void PlayerHome(ref Player user)
{
Console.WriteLine("----------------집----------------");
Console.WriteLine("|깔끔하게 정돈되어 있는 방이다...|");
Console.WriteLine("|무엇을 하시겠습니까? |");
Console.WriteLine("|[1]. 휴식 (체력/내공 전회복) |");
Console.WriteLine("|[2]. 이동 (숲 초입) |");
Console.WriteLine("|[3]. 상태창 확인 |");
Console.WriteLine("----------------------------------");
string sel = "0";
while(sel == "0")
{
sel = Console.ReadLine();
if(sel == "1")
{
user.HP = user.MAX_HP;
user.MP = user.MAX_MP;
Console.WriteLine("... 몸의 피로가 모두 회복되었다!");
PlayerHome(ref user);
}
else if(sel == "2")
{
Console.WriteLine("숲 초입으로 이동합니다...");
Forest1(ref user);
break;
}
else if (sel == "3")
{
ShowStatus(ref user);
PlayerHome(ref user);
break;
}
Console.WriteLine("잘못된 입력입니다.");
}
}
static void Forest1(ref Player user)
{
Console.WriteLine("--------------숲 초입--------------");
Console.WriteLine("|곳곳에 여우와 토끼가 보인다... |");
Console.WriteLine("|가끔 양아치가 나타난다고 한다... |");
Console.WriteLine("|[1]. 사냥하기 |");
Console.WriteLine("|[2]. 이동(집) |");
Console.WriteLine("----------------------------------|");
int sel = 0;
while (sel == 0)
{
sel = int.Parse(Console.ReadLine());
if (sel == 1)
{
Monster mon = CreateMonster();
Forest1(ref user);
}
else if (sel == 2)
{
Console.WriteLine("집으로 이동합니다...");
PlayerHome(ref user);
break;
}
Console.WriteLine("잘못된 입력입니다.");
}
Forest1(ref user);
}
static void Main(string[] args)
{
//캐릭터 생성
Player User = CreatePlayer();
PlayerHome(ref User);
}
}
}
'Unity3D > 유니티 공부' 카테고리의 다른 글
[Unity 게임 개발을 위한 C# 공부 일지] 길찾기 - 3 (트리, 힙) (0) | 2021.05.15 |
---|---|
[Unity 게임 개발을 위한 C# 공부 일지] 길찾기 - 2 (그래프) (0) | 2021.05.12 |
[Unity 게임 개발을 위한 C# 공부 일지] 길찾기 - 1(미로 생성, 우수법) (0) | 2021.05.10 |
[Unity 게임 개발을 위한 C# 공부 일지] TextRPG 기초 제작 - 전투 (0) | 2021.04.07 |
[Unity 게임 개발을 위한 C# 공부 일지] TextRPG 기초 제작 - 캐릭터 생성 (0) | 2021.04.04 |