728x90
Main 스크립트
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Algorithm
{
class Board
{
const char CIRCLE = '\u25cf';
public TileType[, ] _tile;
public int _size;
public enum TileType
{
Empty,
Wall,
}
public void Initialize(int size)
{
_tile = new TileType[size, size];
_size = size;
for (int y = 0; y < _size; y++)
{
for (int x = 0; x < _size; x++)
{
if (x == 0 || x == size - 1 || y == 0 || y == size - 1)
{
_tile[y, x] = TileType.Wall;
}
else
{
_tile[y, x] = TileType.Empty;
}
}
}
}
public void Render()
{
ConsoleColor prevColor = Console.ForegroundColor;
for (int y = 0; y < _size; y++)
{
for (int x = 0; x < _size; x++)
{
Console.ForegroundColor = GetTileColor(_tile[y, x]);
Console.Write(CIRCLE);
}
Console.WriteLine();
}
Console.ForegroundColor = prevColor;
}
ConsoleColor GetTileColor(TileType type)
{
switch (type)
{
case TileType.Empty:
return ConsoleColor.Green;
case TileType.Wall:
return ConsoleColor.Red;
default:
return ConsoleColor.Green;
}
}
}
}
Board 스크립트
using System;
namespace Algorithm
{
class Program
{
static void Main(string[] args)
{
Board board = new Board();
board.Initialize(25);
Console.CursorVisible = false;
const int WAIK_TICK = 1000 / 30;
int lastTick = 0;
while (true)
{
#region 프레임 관리
int curTick = Environment.TickCount & Int32.MaxValue;
if (curTick - lastTick < WAIK_TICK)
{
continue;
}
else
{
lastTick = curTick;
}
#endregion
// 입력
// 로직
// 렌더링
Console.SetCursorPosition(0, 0);
board.Render();
}
}
}
}
Binary Tree Algorithm
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Algorithm
{
class Board
{
const char CIRCLE = '\u25cf';
// 게임 중 맵의 크기가 변하지 않으니 배열을 사용하는 것이 유용함
public TileType[, ] _tile; // 배열
public int _size;
public enum TileType
{
Empty,
Wall,
}
public void Initialize(int size)
{
if (size % 2 == 0)
{
return;
}
_tile = new TileType[size, size];
_size = size;
GenerateByBinaryTree();
}
void GenerateByBinaryTree()
{
// 길 막기
for (int y = 0; y < _size; y++)
{
for (int x = 0; x < _size; x++)
{
if (x % 2 == 0 || y % 2 == 0)
{
_tile[y, x] = TileType.Wall;
}
else
{
_tile[y, x] = TileType.Empty;
}
}
}
// 랜덤으로 길 뚫기
// Binary Tree Algorithm
Random rand = new Random();
for (int y = 0; y < _size; y++)
{
for (int x = 0; x < _size; x++)
{
if (x % 2 == 0 || y % 2 == 0)
{
continue;
}
if (x == _size - 2 && y == _size - 2)
{
continue;
}
if (y == _size - 2)
{
_tile[y, x + 1] = TileType.Empty;
continue;
}
if (x == _size - 2)
{
_tile[y + 1, x] = TileType.Empty;
continue;
}
if (rand.Next(0, 2) == 0)
{
_tile[y, x + 1] = TileType.Empty;
}
else
{
_tile[y + 1, x] = TileType.Empty;
}
}
}
}
}
}
GenerateBySideWinder
void GenerateBySideWinder()
{
// 길 막기
for (int y = 0; y < _size; y++)
{
for (int x = 0; x < _size; x++)
{
if (x % 2 == 0 || y % 2 == 0)
{
_tile[y, x] = TileType.Wall;
}
else
{
_tile[y, x] = TileType.Empty;
}
}
}
// 랜덤으로 길 뚫기
// Side Wionder Algorithm
Random rand = new Random();
for (int y = 0; y < _size; y++)
{
int count = 1;
for (int x = 0; x < _size; x++)
{
if (x % 2 == 0 || y % 2 == 0)
{
continue;
}
if (x == _size - 2 && y == _size - 2)
{
continue;
}
if (y == _size - 2)
{
_tile[y, x + 1] = TileType.Empty;
continue;
}
if (x == _size - 2)
{
_tile[y + 1, x] = TileType.Empty;
continue;
}
if (rand.Next(0, 2) == 0)
{
_tile[y, x + 1] = TileType.Empty;
count++;
}
else
{
int randomIndex = rand.Next(0, count);
_tile[y + 1, x - randomIndex * 2] = TileType.Empty;
count = 1;
}
}
}
}728x90
'C# > 코드' 카테고리의 다른 글
| C# 연결 리스트 만들기 (0) | 2021.09.14 |
|---|---|
| C# 동적 배열 만들기 (0) | 2021.09.09 |
| C# 다차원 배열을 이용한 코드 (0) | 2021.09.01 |