C#/수업 내용

[C#] 2021-09-01 2차원 배열을 사용해 맵 만들고 캐릭터 이동

JSH1 2021. 9. 1. 18:39
class App
{
    Map[,] map =
    {
        { new Map(100), new Map(100), new Map(100), new Map(100), new Map(301), new Map(301), new Map(302), new Map(302), new Map(304) },
        { new Map(200), new Map(200), new Map(200), new Map(200), new Map(201), new Map(100), new Map(305), new Map(306), new Map(307) },
        { new Map(100), new Map(308), new Map(100), new Map(100), new Map(200), new Map(100), new Map(100), new Map(100), new Map(100) },
        { new Map(100), new Map(100), new Map(100), new Map(100), new Map(200), new Map(200), new Map(200), new Map(200), new Map(200) }
    };

    Purin purin;

    public App()
    {
        map[2, 0].obj = new Tree();
        map[3, 3].obj = new Tree();
        purin = new Purin(new Vector2(1, 0));
        PrintMap();

        while (true)
        {
            ConsoleKeyInfo info = Console.ReadKey();
            Console.Clear();
            switch (info.Key.ToString())
            {
                case "RightArrow":
                    MoveCheck(0, 1);
                    break;

                case "LeftArrow":
                    MoveCheck(0, -1);
                    break;

                case "DownArrow":
                    MoveCheck(1, 0);
                    break;

                case "UpArrow":
                    MoveCheck(-1, 0);
                    break;
            }
            
            Console.WriteLine("푸린 좌표(y:{0},x:{1})", purin.position.y, purin.position.x);
            PrintMap();
        }
    }

    void MoveCheck(int y, int x)
    {
        switch (y)
        {
            case 1: // DownArrow
                if (this.purin.position.y + y < map.GetLength(0))
                {
                    this.purin.MoveDown(map[purin.position.y + y, purin.position.x].mapCode, map[purin.position.y + y, purin.position.x].obj);
                }
                else
                {
                    Console.WriteLine("아래쪽으로 이동할 수 없습니다.");
                }
                break;

            case -1: // UpArrow
                if (this.purin.position.y > 0)
                {
                    this.purin.MoveUp(map[purin.position.y + y, purin.position.x].mapCode, map[purin.position.y + y, purin.position.x].obj);
                }
                else
                {
                    Console.WriteLine("위쪽으로 이동할 수 없습니다.");
                }
                break;
        }

        switch (x)
        {
            case 1: // RightArrow
                if (this.purin.position.x + x < map.GetLength(1))
                {
                    this.purin.MoveRight(map[purin.position.y, purin.position.x + x].mapCode, map[purin.position.y, purin.position.x + x].obj);
                }
                else
                {
                    Console.WriteLine("오른쪽으로 이동할 수 없습니다.");
                }
                break;

            case -1: // LeftArrow
                if (this.purin.position.x > 0)
                {
                    this.purin.MoveLeft(map[purin.position.y, purin.position.x + x].mapCode, map[purin.position.y, purin.position.x + x].obj);
                }
                else
                {
                    Console.WriteLine("왼쪽으로 이동할 수 없습니다.");
                }
                break;
        }
    }

    void PrintMap()
    {
        for (int y = 0; y < map.GetLength(0); y++)
        {
            for (int x = 0; x < map.GetLength(1); x++)
            {
                if (y == purin.position.y && x == purin.position.x)
                {
                    Console.Write("@");
                }

                else if (map[y, x].obj == null)
                {
                    if (map[y, x].mapCode >= 100 && map[y, x].mapCode < 200)
                    {
                        Console.Write("▒");
                    }
                    else if (map[y, x].mapCode >= 200 && map[y, x].mapCode < 300)
                    {
                        Console.Write("□");
                    }
                    else if (map[y, x].mapCode >= 300)
                    {
                        Console.Write("▧");
                    }
                }
                
                else
                {
                    if (map[y, x].obj.ToString() == "Tree")
                    {
                        Console.Write("♣");
                    }
                }
            }
            Console.WriteLine();
        }
    }
}
class Map
{
    public int mapCode;
    public Object obj;

    public Map(int mapCode)
    {
        this.mapCode = mapCode;
    }
}
class Tree
{
    public Tree()
    {
        //Console.WriteLine("길막 오브젝트 나무 생성");
    }
}
struct Vector2
{
    public int x;
    public int y;

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

    public Purin(Vector2 position)
    {
        this.position = position;
        Console.WriteLine("푸린 입장(y:{0},x:{1})", this.position.y, this.position.x);
    }

    public void MoveUp(int mapCode, Object obj)
    {
        if (mapCode >= 300)
        {
            Console.WriteLine("위쪽으로 이동할 수 없습니다.");
        }

        else if (obj != null && obj.ToString() == "Tree")
        {
            Console.WriteLine("나무가 길을 막아 이동할 수 없습니다.");
        }

        else
        {
            this.position.y -= 1;
            Console.WriteLine("위쪽으로 한 칸 이동합니다.");
        }
    }

    public void MoveDown(int mapCode, Object obj)
    {
        if (mapCode >= 300)
        {
            Console.WriteLine("아래쪽으로 이동할 수 없습니다.");
        }

        else if (obj != null && obj.ToString() == "Tree")
        {
            Console.WriteLine("나무가 길을 막아 이동할 수 없습니다.");
        }

        else
        {
            this.position.y += 1;
            Console.WriteLine("아래쪽으로 한 칸 이동합니다.");
        }
    }

    public void MoveLeft(int mapCode, Object obj)
    {
        if (mapCode >= 300)
        {
            Console.WriteLine("왼쪽으로 이동할 수 없습니다.");
        }

        else if (obj != null && obj.ToString() == "Tree")
        {
            Console.WriteLine("나무가 길을 막아 이동할 수 없습니다.");
        }

        else
        {
            this.position.x -= 1;
            Console.WriteLine("왼쪽으로 한 칸 이동합니다.");
        }
    }

    public void MoveRight(int mapCode, Object obj)
    {
        if (mapCode >= 300)
        {
            Console.WriteLine("오른쪽으로 이동할 수 없습니다.");
        }

        else if (obj != null && obj.ToString() == "Tree")
        {
            Console.WriteLine("나무가 길을 막아 이동할 수 없습니다.");
        }

        else
        {
            this.position.x += 1;
            Console.WriteLine("오른쪽으로 한 칸 이동합니다.");
        }
    }
}

Hello World.exe
0.01MB