작성
·
74
·
수정됨
0
F11을 눌러서 확인 했을 때
public 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;
}
이 부분에서 무한루프를 돌고 있습니다
아래는 전체 코드입니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace C__알고리즘_6_플레이어_이동
{
class Board
{
const char CIRCLE = '\u25cf';
public TileType[,] Tile { get; private set; } //배열
public int Size { get; private set; }
public int DestY { get; private set; }
public int DestX { get; private set; }
Player _player;
public enum TileType
{
Empty,
Wall,
}
public void Initialize(int size, Player player)
{
if (size % 2 == 0)
return;
_player = player;
Tile = new TileType[size, size];
Size = size;
DestY = Size - 2;
DestX = Size - 2;
GenerateBySideWinder();
}
public 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;
}
// 랜덤으로 우측 혹은 아래로 길을 뚫는 작업
// Binary Tree 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 (y == Size - 2 && x == 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 ramdomIndex = rand.Next(0, count);
Tile[y + 1, x - ramdomIndex * 2] = TileType.Empty;
count = 1;
}
}
}
}
public void Render()
{
ConsoleColor prevColor = Console.ForegroundColor;
for (int y = 0; y < Size; y++)
{
for (int x = 0; x < Size; x++)
{
// 플레이어 좌표를 갖고 와서, 그 좌표랑 현재 y, x가 일치하면 플레이어 전용 색상으로 표시
if (y == player.PosY && x == player.PosX)
Console.ForegroundColor = ConsoleColor.Blue;
else if(y == DestY && x == DestX)
Console.ForegroundColor = ConsoleColor.Yellow;
else
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;
}
}
}
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 이강토님.
무한루프 문제로 어려움을 겪고 계신 것 같네요. 프로그램을 디버깅 중이라는 것은 코드의 동작을 추적하고 있다는 뜻이겠네요. 여러분의 상황을 이해하기 위해 코드를 살펴보았습니다.
현재 코드의 주요 문제는 무한루프와 관련하여 보이지는 않지만, 전반적인 코드에서 오류가 발생할 가능성이 존재하기 때문에 몇 가지 확인하고 수정해볼 부분을 안내드립니다.
F11 디버깅: 코드의 디버깅을 위해 Visual Studio에서 F11을 사용하면 코드를 한 줄씩 실행하며 상태를 확인할 수 있습니다. for
루프가 계속 반복되는 부분에서 값을 직접 확인하여 루프의 종료 조건이 맞는지 확인하세요.
Random Number Generation: 코드를 확인해보니 rand.Next
를 통해 랜덤한 값을 생성하고 있네요. 이때, rand.Next(0, 2)
는 0 또는 1을 생성하는데, 이 조건들이 잘 설정되어 있는지, 특히 ramdomIndex
가 제대로 작동하는지 확인하세요.
Table 초기화 부분: Tile[y, x]
배열이 제대로 설정되었는지 확인해 보세요. 특히 Tile
배열이 작동할 때, 무한루프 상태에 빠지지 않도록 배열을 잘 초기화했는지 확인하는 것이 필요합니다.
조건문들: if
및 else if
조건이 올바르게 작동하는지 확인해야 합니다. 특히 (y == Size - 2 && x == Size - 2)
조건에서 실행이 올바르게 끝나는지 디버깅 출력에서 관찰해 보세요.
이전 유사한 질문 사례:
Console.WriteLine
사용의 유의점을 확인하실 수 있습니다. 이는 표현에서 중요한 역할을 합니다.마지막으로, 이러한 무한루프 및 오류 상황에서 주요한 점은 조건식과 배열의 크기 및 초기화 과정이 명확하게 정의되어 있는지를 체크하는 것입니다. 제안드린 링크와 함께, 단계별로 문제를 풀어나가시면 좋겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.