인프런 커뮤니티 질문&답변
격자 생성 안됨 무한루프
작성
·
82
·
수정됨
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)조건에서 실행이 올바르게 끝나는지 디버깅 출력에서 관찰해 보세요.이전 유사한 질문 사례:
- 25x25 에서 안멈추고 반복되는거같은데 한번 봐주실수있나요??에도 비슷한 이슈가 있습니다. 이 사례를 참고하여 코드 수정의 힌트를 얻으실 수 있을 것입니다.
- 아래의 링크에서도 한 줄의 간격이나
Console.WriteLine사용의 유의점을 확인하실 수 있습니다. 이는 표현에서 중요한 역할을 합니다.
- 25x25 에서 안멈추고 반복되는거같은데 한번 봐주실수있나요??에도 비슷한 이슈가 있습니다. 이 사례를 참고하여 코드 수정의 힌트를 얻으실 수 있을 것입니다.
마지막으로, 이러한 무한루프 및 오류 상황에서 주요한 점은 조건식과 배열의 크기 및 초기화 과정이 명확하게 정의되어 있는지를 체크하는 것입니다. 제안드린 링크와 함께, 단계별로 문제를 풀어나가시면 좋겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





