아래는 전체코드가 있으니 과제중인분들은 주의하세요 !!
저는 솔직히 과제를 하려고 찾아보다가 전체코드를 보면 굉장히 속상했습니다.
금일 공부는 사실 아래 전체코드의 주석을 달아놓은것으로도 복습이 되겠지만
앞으로도 재밌게 쓸만한 부분이고, 완전 새로운 기능을 공부했기에 따로 빼서 짚고 넘어가도록 하겠다.
중간에 데이터 저장용으로 샘플 코드를 작성한게 있으니 전체코드를 보는 분들은 사용에 주의하길 바랍니다~
우선 오늘 배운 내용은 Timer를 이용한것 입니다.
우선 타이머 사용을 위한 유징문을 작성 해주시고
아래의 코드는 1~9의 숫자중에 랜덤값이 9가 나왔을때 플레이어의 공격차례가 되게 만들어놨습니다.
턴은 대기턴, 공격턴, 방어턴이 있고 아래와 같이 공격 및 방어는 랜덤값으로 갑작스럽게 정해지고
그때
Console.WriteLine을 통해 공격차례임을 알려주고
timer = new System.Timers.Timer(3000); //timer에 타이머 설정 3000ms (1000=1초)
timer.AutoReset = false; // 이부분은 타이머가 자동으로 다시 켜질지 정하는 부분이라고 배움
timer.Start(); // 위에서 설정한 timer 시작
그리고 아래에 적힌 키 입력이벤트에 timer.Enavled 이부분을 이용해서 타이머가 켜져있는지 확인하고
그 값이 true 인동안 반복문을 통해 키가 입력될때마다
그 값을 더해 3초안에 10번 클릭을 완료했는지 확인하여 공격 성공여부를 확인하는 과정을 거쳤습니다.
해당 코드를 통해 전투시스템을 긴장감있게 만드는데 성공해서 기쁩니다.
그리고 사실 야심작은 아스키코드로 그린 전투그림입니다(그림판으로 직접 그림)
아래는 해당 TextRpg의 전체코드 입니다.
이미 작성을 다 하고 나서도 복습할겸 주석을 계속 달아놓는편이라 주석만 봐도 공부에 도움이 될것으로 보입니다.
using System;
using System.IO;
using System.Timers;
using System.Collections;
using System.Collections.Generic;
using System.Net.Security;
using Newtonsoft.Json;
namespace MyTextRpg
{
public class Item
{
//아이템쪽 변수선언
public string Name { get; set; }
public int Price { get; set; }
public string Description { get; set; }
public int Type { get; set; } // 0: 방어구, 1: 무기
public float Stat { get; set; }
public bool IsEquipped { get; set; } // 장착 여부
public Item(string name, int price, string description, int type, float stat)
{
Name = name;
Price = price;
Description = description;
Type = type;
Stat = stat;
IsEquipped = false; // 기본값은 장착되지 않음
}
}
public class GameData // 데이터저장쪽 작성중 ******************************************************************************************************************************
{
public int level { get; set; }
public int exp { get; set; }
public int liveHp { get; set; }
public int gold { get; set; }
public Item[] Inventory { get; set; }
}// 아직 더 정리필요 저장쪽 메서드에서 리스트값을 제대로 저장 및 불러오는 코드도 작성해야함
public class SaveLoadSystem
{
private static string filePath = "gameData.json";
// 게임 데이터를 저장하는 메서드
public static void SaveGame(GameData data)
{
string json = JsonConvert.SerializeObject(data, Formatting.Indented);
File.WriteAllText(filePath, json);
Console.WriteLine("저장완료");
}
// 게임 데이터를 불러오는 메서드
public static GameData LoadGame()
{
if (File.Exists(filePath))
{
string json = File.ReadAllText(filePath);
GameData data = JsonConvert.DeserializeObject<GameData>(json);
Console.WriteLine("게임을 불러왔습니다 !");
return data;
}
else
{
Console.WriteLine("불러올 파일이 없습니다 !");
return null;
}
}
}// 작성중***********************************************************************************************************************************************************************************************************************************
public class Program
{
private static int dKeyPressCount = 0;
static bool defenseMode = false; // 방어태세
private static System.Timers.Timer timer;
static int level = (exp / 100) + 1;
static int exp = 100;
int job = 1; //직업 1: 전사
float baseStr = 9.5f + (level * 0.5f); // 공격력
float baseDef = 4 + (level * 1f); // 방어력
static int maxHp = 100; // 최대 체력
static int hp = maxHp - liveHp;// 현재 체력
static int liveHp; // 깎인 체력
int gold = 1500; // 돈
public List<Item> inventory = new List<Item>();//인벤토리용 아이템 리스트
public List<Item> shopItems = new List<Item>();//상점용 아이템 리스트
//전투매커니즘 만들기
static Random random = new Random(); //랜덤값용
public Program()
{
// 상점에 아이템 추가 이름, 금액, 설명, 아이템종류(방어구:0 무기:1), 증가수치
shopItems.Add(new Item("가죽 갑옷", 300, "방어력을 5 증가시킵니다.", 0, 5f));
shopItems.Add(new Item("철 갑옷", 800, "방어력을 15 증가시킵니다.", 0, 15f));
shopItems.Add(new Item("다이아몬드 갑옷", 2000, "방어력을 40 증가시킵니다.", 0, 40f));
shopItems.Add(new Item("강철 검", 500, "공격력을 10 증가시킵니다.", 1, 10f));
shopItems.Add(new Item("은 검", 1000, "공격력을 20 증가시킵니다.", 1, 20f));
shopItems.Add(new Item("황금 검", 1500, "공격력을 30 증가시킵니다.", 1, 30f));
}
public static void Main()
{
Program game = new Program();
game.Run();
}
public void Run()
{
while (true)
{
Console.Clear();
Console.WriteLine("MyTextRpg에 오신것을 환영합니다.");
Console.WriteLine("제대로 즐기기 위해 F11을 눌러 전체화면으로 플레이 해주시길 바랍니다.");
Console.WriteLine("");
Console.WriteLine("1. 상태 보기");
Console.WriteLine("2. 인벤토리");
Console.WriteLine("3. 상점");
Console.WriteLine("4. 던전 입장");
Console.WriteLine("5. 휴식하기");
Console.WriteLine("0. 종료");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">> ");
string choice = Console.ReadLine();
switch (choice)
{
case "1":
Stat();
break;
case "2":
Inventory();
break;
case "3":
Shop();
break;
case "4":
Dungeon();
break;
case "0":
return;
case "5":
Rest();
break;
default:
Console.WriteLine("잘못된 입력입니다.");
break;
}
}
}
public void Stat()
{
// 공격력 및 방어력 계산용 변수
float totalStr = baseStr;
float totalDef = baseDef;
// 포리치를 통해 아이템 리스트에서 불값으로 장착중인지 확인하여 공, 방 계산
foreach (var item in inventory)
{
if (item.IsEquipped)
{
if (item.Type == 0) // 장착중이면 더해줌 (방어력)
totalDef += item.Stat;
else if (item.Type == 1) // (공격력)
totalStr += item.Stat;
}
}
Console.Clear();
Console.WriteLine("상태 보기");
Console.WriteLine("캐릭터의 정보가 표시됩니다.");
Console.WriteLine("");
Console.WriteLine("Lv. {0}", level);
Console.WriteLine("Exp {0}/100%", exp % 100);
Console.WriteLine("직업: {0}", job == 1 ? "전사" : "기타");
Console.WriteLine("(기본 공격력 : {0}) (무기 공격력 : {1}) 총 공격력 : {2}", baseStr, totalStr - baseStr, totalStr);
Console.WriteLine("(기본 방어력 : {0}) (방어구 방어력 : {1}) 총 방어력 : {2}", baseDef, totalDef - baseDef, totalDef);
Console.WriteLine("체력: {0}", hp);
Console.WriteLine("Gold: {0} G", gold);
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
Console.ReadLine();
}
public void Dungeon()
{
Console.Clear();
Console.WriteLine("던전에 입장합니다...");
// 던전 난이도 랜덤 결정
int dungeonLevel = random.Next(1, 4); // 1: 쉬움, 2: 보통, 3: 어려움
//난이도별 골드
int baseGold = dungeonLevel == 1 ? 1000 : dungeonLevel == 2 ? 1700 : 2500;
// 난이도출력
Console.WriteLine(dungeonLevel == 1 ? "쉬운 던전" : dungeonLevel == 2 ? "보통 던전" : "어려운 던전");
// 보스 체력 설정
int bossHp = dungeonLevel == 1 ? 50 : dungeonLevel == 2 ? 100 : 150;
//둘중 하나가 죽을때까지 배틀
while (bossHp > 0 && hp > 0)
{
Battle(ref bossHp, dungeonLevel);
}
if (hp <= 0)
{
Console.WriteLine("캐릭터가 사망했습니다. 게임 오버.");
// 캐릭터 정보 초기화
}
else
{
// 보상지급
float attackBonus = baseStr * ((float)random.Next(10, 21) / 100); // 공격력 보너스
int totalGold = baseGold + (int)attackBonus;
Console.WriteLine($"던전을 클리어했습니다! 보상: {totalGold} G, 경험치: 100 XP");
gold += totalGold;
exp += 100;
//경험치가 가득차면
if (exp >= 100 * level)
{//레벨업 및 방어력 공격력 증가
level++;
baseStr += 0.5f;
baseDef += 1f;
Console.WriteLine($"레벨 업! 현재 레벨: {level}");
}
Console.WriteLine("0. 나가기");
Console.ReadLine();
}
}
public void Battle(ref int bossHp, int dungeonLevel)
{
Console.Clear();
Console.WriteLine("보스와 전투 시작!");
int attackCounter = 0; // 10번채우면 공격
while (bossHp > 0 && hp > 0)
{
Console.Clear();
DisplayBattleField();
Console.WriteLine($"플레이어 HP: {hp} | 보스 HP: {bossHp}");
Console.WriteLine("");
Console.WriteLine("보스와 플레이어는 서로 자신의 공격차례에만 공격할 수 있습니다.");
Console.WriteLine("");
Console.WriteLine(" 공격 : A 방어 : D ");
Console.WriteLine("");
Console.WriteLine(" 지금은 서로 대치중입니다 !");
Console.WriteLine("");
Console.WriteLine("대치상황에서는 S를 눌러 다음턴으로 넘어갈 수 있습니다 S를 계속 눌러주세요 !!");
ConsoleKeyInfo keyInfo = Console.ReadKey(true);
if (random.Next(1, 10) == 9)
{
Console.WriteLine("당신이 공격할 수 있는 기회입니다 ! 공격하려면 A를 3초안에 10번 누르세요 !!!");
timer = new System.Timers.Timer(3000);
timer.AutoReset = false;
timer.Start();//3초 타이머 시작
// 키 입력 이벤트
while (timer.Enabled)//타이머 진행되는동안 반복문
{
if (Console.KeyAvailable)
{
keyInfo = Console.ReadKey(true);
if (keyInfo.Key == ConsoleKey.A)
{
attackCounter++;
}
}
}// 반복문이 돌아가는동안 D키를 10번이상 눌렀다면
if (attackCounter >= 10)
{
Console.WriteLine("성공! A 키를 10번 눌렀습니다.");
Console.WriteLine("공격 성공!"); ;
attackCounter = 0;
bossHp -= (int)baseStr;
PlayAttackAnimation();//공격
}
else
{
Console.WriteLine("실패! A 키를 10번 누르지 못했습니다.");
}
}
// 몬스터 공격 (랜덤)
if (random.Next(1, 13) == 12)
{
defenseMode = false; //방어태세가 되어있을수 있으니 false로 바꿔줌
Console.WriteLine("보스가 공격을 준비합니다! 방어하려면 D를 3초안에 10번 누르세요 !!!");
//타이머설정
timer = new System.Timers.Timer(3000);
timer.AutoReset = false;
timer.Start();//3초 타이머 시작
// 키 입력 이벤트
while (timer.Enabled)//타이머 진행되는동안 반복문
{
if (Console.KeyAvailable)
{
keyInfo = Console.ReadKey(true);
if (keyInfo.Key == ConsoleKey.D)
{
dKeyPressCount++;
}
}
}// 반복문이 돌아가는동안 D키를 10번이상 눌렀다면
if (dKeyPressCount >= 10)
{
Console.WriteLine("성공! D 키를 10번 눌렀습니다.");
Console.Write("방어 준비!");
defenseMode = true;// 방어모드 켜주고
}
else
{
Console.WriteLine("실패! D 키를 10번 누르지 못했습니다.");
}
// 방어모드라면
if (defenseMode == true)
{// 방어성공 출력 후
Console.WriteLine("방어 성공 !");
defenseMode = false;// 방어모드 꺼주고
PlayDefenseAnimation();//방어 보여주기
}//실패라면
else
{
Console.WriteLine("방어 실패! 보스의 공격!");
int damage = (int)(baseDef - (dungeonLevel * 10));
damage = damage <= 0 ? 10 : damage;// 데미지가 0혹은 음수면 최소데미지인 10를 줌
liveHp += damage;
PlayHitAnimation();// 맞기
}
}
Thread.Sleep(500);
}
}
public void DisplayBattleField()
{
Console.Clear();
Console.WriteLine(" ,- ");
Console.WriteLine(" @! @@@#. ");
Console.WriteLine(" .@@@ .$@$@@#. ");
Console.WriteLine(" -@@@@* .*@@@@#=@@. *@: ");
Console.WriteLine(" .@@@@@@ .;@@@$$#@@@@ @; ");
Console.WriteLine(" .#@@@@@# ,$@@$: .~$@; @; ");
Console.WriteLine(" @@@#@@@. ,!@@=~ =@!. :@; ");
Console.WriteLine(" .#@@#-@@$ ;#@#~ !@@=!@@: ");
Console.WriteLine(" ,#@@$.$@@: ,#@!, .-=@@#- ");
Console.WriteLine(" .#@@#.-@@# !@@. .~~, ");
Console.WriteLine(" @@@# =@@~ #@= ");
Console.WriteLine(" #@@@. @@@~ #= ");
Console.WriteLine(" :@@@@, :@@@ .@= ");
Console.WriteLine(" ~@@@@, $@@. *@* ");
Console.WriteLine(" ,@@@* -@@@@. ,@@$ .@@@#. ");
Console.WriteLine(" ,@@@@@$ ~@@@@ #@@ :@@@@@@ ");
Console.WriteLine(" ,@@@@@@@$ :@@@; .@@@ ~@@$.~@@. ");
Console.WriteLine(" ,@@#-;@@@ =#@@=. :@@* :@!. ,$@$~ ");
Console.WriteLine(" ,@@#-;@@@ .@@@@ @@@, :@, ,=@#~ ");
Console.WriteLine(" !!. .$@@@@@@: $@@@, :@@* !@, ;@@~ ");
Console.WriteLine(" ;@@@;: .$@@@@# $@@@; @@@, :@@. :@@ ");
Console.WriteLine(" ~@@@@@#:~.=@@*. ~@@@@@#~ -@@@ .#@: $@- ");
Console.WriteLine(" -==@@@@@=;@@*---- .$@@@=@@@@~=@@~ ,;$@= -@* ");
Console.WriteLine(" *#@@@@@@@@@@@@~~~~!@@@# !@@@@@@@ -=@@#- .@@- ");
Console.WriteLine(" ~#@@@@@@@@@@@@@@@@@: ;@@@@@= ~#@@@; . $@$, ");
Console.WriteLine(" ..~@@@@@@@@@@@@@- .@@*@ ,$@@@@@~,#@# $@@@##=~ ");
Console.WriteLine(" ~@@! .~~~~ ,#@@= :@@@@*, ,=@@@@@@@@=, ");
Console.WriteLine(" ~@@! #@! ~@@@= *@@@$@@!;@@# ");
Console.WriteLine(" ~@@! ,@@ @@=@@: ,#@@: *@; ");
Console.WriteLine(" ~@@! ,@~ =: ~@= ,#@@@~ -@@ ");
Console.WriteLine(" ~@@! ,@= :~ :@$=@@! @@ ");
Console.WriteLine(" ~@@! #@- .--------. ,. ;=; @@ ");
Console.WriteLine(" ~@@! ;@! *@@@@@@@@$===*. @@ ");
Console.WriteLine(" ~@@! ##~ ,:::::::;#####- ~@@ ");
Console.WriteLine(" -*@@$ ;@@*;- !@- ");
Console.WriteLine(" .:@@@@@$ ;@@@@=~~- :@@ ");
Console.WriteLine(" !@@@@@@@! .:;*@@@@$!;. ,;#@* ");
Console.WriteLine(" -@@@@# :@@@; ,**$@@@@=~~~, ~$@#! ");
Console.WriteLine(" !@@@@: ~@@@@ .$@@@@@@@@@@@@@@@@@. ");
Console.WriteLine(" !@@$. -@@@@ ...;@@@@@@@@@#- ");
Console.WriteLine(" ,~ -@@@ ");
Console.WriteLine(" ~;~ ");
}
public void PlayAttackAnimation()
{
Console.Clear();
Console.WriteLine(" .=#!-. ");
Console.WriteLine(" ;@@@@*. ");
Console.WriteLine(" .-::::~ @@!;#@* ");
Console.WriteLine(" .~$@@@@@@#@#. -#$ ");
Console.WriteLine(" ,*@@@$;;=@@@$ #$ ");
Console.WriteLine(" ~#@@$~ @@: #$ ");
Console.WriteLine(" :$@@*, @@=, ;@$ ");
Console.WriteLine(" *@@#- =@@$*@@= ");
Console.WriteLine(" ,@@; .$@@@: ");
Console.WriteLine(" =@#. .--, ");
Console.WriteLine(" .@@: ");
Console.WriteLine(" .@$- ");
Console.WriteLine(" .@* ");
Console.WriteLine(" !@* ");
Console.WriteLine(" .... ,@@; ");
Console.WriteLine(" ;@@@@: !@@@#- ");
Console.WriteLine(" ;@@@@@@- .!*@@=~~~~~, ,#@@=#@= ");
Console.WriteLine(" ;@@@@@@@@- @$.@@@@@@@@@#####: #@@! ~@$. ");
Console.WriteLine(" !@@=,.#@@~ @@@@@@@@@@@@@@@@@@@@@@@@*!!=@@@; ");
Console.WriteLine(" !@@@!~@@@~ @@@- -$$$$$#@@@@@@@@@@@@@@@@@@@@@@@=,,, ");
Console.WriteLine(" *# .#@@@@@@@ @@@- .....*@@@@@@@@@@@@@@@@@@@$!# ");
Console.WriteLine(" .@@@=;- ,$@@@@@; @@@- -$@$;;;;;#@@@@@@@*~@ ");
Console.WriteLine(" .@@@@@@$...#@@@ .....@@@@@- .*@#. ..:@@@@@@@@@@#, ");
Console.WriteLine(" ,;@@@@@@#*;@@@ =@@@@@@@@@@* ~$@@===@@@@@@@@@@@-- ");
Console.WriteLine(" *@@@@@@@@@@@@@@; ;@@@@@@@@@@@$ !@@@@@@@@@@@@@@@@@= ");
Console.WriteLine(" .$@@@@@@@@@@@@@@@@@@@@@@@@##@@@$ .,$@@@@@@@@@@@##~ .=@$ ");
Console.WriteLine(" ,-##*@@@@@@@@@@@@@@@~--- -@@$ -==@@@@@@@@@@@--, ~@@#=- ");
Console.WriteLine(" ;@@@!!!!!#@@@@*: -@@$ -::@@@@@@@@@@@#@@@: :#@@@@@#!~. ");
Console.WriteLine(" ;@@@ -@@@@@@@@@@@@@@@@=@@@@#. ,$@@@@@@@@@@: ");
Console.WriteLine(" ;@@@ -@@@@@@@@@@@@: ;@@@@~ ~@@@@#@#~:#@@~ ");
Console.WriteLine(" ;@@@ ,#@$@@$** =@$ -@@=#@#. !@@@- !@=. ");
Console.WriteLine(" ;@@@ $@ .=: -$@. .;@@@@, ,#@. ");
Console.WriteLine(" ;@@@ $@* ,: ,=@*=@@* =@. ");
Console.WriteLine(" ;@@@ ~@@, ,,,,,,,,,. .. .=$; =@. ");
Console.WriteLine(" ;@@@ =@~ ,#@@@@@@@@$====: =@. ");
Console.WriteLine(" ;@@@ ~@=. ;!!!!!!!*@@@@@# -#@. ");
Console.WriteLine(" .!@@@. #@$~,. ,,,,,. :@=. ");
Console.WriteLine(" ,#@@@@$ ,#@@@$; ,$@: ");
Console.WriteLine(" ;#@@@@@@$ ~@@@@@##$- .*@#- ");
Console.WriteLine(" .~@@@@##@@@: :#@@@@@@=,. :@@@; ");
Console.WriteLine(" .$@@@@! $@@@! ,,~$@@@@#$$$: ,$@@=, ");
Console.WriteLine(" @@@@$, =@@@=. ,;=@@@@@@@@@@@@@@@@*. ");
Console.WriteLine(" #@@: #@@@= :##########= ");
Console.WriteLine(" ,, =@@= ");
//공격
Thread.Sleep(2000);
}
public void PlayDefenseAnimation()
{
Console.Clear();
Console.WriteLine(" -$#*:. ");
Console.WriteLine(" .~==============================~ .*@@@@=, ");
Console.WriteLine(" ~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .:;;;;-~@@;;#@= ");
Console.WriteLine(" -$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$: ,!$@@@@@##@$ ~##. ");
Console.WriteLine(" -$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#@@@ ,=@@@#$$@@@@= $#. ");
Console.WriteLine(" *=. .@@@ .!@@@$- .-@@~ $#. ");
Console.WriteLine(" !@@@ .@@@ .:#@@=- @@: -##. ");
Console.WriteLine(" !@@@ .@@@ -#@@$, @@@*:@@#. ");
Console.WriteLine(" !@@@ .@@@ #@#;. ~*@@@@=~ ");
Console.WriteLine(" !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@@; :@@=. ");
Console.WriteLine(" !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$. ");
Console.WriteLine(" !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@: ");
Console.WriteLine(" !@@@*****************************@@@@@ ");
Console.WriteLine(" !@@@ .@@@@@ ");
Console.WriteLine(" !@@@ .@@@@$ ");
Console.WriteLine(" .!===: ;@@@. .@@@@#!- ");
Console.WriteLine(" *@@@@@: .#@@! .@@@@@@$. ");
Console.WriteLine(" .*@@@@@@@: .#@@! ;@@@~:@@- ");
Console.WriteLine(" ~@@@@$@@@@ .#@@*,,,,,,,,,,,,,,, @@@@ @@;. ");
Console.WriteLine(" ~@@#- -@@@ .#@@@@@@@@@@@@@@@@@@$$$$$$$$$$$$@@@@ *@@#- ");
Console.WriteLine(" ~@@@@~@@@@ .#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ;$@$- ");
Console.WriteLine(" =#. *@@@@@@@~ .#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ,$@#- ");
Console.WriteLine(" ,@@@$;~ *@@@@@#. .#@@! ;;;;;;;;;;=@@@@@ ,=@* ");
Console.WriteLine(" ,@@@@@@@, *@@@: .#@@! .*@@@@@ ~@@- ");
Console.WriteLine(" -!@@@@@@@*~@@@: .#@@$ ~=@@$@@@ =@; ");
Console.WriteLine(" :#@@@@@@@@@@@@@@~....*@@@@# ,=@@@=.@@@ !@@. ");
Console.WriteLine(" .;$@@@@@@@@@@@@@####@@@@$. ,;$@@$;,.@@@ ~@@! ");
Console.WriteLine(" ,~*$!@@@@@@@@@@@@@@@@@*,,,,,,. .~$@@@#~ ,*@@@ .*@@=!-,,. ");
Console.WriteLine(" ,@@@=;;;;*@@@@@@@@@@@@@@@#;;;;;;;;;;=@@@##@*:$@@@@ .!@@@@@@$!~. ");
Console.WriteLine(" ,@@@: ----~#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, ;$@@@@@@@@@=: ");
Console.WriteLine(" ,@@@: .#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@* .=@@@@#@$:!#@#~ ");
Console.WriteLine(" ,@@@: .#@@*,,,,,,,:*******@@=***$@@@@@@@@@: .,-#@@#, ,=@*. ");
Console.WriteLine(" ,@@@: .#@@! @@. -$!~;#@@@@ .*@@@$ ~@@, ");
Console.WriteLine(" ,@@@: .#@@! @@. . ~@@@@ ;@@@@@=, $@, ");
Console.WriteLine(" ,@@@: .#@@! #@! .@@@ ,!; *@@! $@, ");
Console.WriteLine(" ,@@@: .#@@! :@@ .@@@@@@@@@*. $@, ");
Console.WriteLine(" ,@@@: *@@$ .@@, .@@@@@@@@@@@@@@@* $@, ");
Console.WriteLine(" ,@@@: ~@@@...... ;@@- .@@@ !#####; :@#. ");
Console.WriteLine(" -=@@@$ ~#~$@@@@@@$**********@@@=*~ .@@@ !@; ");
Console.WriteLine(" .~@@@@@@# ~#~=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#= :@@: ");
Console.WriteLine(" !@@@@@@@@! ~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#.$. ,;#@=. ");
Console.WriteLine(" -=@@@@$-$@@@! ~@@@------:$$$$$$$$$$$$$$$$@@@@@@@=@-,,. .-$@@=, ");
Console.WriteLine(" ;#@@@$: $@@@!. ~@@@ .;;;;!@@@@@@@#!;;;;;;;;*@@#: ");
Console.WriteLine(" @@@#*, .$@@@=. ~@@@ .@@@===$@@@@@@@@@@@#*~ ");
Console.WriteLine(" :$#~ $@@@; ~@@@ .@@@ .:::::::::::- ");
Console.WriteLine(" .. .=@@~ !@@@$$$$$:~~~~~~~~~~~~~~~, .@@@ ");
Console.WriteLine(" .~- .#@@@@@@@@@@@@@@@@@@@@@@@@#******@@@: ");
Console.WriteLine(" .#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ");
Console.WriteLine(" ,!!!!!!!!!#@@@@@@@@@@@@@@@@@@@@@@@@@. ");
// 방어
Thread.Sleep(2000);
}
public void PlayHitAnimation()
{
Console.Clear();
Console.WriteLine(" -@@@#- ");
Console.WriteLine(" ,=@#@@#- ");
Console.WriteLine(" .,,,,, -*@@@@*;@@- =@@ ");
Console.WriteLine(" -$#@@@@@$= ~$@@@@@@@@@@ @@ ");
Console.WriteLine(" .:=@@@@@@@@@!. :$@@#!::*#@@= @@ ");
Console.WriteLine(" .$@@@@@@@@@@@@@=. ,*@@#;, #@. @@ ");
Console.WriteLine(" ~#@@@#!-----$@@@@*. -*#@#;, #@=-.!@@ ");
Console.WriteLine(" @@@@!, !$@@@; ,$@@=. *@@$*@@$ ");
Console.WriteLine(" *@@@: .$@@#. !@@~ ,$@@@:. ");
Console.WriteLine(" #@@* ,!!. .#@@: ,#@= ,::- ");
Console.WriteLine(" .@@@- =@@@~- :@@* ;@#. ");
Console.WriteLine(" .@@@- =@@@@@*, :@@* !@; ");
Console.WriteLine(" .@@@~ ,=@@@@@@#*@@* !@~ ");
Console.WriteLine(" =@@= .:@@@@@@@@, ,#@~ ");
Console.WriteLine(" ~@@@* -!@@@@@@*- !@@;, ");
Console.WriteLine(" =@@@@@: @@@@@@@@@@ ,$@@@@, ");
Console.WriteLine(" =@@@@@@@#*****@@@@@*@@@@@@@* !@@$;#@; ");
Console.WriteLine(" ;@@@@@@@@@@@@@@@@@@; ~@@@@@@@; ~@@#- *@= ");
Console.WriteLine(" ;@@@;-@@@@@@@@@@@$. ,$@@@@@@$, ~@$, !@@$, ");
Console.WriteLine(" ;@@#~,$@@@#####:~ ~;#@@@@@=!, ~@! .!@@$, ");
Console.WriteLine(" ,- ~@@@@@@@@: ,=@@@@@@!, :@! ,#@$. ");
Console.WriteLine(" -#@$:. ~@@@@@@$ -#@@@@@#*.. -$@; ,$@$ ");
Console.WriteLine(" ~@@@@@$: :@@@@*, :!=@@@@@@:. .@@$, ,@@~ ");
Console.WriteLine(" !@@@@@@@#.~@@@. .@!. -#@@@@@@*.*@@~ !@; ");
Console.WriteLine(" ,:=@@@@@@=@@@*!!!; #@@@=. ~$@@@@@@@@*. -@#~ ");
Console.WriteLine(" #@@@@@@@@@@@@@@@@@@@@@#: ;@@@@#;. .@@*. ");
Console.WriteLine(" --@@;@@@@@@@@@@@@@@@* :#@@@!. ~*; !@@$*, ");
Console.WriteLine(" -@@@=****#@@@@=! ,$@@$=@@~;#@@, !#@@@@@$;- ");
Console.WriteLine(" -@@@. ,$@@$ *@@@@* -#@@@@@@@@@#~ ");
Console.WriteLine(" -@@@. !@$, .=@@@$, !@@@@#@#;;@@@#@! ");
Console.WriteLine(" -@@@. -@@~ *@@#@@! *@@#, $@@@@ ");
Console.WriteLine(" -@@@. -@= :#, !@# .;@@@$. -=@@@@~ ");
Console.WriteLine(" -@@@. -@= ,; -$= -=@@@#;:!@@@@# ");
Console.WriteLine(" -@@@. -@@~ -=$-*@@@@@@@@ ");
Console.WriteLine(" -@@@. *@= ,!!!!!!!!!, ~@@@@@=@@ ");
Console.WriteLine(" -@@@. -##. !@@@@@@@@@@@@@@@@@@@@. @@ ");
Console.WriteLine(" -@@@. *@*. ,,,,,,,,!@@@@@@@@@~. :@@ ");
Console.WriteLine(" -!@@@~ -#@$:~. ~=@@@@*- !@! ");
Console.WriteLine(" .@@@@@@~ ~@@@@@: ~@@@@@! -@@- ");
Console.WriteLine(" $@@@@@@@@~ -::#@@@@#*!- #@@@@$. -!@@= ");
Console.WriteLine(" :@@@@@:,#@@@~ ;$$#@@@@#:,,!@@@@#~ .~#@@* ");
Console.WriteLine(" *@@@@:. ,#@@@= .,-=@@@@@@@@@@#$$$$#@@#, ");
Console.WriteLine(" #@@$; ,#@@@! ");
Console.WriteLine(" @@ ,@@@@ ");
Console.WriteLine(" ,#@! ");
//보스가 공격
Thread.Sleep(2000);
}
public void Inventory()
{
Console.Clear();
Console.WriteLine("인벤토리");
Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.");
Console.WriteLine("");
Console.WriteLine("[아이템 목록]");
//아이템이 없으면
if (inventory.Count == 0)
{
Console.WriteLine("인벤토리에 아이템이 없습니다.");
}
else // 있으면
{// 0부터 가지고 있는만큼
for (int i = 0; i < inventory.Count; i++)
{
var item = inventory[i];
string equippedText = item.IsEquipped ? "[E] " : "";// 장착중이면 표시하기위해
//가지고 있는 아이템들 모두 출력
Console.WriteLine("{0}{1} - {2}", equippedText, item.Name, item.Description);
}
}
Console.WriteLine("");
Console.WriteLine("1. 장착 관리");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
string choice = Console.ReadLine();
if (choice == "1")
{
Equip();
}
}
public void Equip()
{
Console.Clear();
Console.WriteLine("인벤토리 - 장착 관리");
Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.");
Console.WriteLine("");
//아이템이 없으면
if (inventory.Count == 0)
{
Console.WriteLine("장착할 아이템이 없습니다.");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
else
{//있으면 모두 표시
for (int i = 0; i < inventory.Count; i++)
{
var item = inventory[i];
string equippedText = item.IsEquipped ? "[E] " : "";
Console.WriteLine("{0}. {1}{2} - {3}", i + 1, equippedText, item.Name, item.Description);
}
Console.WriteLine("");
Console.WriteLine("장착또는 해제할 아이템 번호를 선택하세요");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
string input = Console.ReadLine();
if (int.TryParse(input, out int itemIndex) && itemIndex > 0 && itemIndex <= inventory.Count)
{
Item selectedItem = inventory[itemIndex - 1];
//장착중인 아이템 선택시 장착 해제
if (selectedItem.IsEquipped)
{
selectedItem.IsEquipped = false;
Console.WriteLine("{0}을(를) {1}했습니다.", selectedItem.Name, selectedItem.IsEquipped ? "장착" : "해제");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
//장착중이지 않다면
else if (!selectedItem.IsEquipped)
{
//선택한 아이템이 방어구라면
if (selectedItem.Type == 0)
{ //true : 장착중인게있음 false : 없음
bool check = false;
//인벤토리에 아이템을 하나씩체크
for (int i = 0; i < inventory.Count; i++)
{
var item = inventory[i];
if (selectedItem.Type == 0)
{//방어구중 장착한 아이템이 있는지 확인하고
check = item.IsEquipped ? true : false;// 장착중이면 표시하기위해
item.IsEquipped = false; // 장착해제해주고
}
}
if (check) //이미 장착중인 방어구가 있다면
{
Console.WriteLine("");
selectedItem.IsEquipped = true;
Console.WriteLine("장착중이던 장비를 해제하고");
Console.WriteLine("{0}을(를) {1}했습니다.", selectedItem.Name, selectedItem.IsEquipped ? "장착" : "해제");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
else
{
selectedItem.IsEquipped = true;
Console.WriteLine("{0}을(를) {1}했습니다.", selectedItem.Name, selectedItem.IsEquipped ? "장착" : "해제");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
}
else
{
bool check = false;
for (int i = 0; i < inventory.Count; i++)
{
var item = inventory[i];
if (selectedItem.Type == 1)
{//무기중 장착한 아이템이 있는지 확인하고
check = item.IsEquipped ? true : false;// 장착중이면 표시하기위해
item.IsEquipped = false; // 장착해제
}
}
if (check) //이미 장착중인 무기가 있다면
{
Console.WriteLine("");
selectedItem.IsEquipped = true;
Console.WriteLine("장착중이던 장비를 해제하고");
Console.WriteLine("{0}을(를) {1}했습니다.", selectedItem.Name, selectedItem.IsEquipped ? "장착" : "해제");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
else
{
selectedItem.IsEquipped = true;
Console.WriteLine("{0}을(를) {1}했습니다.", selectedItem.Name, selectedItem.IsEquipped ? "장착" : "해제");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
}
}
}
}
Console.ReadLine();
}
public void Shop()
{
Console.Clear();
Console.WriteLine("상점");
Console.WriteLine("필요한 아이템을 얻을 수 있는 상점입니다.");
Console.WriteLine();
Console.WriteLine("[보유 골드]");
Console.WriteLine("{0} G", gold);
Console.WriteLine("");
for (int i = 0; i < shopItems.Count; i++)
{
Item item = shopItems[i];
if (inventory.Contains(item))
{
Console.WriteLine("{0} - 구매 완료", item.Name);
}
else
{
Console.WriteLine("{0} - {1} G", item.Name, item.Price);
}
}
Console.WriteLine("");
Console.WriteLine("1. 아이템 구매");
Console.WriteLine("2. 아이템 판매");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
int choice = int.Parse(Console.ReadLine());
//아래는 아이템 번호에 따른 아이템 구매
if (choice == 1)
{
ShopBuy();
}
else if (choice == 2)
{
ShopSell();
}
}
//구매용상점
public void ShopBuy()
{
Console.Clear();
Console.WriteLine("상점");
Console.WriteLine("필요한 아이템을 얻을 수 있는 상점입니다.");
Console.WriteLine();
Console.WriteLine("[보유 골드]");
Console.WriteLine("{0} G", gold);
Console.WriteLine("");
for (int i = 0; i < shopItems.Count; i++)
{
Item item = shopItems[i];
if (inventory.Contains(item))
{
Console.WriteLine("{0}. {1} - 구매 완료", i + 1, item.Name);
}
else
{
Console.WriteLine("{0}. {1} - {2} G", i + 1, item.Name, item.Price);
}
}
Console.WriteLine("");
Console.WriteLine("구매를 원하는 아이템 번호를 입력해주세요.");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
string choice = Console.ReadLine();
//아래는 아이템 번호에 따른 아이템 구매
if (int.TryParse(choice, out int selectedItem) && selectedItem > 0 && selectedItem <= shopItems.Count)
{
BuyItem(selectedItem - 1);
}
}
//판매용상점
public void ShopSell()
{
Console.Clear();
Console.WriteLine("판매 상점");
Console.WriteLine("필요없는 아이템을 판매할 수 있는 상점입니다.");
Console.WriteLine();
Console.WriteLine("[보유 골드]");
Console.WriteLine("{0} G", gold);
Console.WriteLine();
Console.WriteLine("[아이템 목록]");
if (inventory.Count == 0)
{
Console.WriteLine("보유중인 아이템이 없습니다.");
Console.WriteLine();
Console.WriteLine("0. 나가기");
Console.WriteLine();
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
else
{
// 인벤토리 목록을 출력
for (int i = 0; i < inventory.Count; i++)
{
var item = inventory[i];
string equippedText = item.IsEquipped ? "[E] " : "";
Console.WriteLine("{0}. {1}{2} - {3} - 판매가격 : {4} G",
i + 1, equippedText, item.Name, item.Description, (item.Price * 0.85));
}
Console.WriteLine();
Console.WriteLine("판매할 아이템 번호를 선택하세요");
Console.WriteLine();
Console.WriteLine("0. 나가기");
Console.WriteLine();
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
string input = Console.ReadLine();
if (int.TryParse(input, out int itemIndex) && itemIndex > 0 && itemIndex <= inventory.Count)
{
Item selectedItem = inventory[itemIndex - 1];
if (selectedItem.IsEquipped) // 장착중인 아이템이면 해제
{
selectedItem.IsEquipped = false;
Console.WriteLine("{0}의 장착을 해제했습니다.", selectedItem.Name);
}
// 아이템 판매
double sellPrice = selectedItem.Price * 0.85;
gold += (int)sellPrice; // 판매 후 골드 추가
Console.WriteLine("{0}을(를) {1} G에 판매했습니다.", selectedItem.Name, (int)sellPrice);
inventory.Remove(selectedItem); // 인벤토리에서 아이템 제거
Console.WriteLine();
Console.WriteLine("0. 나가기");
Console.WriteLine();
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
else if (itemIndex == 0)
{
return; // 나가기 선택 시 함수 종료
}
else
{
Console.Clear();
Console.WriteLine("잘못된 선택입니다.");
Console.WriteLine();
Console.WriteLine("0. 나가기");
Console.WriteLine();
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
}
Console.ReadLine();
}
public void BuyItem(int index)
{
Item item = shopItems[index];
if (inventory.Contains(item))
{
Console.WriteLine("이미 구매한 아이템입니다.");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
else if (gold >= item.Price)
{
gold -= item.Price;
inventory.Add(item);
Console.WriteLine("{0}을(를) 구매하였습니다!", item.Name);
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
else
{
Console.WriteLine("골드가 부족합니다.");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
}
Console.ReadLine();
}
public void Rest()
{
Console.Clear();
Console.WriteLine("휴식하기");
Console.WriteLine("현재 체력 : {0}", hp);
Console.WriteLine("500 G를 내면 체력을 회복할 수 있습니다. (보유 골드 : {0})", gold);
Console.WriteLine("");
Console.WriteLine("1. 휴식하기");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
int choice = int.Parse(Console.ReadLine());
if (choice == 1)
{
if (gold >= 500)
{
gold -= 500;
liveHp = 0;
Console.WriteLine("");
Console.WriteLine("체력이 모두 회복되었습니다.");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
Console.ReadLine();
}
else
{
Console.WriteLine("");
Console.WriteLine("골드가 부족합니다.");
Console.WriteLine("");
Console.WriteLine("0. 나가기");
Console.WriteLine("");
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">>");
Console.ReadLine();
}
}
}
}
}