using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    internal class App
    {
        public int[,] gameMap;
        public App()
        {
            Console.WriteLine("플레이어 이동 시뮬레이션을 시작합니다.");
            Console.Write("플레이어의 이름을 입력해주세요: ");
            string heroName = Console.ReadLine();

            Console.WriteLine("맵 크기를 설정합니다.");
            Console.Write("가로의 길이를 입력해주세요: ");
            int row = Convert.ToInt32(Console.ReadLine());
            Console.Write("세로의 길이를 입력해주세요: ");
            int col = Convert.ToInt32(Console.ReadLine());

            gameMap = new int[row, col];

            Console.WriteLine("설정이 완료 되었습니다.");

            Hero hero = new Hero(heroName);
            hero.Init(gameMap, new Vector2(0, 0));  //게임맵과 초기 위치 설정
            hero.GameStart();
        }


    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{

    internal class Hero
    {
        public string heroName;
        public Vector2 position;
        private int[,] heroMap;
        public Hero(string name)
        {
            this.heroName = name;
        }

        public void GameStart()
        {
            while (true)
            {
                Console.Clear();

                Console.WriteLine("--------------------------------");
                Console.WriteLine("[World Map]");

                PrintPlayerMap();
                PrintPosition();

                Console.WriteLine("--------------------------------");
                Console.Write("원하시는 방향키를 입력하세요: ");

                ConsoleKey key = Console.ReadKey(true).Key;

                Vector2 targetPosition = this.position;

                switch (key)
                {
                    case ConsoleKey.LeftArrow:
                        targetPosition.y--;
                        break;
                    case ConsoleKey.RightArrow:
                        targetPosition.y++;
                        break;
                    case ConsoleKey.UpArrow:
                        targetPosition.x--;
                        break;
                    case ConsoleKey.DownArrow:
                        targetPosition.x++;
                        break;
                    default:
                        continue;
                }

                if (IsValidPosition(targetPosition))  //맵 범위 확인
                {
                    UpdatePosition(targetPosition);
                    UpdateHeroMap();
                }
                else
                {
                    continue;
                }
            }
        }
        public void Init(int[,] heroMap, Vector2 position)
        {
            this.heroMap = heroMap;
            this.UpdatePosition(position);  //초기 위치 설정  (위치)
            this.UpdateHeroMap(); //heroMap 업데이트 (2차원배열)
        }
        public void PrintPosition()
        {
            Vector2 transPosition = Utils.ConvertPosition2Index(this.position);

            Console.WriteLine("플레이어의 좌표: {0}, {1}", transPosition.x, transPosition.y); //좌표는 화면좌표계 **
        }

        bool IsValidPosition(Vector2 targetPosition)  //맵 범위 확인 메서드
        {
            if (targetPosition.x < 0 || targetPosition.y < 0 || targetPosition.x >= this.heroMap.GetLength(0) || targetPosition.y >= this.heroMap.GetLength(1))
            {
                return false;
            }
            return true;
        }
        //위치를 변경하는 메서드 
        void UpdatePosition(Vector2 targetPosition)
        {
            this.position = targetPosition;
        }

        //위치가 바뀔때마다 heroMap을 업데이트 함 
        void UpdateHeroMap()
        {
            // 위치를 초기화
            for (int i = 0; i < this.heroMap.GetLength(0); i++)
            {
                for (int j = 0; j < this.heroMap.GetLength(1); j++)
                {
                    this.heroMap[i, j] = 0;
                }
            }

            // hero의 위치를 업데이트
            this.heroMap[this.position.x, this.position.y] = 1;
        }

        //heroMap을 출력 
        public void PrintPlayerMap()
        {
            for (int i = 0; i < this.heroMap.GetLength(0); i++)
            {
                for (int j = 0; j < this.heroMap.GetLength(1); j++)
                {
                   
                    if (this.heroMap[i,j] == 0)
                    {
                        Console.Write("[");
                        for(int z=0;z<heroName.Length;z++)  //hero의 이름에 따라 칸 확장
                        {
                            Console.Write("  ");
                        }
                        Console.Write("]   ");
                        
                    }
                    else
                    {
                        Console.Write("[{0}]   ",heroName); //hero의 위치에 hero 이름 출력
                    }
                }
                Console.WriteLine();
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            new App();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    internal class Utils
    {
        public static Vector2 ConvertPosition2Index(Vector2 position)
        {
            return new Vector2(position.y, position.x);
        }
        public static Vector2 ConverIndex2Position(Vector2 index)
        {
            return new Vector2(index.y, index.x);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    internal struct Vector2
    {
        public int x;
        public int y;

        public Vector2(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
        


    }
}

'KDT > C# 프로그래밍' 카테고리의 다른 글

디자인 패턴  (0) 2023.07.26
(1x4) 2048  (0) 2023.07.26
2차원 배열 이동  (0) 2023.07.25
아이템 순차 출력  (0) 2023.07.25
1차원 인벤토리 + 용량 늘리기  (0) 2023.07.25

+ Recent posts