44,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
연결 리스트 구현에서 힙 관련 질문입니다!
연결리스트를 만들고 Remove를 하는 과정에서 이미 만들어진 MyLinkedListNode는 이미 AddLast()에서 new를 통해 객체를 만들어준 상태인데, Remove()에서는 그 주소를 참조하지 못하게 해서 지워버린것으로 이해했습니다. 그렇다면 그 객체는 주소가 없어지지만 힙에 남아있다고 이해했는데, 이 객체는 주소가 참조를 다시 할 수 없게 되어서 바로 자동으로 삭제되는지, 아니면 그대로 공간을 잡아먹는지 궁금해서 질문드립니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
A* 알고리즘의 f=g+h에 대해서 질문이 있습니다.
이와같이 빙 돌아갈때 h가 증가하는데 결과적으로 예약한 좌표들의 우선순위(f=g+h)가 의도한 빨간색 화살표 방향과 다르게 역전이 되는 경우가 생각났습니다 이런 경우는 A*알고리즘으로 해결할 수 없나요? 아니면 제가 잘못 이해하고 있는건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
14분 30초 부근 질문 있습니다
14:30 부근 부모의 좌표를 역추적하는 과정에서 // #1 while (true) { if (parent[y,x] == new Pos(y,x)) break; } // #2 while (true) { if (parent[y,x] .Y == y && parent[y,x].X == x) break; }첫번째 케이스의 경우 작동하지 않았고 두번째 케이스의 경우 코드가 정상적으로 작동했습니다 첫번째 케이스의 경우 "(y,x)의 부모가 (y,x) 자기 자신이냐"고 묻는 의도로 코드를 작성했지만 의도대로 작동하지 않았나 봅니다 어떤 문제가 있는 건지 궁금합니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
Program.cs의 TickCount 부분이 문제가 되어 프로그램이 작동되지 않습니다.
'미로 준비' 챕터의 오른손 법칙까지 강의를 듣고 이어서 트리를 배우고 해당 BFS 길찾기 강의 까지 온 그 며칠 사이에 TickCount가 음수로 반환되어 프레임 관리 부분에 걸려 무한루프를 돌고 있습니다. 전에는 잘 출력됐었는데 말이에요. 구글링에선 프로그램을 오버플로어 때문에 몇날며칠 켜두면 그렇게 된다고 하는데 당연히 전 그렇게 프로그램을 돌리지도 않아서 더 의아할 따름입니다... 강사님께서 오른손 법칙에 올리셨던 코드로도 빌드를 해보았지만 여전히 동일한 문제가 발생되네요. 왜 이렇게 나오는걸까요? visual studio 2019 버전이고 따로 비주얼을 업데이트 하거나 그러진 않았습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
재귀함수로 돌아간다하더라도
재귀함수로 돌아간다하더라도먼저 시작한 포문은 끝이 날떄까지 계속 돌아가는건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
링크드리스트 Remove 삭제 질문입니다
MyLinkedList.AddLast로 노드의 마지막에요소를 추가하는거는 이해가 되었어요!그리고 삭제할 요소가 있다면MyLinkedListNode node = MyLinkedList.AddLast(데이터)이렇게 노드에 집어넣고MyLinkedList.Remove(node);로 삭제하는것도 이해가 되었는데그럼 링크드리스트의 경우 중간에 삭제해야하는 데이터가 있다면 처음에 여러데이터를 AddLast로 추가하면서 삭제할 데이터만 미리MyLinkedListNode에 넣으면서 AddLast로 추가하는것인지궁금합니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
BFS 제가 이해한것이 맞나요??
이해하기가 너무 여렵긴한데 25x25 좌표 미로를 만들고 큐에다가 가장 가까운 node를 하나씩 추가하는 작업을 계속 반복을 합니다. 양 갈래길이 나오더라도 계속 추가하면서 가장 가까운곳, 먼저 예약된곳부터 방문하는식으로 반복을 계속하다가 목표 지점에 도착하게되면 코드 lastIndex가 _points.Count 보다 크거나 같다고 될때 멈추게되는데 q.Count = 0 이될때까 while에서 빠져나오게되면서 멈추는것인가요? 제가 설명을 잘못하는 이유가 아직 이해를 다 못해서 인거같습니다. 요약을 하자면 이미 코드를 실행하면 컴퓨터가 모든 인접해있는 곳들을 (if문에 걸리는 것들을 제외하고) BFS 알고리즘대로 이미 다 searching을 하고 render하는 부분에서 가장 적은 q반복횟수 인 경로를 거꾸로 Revers()해서 보여주는것인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
플레이어 이동이 이상한 것에 관한 질문
두번째 while문 parent좌표를 꺼내올때 코드에서의 질문입니다. while(parent[y, x].Y != y || parent[y,x].X != x) { _points.Add(new Pos(y, x)); y = parent[y,x].Y; x = parent[y,x].X; } 저는 위와 같이 Y와 X에 parent[y,x]에서 바로 Y와 X를 가져와서 대입하는 식으로 코드를 작성하였습니다. 하지만 이 방식으로 코드를 작성하니 문제가 생겼습니다. 위 그림과 같이 플레이어가 모든 코너에서 그러는 것은 아니지만, 중간중간 코너를 지나갈때 코너를 거치지 않고 화살표 방향(대각선)으로 바로 이동하는 문제입니다. (미로는 잘 찾아갑니다) while(parent[y, x].Y != y || parent[y,x].X != x) { _points.Add(new Pos(y, x)); Pos pos = parent[y, x]; y = pos.Y; x = pos.X; } 그래서 혹시나 싶어서 선생님이 작성하신대로 위와 같이 변수 pos를 선언후에 parent[y,x]를 저장하여 y와 x에 대입하는 식으로 코드를 변경하였더니 모든 코너를 찍고 지나가며 정상적인 이동을 보여주었습니다. 위 코드와 아래 코드의 차이점이 무엇이고 왜 문제가 발생 하는것인가요? 과정의 차이일 뿐 결과는 같아야 하는것 아닌가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
연결리스트 구현
public void Remove(MyLinkedListNode<T> room) { if(Head == room) { Head = Head.Next; } if(Tail == room) { Tail = Tail.Prev; } if(room.Prev != null) { room.Prev.Next = room.Next; if(room.Next != null) { room.Next.Prev = room.Prev; } Count--; } 저는 여기서 room.Prev != null 부분과 room.Next != null 판별 부분이 왜 필요한지 의문을 가지게 됐습니다! 앞서 Head == room 부분과 Tail ==room 부분에서 이미 예외적인 경우를 체크 했기 때문에 그 외의 경우는 당연히 room.Next와 room.Prev는 null이 아니기 떄문에 굳이 쓸 이유가 없다고 생각했습니다. 그래서 저는 room.Prev.Next = room.Next; room.Next.Prev = room.Prev; 이부분은 무조건 실행 돼야 했다고 생각했습니다. 최종적으로 public void Remove(MyLinkedListNode<T> room) { if(Head == room) { Head = Head.Next; } if(Tail == room) { Tail = Tail.Prev; } room.Prev.Next = room.Next; room.Next.Prev = room.Prev; Count--; } null 판단 부분을 지우고 브레이크 포인트를 잡아서 실행을 했는데 차이가 없었습니다. 혹시 다른 측면에서 문제가 있을까요??
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
BFS 함수 구현 도중 예외 발생 질문 드립니다.
public int[,] adj = new int[6, 6] { { 0, 1, 0, 1, 0, 0 }, { 1, 0, 1, 1, 0, 0 }, { 0, 1, 0, 0, 0, 0 }, { 1, 1, 0, 0, 1, 0 }, { 0, 0, 0, 1, 0, 1 }, { 0, 0, 0, 0, 1, 0 } }; 강의에서 처럼 위와 같이 그래프를 생성 하였고 public void BFS(int start) { bool[] found = new bool[6]; Queue<int> q = new Queue<int>(); found[start] = true; q.Enqueue(start); Console.WriteLine(start); while (q.Count > 0) { int now = q.Dequeue(); for (int next = 0; next < adj.GetLength(now); next++) { if (adj[now, next] == 0) continue; if (found[next]) continue; q.Enqueue(next); found[next] = true; Console.WriteLine(next); } } } 아래 BFS함수도 강의를 보고 작성 해보았는데 빨간색 글씨로 써놓은 adj.GetLength(now)부분에서 IndexOutOfRangeException 예외가 발생합니다. 선생님은 강의중 6으로 코딩을 하셨지만 조금 더 동적인 코딩을 해보고 싶어서 GetLength함수를 사용하였습니다. 그런데 디버깅을 해보면 adj.GetLength(0) 은 6으로 잘 나오지만 adj.GetLength(3)이 되면 예외가 발생하는데, 왜 예외가 발생하는지 궁금합니다. adj 배열의 4번째 차원은 원소가 6개이므로 6이 반환되어야 하는것 아닌가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
25 x 25 질문입니다
강사님 while(true) 로 하고 강사님의 코드와 똑같이하고 실행하면 마우스 커서 포인트가 0,0 에서 25*25 계속 생성이 안되고 쭉 내려오는식으로 계속 생성이 됩니다. using System; namespace Algorithm { class Program { static void Main(string[] args) { Console.CursorVisible = false; const int WAIT_TICK = 1000 / 30; const string CIRCLE = "●"; int lastTick = 0; while(true) { #region 프레임 관리 // FPS 프레임 ( 60프레임 OK 30프레임 이하로 내려가면 뚝뚝 끊긴다) int currentTick = System.Environment.TickCount & Int32.MaxValue; // 만약에 경과한 시간이 1/30 초볻 작다면 continue; 한다. if(currentTick - lastTick < WAIT_TICK) continue; lastTick = currentTick; #endregion // 1. 입력 // 2. 로직 // 3. 렌더링 Console.SetCursorPosition(0, 0); for(int i = 0; i < 25; i++) { for(int j =0; j< 25; j++) { Console.ForegroundColor = ConsoleColor.Green; System.Console.Write(CIRCLE); } System.Console.WriteLine(); } } } } }
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
DFS 그래프 질문드립니다.
public void DFS(int now) { Console.WriteLine(now); visited[now] = true; for(int next = 0; next < 6; next++) { if (adj[now, next] == 0) continue; if (visited[next]) continue; DFS(next); } } 이 함수에서 1. adj [ 2, 5 ] 까지 for 문을 돌다가 next 값이 6이 되면 그대로 함수를 종료시키지않고 왜 DFS(next); 로 가는건가요?? 2. 1번항목에서 DFS(next); 로 돌아갔을때 next 값이 2가 되는이유가 궁금합니다
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
AddLast함수 문의 드립니다
AddLast 함수에서 최초에 아직 방이 아예 없을시에 Head가 newRoom을 가리키고 동시에 Tail이 newRoom을 가리키게 되어 의문이 있었습니다. 그런데, 최초의 데이터 1개만 존재하는 상태이기 때문에 그 1개의 데이터를 Head이자 동시에 Tail로 설정이 되는 코드인것 같은데, 그렇게 생각하면 맞는지요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
Remove() 함수 질문입니다.
위에서 보시면 room이 105(Tail)일때 ②와 ③이 동시에 참일텐데... room이 Tail이므로 ③에서 room.Next는 아무값도 존재하지 않지만 그냥 Null로 처리되어서 문제가 없는 것인지요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
Tail = newRoom; 질문 드립니다
구문중에 36줄 Tail = newRoom; 이 부분 질문입니다. 첨부한 그림을 보시면 제가 이해한 방식인데요.(마우스 우버튼ㅡ새 탭에서 이미지 열기ㅡ로 크게 보실수 있습니다)제가 Tail.Next와 newRoom.Prev를 연결하여 연결포탈을 만드는것까지는 이해를 하였는데요. 최종적으로 Tail에 newRoom의 주소를 덮어쓰는(?) 부분이 이해가 어렵군요. 왜냐면 Tail은 newRoom이 추가되기 전 마지막 방의 주소인데, Tail에 newRoom의 주소를 넣게 되면(덮어쓰기?) 새로운 방이 추가되는 것이 아니라 기존 마지막방 주소를 새로운 방의 주소로 덮어쓰는 느낌이 드는데 제가 잘못 생각한 것인지요? 아니면, 우리가 A와 B의 값을 교환할때의 방식처럼X = A;A = B;B = X;기존 Tail주소에 다른 이름을 붙여주고 나서, Tail을 newRoom의 주소로 새롭게 정의하는 것이 맞지 않나 하는 생각이 들어서요.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
두 갈래 이상의 길이에서 판단은 어떻게 되는건가요?
두 갈래 이상 나뉘어진 구간(길이가 같다면)에서는 어떻게 판단하고 나아가는지 이해가 되지 않아 구글링을 좀 해봤는데 두 갈래로 나뉘어져 있는 구간은 큐에서 두 좌표를 모두 큐에 넣고 큐에서 하나씩 꺼내 그 지점과 근접한 방문하지 않은 지점을 방문하게 된다는데 글이 있더라구요 이 말이 알 것 같으면서도 잘 이해가 되지 않습니다. 두 갈래에서는 어떻게 판단하고 앞으로 나아가나요? 그냥 두갈래중 먼저 발견한 정점으로 가는 건가요? 파란점이 시작점이라고 할때 만약 위 오른쪽 아래 왼쪽 순서로 for문을 돌면 오른쪽 점을 먼저 발견하니까 오른쪽으로 가게되고 결국 막히게 되는데 일단 오른쪽으로 계속 이동하다가 막히게 되면 다음으로 갈 수 있는 아래쪽 점으로 이동하고 이런식으로 반복하여 최단경로를 찾게 되는건가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
디버깅이나 실행 시 너무 오래걸립니다...
이처럼 브레이크 포인트를 잡고 디버깅을 하였는데 아무리 기다려도 끝나지 않습니다. 브레이크 포인트를 program의 player.Initialize(1, 1, board);에 잡고 실행하고 f10이 아닌 f11를 통해 코드 작동을 확인하면 잘 작동하는 것은 확인했습니다. 혹시 컴퓨터의 성능에서 오는 문제인가요? 혹시 몰라 우수법 부분의 코드도 함께 올립니다. public void Initialize(int posY,int posX, Board board) { PosX = posX; PosY = posY; _board = board; int[] frontY = new int[] { -1, 0, 1, 0 }; int[] frontX = new int[] { 0, -1, 0, 1 }; int[] rightY = new int[] { 0, -1, 0, 1 }; int[] rightX = new int[] { 1, 0, -1, 0 }; _point.Add(new Pos(PosY, PosX)); while (PosY != board.DestY || PosX != board.DestX) { //1. [현재 바라보는 방향]을 기준으로 오른쪽으로 갈 수 있는지 확인. if (_board.Tile[PosX + rightX[_dir], PosY + rightY[_dir]] != Board.TileType.Wall) { //오른쪽 방향으로 90도 회전 : 시계방향 _dir = (_dir - 1 + 4) % 4; //[현재 바라보는 방향]으로 앞으로 한 보 전진 PosX = PosX + frontX[_dir]; PosY = PosY + frontY[_dir]; _point.Add(new Pos(PosY, PosX)); } //2. [현재 바라보는 방향]을 기준으로 전진할 수 있는지 확인. else if (_board.Tile[PosX + frontX[_dir], PosY + frontY[_dir]] != Board.TileType.Wall) { // 앞으로 전진 PosX = PosX + frontX[_dir]; PosY = PosY + frontY[_dir]; _point.Add(new Pos(PosY, PosX)); } else { // 왼쪽 방향으로 90도 회전 _dir = (_dir + 1 + 4) % 4; } } }
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
동적 배열 구현 연습-예외 케이스 질문있습니다.
if (Count >= Capacity) 의 부분이 예외케이스라고 하셨는데, 그 이유가 정확히 해당 조건에 들어가야 진행되기 때문인가요? 아니면 단순히 이와같은 이사비용 문제는 무시한다는 약속이 주어져있는 이유에서 예외케이스인가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
코드 질문입니다
class Room<T> { public T data; ① public Room<T> Next ; ② public Room<T> Prev ; } class RoomList<T> { ③ public Room<T> Head = null; ④ public Room<T> Tail = null; public int count = 0; public Room<T> AddLast(T data) { ⑤ Room<T> NewRoom = new Room<T>(); } } [1] 5번은 생성자 호출로 객체(NewRoom)를 만들었는데 1~4번은 왜 생성자 호출이 없는지 궁금합니다ㅠ [2] 그리고 위 2개의 Class안에 생성자가 있어야 하는것 아닌지요? 그러니까 . . . class Room<T> { public Room<T>(){ ... } →생성자 }이런 식으로 있어야 하는거 아닌가 해서요ㅠ ( 아 기본생성자는 자동으로 만들어지기 때문인게 답일까요? )
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
우선순위큐로 인벤토리 자동정렬을 구해도되는걸까요??
처음에는 병합정렬을 이용하여 인벤토리의 자동 정렬 기능을 구현 했는데요. 해당 강의를보고 우선순위큐를 사용하여 만들려고했는데.. 생각해보니 해당 아이템 개수가 같을경우 문제가 좀생길것같은데.. 1) 우선순위큐 를사용할때 같은 노드값이 여러개 발생하게될경우.. 문제가 되지 않을까요 ?? 2) 우선순위큐는 최대값과 최소값을 가져오는데 자주 사용되는걸로 아는데 게임 프로젝트를 비유한다면 어디에 자주쓰일까요