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 |