public class My_Stack<T>
{
private T[] data = new T[1000];
private int top = -1;
public bool IsEmpty()
{
// ****** CODE HERE ******
return top == -1;
// ***********************
}
public void Push(T item)
{
// ****** CODE HERE ******
top++;
data[top] = item;
// ***********************
}
public T Pop()
{
// ****** CODE HERE ******
if (top == -1)
{
throw new InvalidOperationException("Stack is empty.");
}
T item = data[top];
data[top] = default;
top--;
return item;
// ***********************
}
public int Count()
{
// ****** CODE HERE ******
return top + 1;
// ***********************
}
}
// 구현 확인을 위한 코드입니다.
class Program
{
static void Main(string[] args)
{
Stack<int> s = new Stack<int>();
My_Stack<int> s_new = new My_Stack<int>();
for (int i = 0; i < 10; ++i)
{
s.Push(i);
s_new.Push(i);
}
while (s.Count > 0)
{
Console.WriteLine($"s => {s.Pop()} | s_new => {s_new.Pop()}");
Console.WriteLine($"size of q : {s.Count} | size of s_new : {s_new.Count}");
Console.WriteLine("------------------------------------------------------");
}
}
}
class Program
{
struct ScreenOption
{
public string Description;
public LinkedList<string> Options;
}
static Stack<string> screenStack = new Stack<string>();
static Dictionary<string, (string Description, LinkedList<string> Options)> screens = new Dictionary<string, (string, LinkedList<string>)>
{
{ "MainScreen", ("메인 화면", new LinkedList<string>(new[] { "CharacterScreen", "InventoryScreen" })) },
{ "CharacterScreen", ("캐릭터 화면", new LinkedList<string>(new[] { "StatusScreen", "EquipmentScreen" })) },
{ "InventoryScreen", ("인벤토리 화면", new LinkedList<string>(new[] { "UseItemScreen", "DropItemScreen" })) },
{ "StatusScreen", ("상태 화면\n여기에는 캐릭터의 상태가 표시됩니다.", new LinkedList<string>()) },
{ "EquipmentScreen", ("장비 화면\n여기에는 캐릭터의 장비가 표시됩니다.", new LinkedList<string>()) },
{ "UseItemScreen", ("아이템 사용 화면\n여기에는 사용할 수 있는 아이템이 표시됩니다.", new LinkedList<string>()) },
{ "DropItemScreen", ("아이템 버리기 화면\n여기에는 버릴 수 있는 아이템이 표시됩니다.", new LinkedList<string>()) }
};
static void Main(string[] args)
{
// 초기 화면 설정
screenStack.Push("MainScreen");
// 화면 출력 루프 시작
while (screenStack.Count > 0)
{
DisplayScreen();
}
}
// 화면 출력 및 입력 처리 메서드
static void DisplayScreen()
{
while (true)
{
Console.Clear();
string currentScreen = screenStack.Peek();/* TODO : 현재 Screen을 Stack으로 부터 받아오는 기능 작성 */
var screenData = screens[currentScreen];
Console.WriteLine(screenData.Description);
int optionNumber = 1;
foreach (var option in screenData.Options)
{
Console.WriteLine($"{optionNumber}. {screens[option].Description.Split('\n')[0]}으로 이동");
optionNumber++;
}
// 스택의 크기에 따라 "0. 종료" 또는 "0. 뒤로 돌아가기" 옵션 추가
if (screenStack.Count == 1)
Console.WriteLine("0. 종료");
else
Console.WriteLine("0. 뒤로 돌아가기");
string input = Console.ReadLine();
if (input == "0")
{
// TODO : 0을 입력받을 경우 전 화면으로 돌아가는 기능 작성 ********
// screenStack의 가장 상단 screen을 제거 **************************
screenStack.Pop();
// ****************************************************************
break;
}
else
{
int selectedOption;
if (int.TryParse(input, out selectedOption) && selectedOption > 0 && selectedOption <= screenData.Options.Count)
{
var selectedScreen = GetScreenByOptionNumber(screenData.Options, selectedOption);
if (selectedScreen != null)
{
// TODO : 다음으로 이동할 screen을 설정해주는 기능 작성 ****
// screenStack에 selectedScreen을 집어넣기 *****************
screenStack.Push(selectedScreen);
// *********************************************************
break;
}
}
Console.WriteLine("잘못된 입력입니다. 다시 시도해주세요.");
}
}
}
static string GetScreenByOptionNumber(LinkedList<string> options, int optionNumber)
{
if (optionNumber <= 0 || optionNumber > options.Count)
return null;
var currentNode = options.First;
for (int i = 1; i < optionNumber; i++)
currentNode = currentNode.Next;
return currentNode.Value;
}
}