44,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
이 부분이 이해가 잘 안갑니다
public int Pop() { // Create a variable storing the return value int ret = _heap[0]; // Rearrange the Heap since the root node is removed // move the very last data into the root node int lastIndex = _heap.Count - 1; _heap[0] = _heap[lastIndex]; _heap.RemoveAt(lastIndex); lastIndex--; // Value comparision downwards begins // the index of the current node int now = 0; while(true) { // the indices of the child nodes int left = 2 * now + 1; int right = 2 * now + 2; int next = now; // move to the left if the left value is bigger if (left < lastIndex && _heap[next] < _heap[left]) next = left; // move to the right if the right value is bigger, which contains the previous case as well (that's why it's not else if) if (right < lastIndex && _heap[next] < _heap[right]) next = right; // Exit the loop if the left/right values are smaller than the current value if (next == now) break; // Exchange the values int temp = _heap[now]; _heap[now] = _heap[next]; _heap[next] = temp; // Move to the next index now = next; } return ret; } 우선순위큐의 Pop 함수에서, 저기 if 구문 3개가 나오는 부분에서 어째서 else if를 쓰지 않는 것인지 이해가 쉽사리 되지가 않습니다
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
Mac환경등에서 콘솔이 제대로 출력되지 않는 분들은 이 java 코드를 활용해보세요.
제가 직접 java GUI 로 포팅한 코드입니다. 콘솔의 환경설정 문제 때문에 콘솔이 이상하게 나온다면 이번 강의와 이어지는 알고리즘 강의를 들을 때 이 코드를 활용해보세요. 다음 강의인 유니티 강의부터는 필요없어지겠지만 이번 강의는 들을 수 있을 것입니다. 혹시라도 저와 같은 문제를 겪게될 사람들을 위해 공유합니다. 이클립스 IDE나 JDK를 깔면 어떤 환경에서도 실행이 될 것입니다.(java문법은 C#과 크게 다르지 않습니다. 틀만 그대로 활용하시면 됩니다. ) //<Program.java> import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridBagLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class Program extends JFrame { private static final long serialVersionUID = 1L; private final int BORDER_SIZE = 26; private static Board board; private static Player player; public Program() { initUI(); } public static void main(String[] args) throws InterruptedException { Program ex = new Program(); ex.setVisible(true); final int FPS = 30; // 30프레임 final int WAIT_TICK = 1000 / FPS; long lastTick = System.currentTimeMillis(); long currentTick = 0; while (true) { //// # 프레임 관리 currentTick = System.currentTimeMillis(); if (currentTick - lastTick < WAIT_TICK) { Thread.sleep(WAIT_TICK - (currentTick - lastTick)); } int deltaTick = (int) (System.currentTimeMillis() - lastTick); lastTick = System.currentTimeMillis(); //// # 프레임 관리 // 입력 // 로직 // 렌더링 board.repaint(); } } private void initUI() { JPanel content = new JPanel(new GridBagLayout()); content.setBackground(Color.BLACK); content.setBorder(new EmptyBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE)); board = new Board(); board.setBackground(Color.BLACK); player = new Player(); board.Initialize(25); player.Initialize(1, 1, board._size-2, board._size-2, board); content.add(board); add(content, BorderLayout.CENTER); setResizable(false); pack(); setTitle("미로 길찾기"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } //<Board.java> import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JPanel; public class Board extends JPanel { private static final long serialVersionUID = 1L; private final int CELL_SIZE = 20; // 픽셀 크기 public TileType[][] _tile; // 배열 public int _size; public enum TileType { Empty, Wall, } public void Initialize(int size) { _size = size; setPreferredSize(new Dimension(_size * CELL_SIZE, _size * CELL_SIZE)); _tile = new TileType[_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; } } } @Override public void paintComponent(Graphics g) { for (int y = 0; y < _size; y++) { for (int x = 0; x < _size; x++) { g.setColor(GetTileColor(_tile[y][x])); g.fillOval(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE); } } } Color GetTileColor(TileType type) { switch (type) { case Empty: return Color.GREEN; case Wall: return Color.RED; default: return Color.GREEN; } } } //<Player.java> import java.util.ArrayList; import java.util.List; class Pos { public int Y; public int X; public Pos(int y, int x) { Y = y; X = x; } } public class Player { public int PosY; public int PosX; public int getPosY() { return PosY; } private void setPosY(int posY) { PosY = posY; } public int getPosX() { return PosX; } private void setPosX(int posX) { PosX = posX; } Board _board; enum Dir { Up, Left, Down, Right, } int _dir = Dir.Up.ordinal(); List<Pos> _points = new ArrayList<Pos>(); public void Initialize(int posY, int posX, int destY, int destX, Board board) { PosY = posY; PosX = posX; _board = board; } }
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
Vertex 인스턴스 생성하는 방법과 List를 이용하는 방법의 차이
안녕하세요! new Vertex();를 해서 하나씩 정점을 만들어야 한다는 단점 때문에 List를 사용한다는 부분에서 궁금한 점이 생겨서 질문 드립니다. List를 이용할 때도 new List<int> { }를 계속 해주는데 리스트의 배열은 뭐가 다르길래 인스턴스 생성 부담을 줄이게 되는 건가요? 말그대로 배열이라서 메모리를 아낄 수 있는 건가요? 얘도 계속 new를 해주는데 왜 인스턴스 생성해주는 것보다 부담이 덜한건지 궁금합니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
Inconsistent Accessibility
강의 한번 듣고 처음부터 다시 복습 중인데요 이전에도 한 강 들을 때마다 몇번씩 다시 복습 하고 그래서 왜 이런지 도통 이해가 가질 않습니다 현재 단계는 Player 클래스 생성하고, 프로퍼티 및 Initialize 함수 생성하고, 그에 맞춰 Program 및 Board 클래스에 수정을 가하는 부분입니다 문제는 이전에는 한번에도 그러지 않다가 Board 클래스의 Initialize 함수에 파라미터로 Player를 넣을때 Inconsistent Accesibility 오류가 생깁니다 해당 함수의 Accesibility보다 Player 클래스의 Accesiblity가 낮아서 생기는 걸로 보이기에 Player 클래스 앞에 Public을 추가하면 해결을 됩니다만 제가 몇번이고 복습한 내역에서도 강의에서도 이 부분에 Public을 추가 하신적은 없었습니다 어떻게 된건지 알려주세요 namespace MMO2_CompleteReview { public class Board { const char CIRCLE = '\u25cf'; public int Size { get; private set; } public TileType[,] Tile { get; private set; } Player _player; public enum TileType { Empty, Wall } public void Initialize(int size, Player player) { if (size % 2 == 0) return; Size = size; _player = player; Tile = new TileType[Size, Size]; //GenerateBinaryTree(); GenerateSideWinder(); } namespace MMO2_CompleteReview { class Player { public int PosY { get; private set; } public int PosX { get; private set; } Random random = new Random(); Board _board; public void Initialize(int posY, int posX, int destY, int destX, Board board) { PosY = posY; PosX = posX; _board = board; } } }
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
vs2019에 내장된 함수에 관하여 문의드리고 싶습니다.
수업 중에서 사용하셨던 Math 와 같이 제가 따로 제작한 것이 아니라 이미 완성되어 내장되어 있는 클래스들 목록을 확인하고 어떤 기능을 하는 지 훑어보고 싶은데 어떤 식으로 접근을 해야할 지 몰라 수업 내용과 거리가 있지만 질문드려 봅니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
코드를 전체적으로 볼수있는 방법 있을까요?
강의 듣고나서 혼자서 작성해서 다시 코드를 만들어봤는데 안돌아가서 어떤부분이 틀렸는지 계속 확인하고있는데 찾기가 어렵네요..ㅠ
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
A* 알고리즘 질문입니다.
제가 이해한 바는 이동할 때마다 상하좌우 의 점을 갈 때 거리를 비교해서 거리가 가장 짧은 쪽으로 이동한다는 걸로 이해를 했습니다. 그러면 미로가 난잡하게 되어 왼쪽으로 빙 돌아가야 한고 오른쪽으로도 어느정도 길이 뚫려 있지만 최종 점 앞에서 막혀있다고 가정하면 거리 순으로 이동을 하게 되면 왼쪽이 아니라 오른쪽으로 가지 않을까요? 이 부분이 지금 이해가 어려워 추가적으로 질문드립니다,
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
struct 관련 질문입니다.
sturct와 enum의 차이를 설명해주실 수 있으신가요? 인터넷을 찾아보니 enum은 값을 보기 좋게 구분하기 위해 쓰인다는 글을 봤는데 좀 더 구체적인 내용을 알고 싶습니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
Edge 클래스 관련 문의
Edge 클래스 생성 후 바로 리스트에 넣으니 호출할 수 없는 멤버인 Edge는 메소드처럼 사용할 수 없다하여 오류 자동 수정을 하니 private static Edge Edge(int v1, int v2) { throw new NotImplementedException(); } 다음 과 같이 해결 문장을 작성해주었습니다. 이에 관한 보충 설명을 해주실 수 있으신가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
그래프 생성 관련 질문입니다.
그래프 생성 강의에서 List<int> 배열로 그래프를 만드셨는데 아래와 같이 List<int[]> 에 Add()로 int 배열을 넣는 것과 어떤 차이가 있는지 궁금합니다. List<int[]> adj2 = new List<int[]>(); adj2.Add(new int [ ] { 1, 3}); adj2.Add(new int [ ] { 0, 2, 3 }); adj2.Add(new int [ ] { 1 }); adj2.Add(new int [ ] { 0, 1, 4 }); adj2.Add(new int [ ] { 3, 5 }); adj2.Add(new int [ ] { 4 });
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
동그라미가 안 뜨고 물음표로 나옵니다
'\u25CF' 나 '\u25cf' 를 못알아듣고 물음표로만 출력되는데, 어떡해야 할까요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
랜더링 관련 질문입니다.
질문 내용 우선 테두리가 빨갛게 나오도록 하는 건 문제가 없었습니다. 거기서 조금 x,y 에 대한 확인을 해보고 싶어서 [3,4] 지점의 녹색 점을 빨갛게 출력해보고 싶기 위해 코드를 수정했습니다. 그런데 해당 위치 점이 빨갛게 나오도록 하는 건 성공했는데 문제는 해당 빨강점 이후에 한 줄을 띄고 점을 찍는 현상이 발생했습니다. 이와 관련된 이유가 궁금해 질문남깁니다. +추가 질문 _tile[x,y] 가 아니라 _tile[y,x]로 하는 이유가 있을까요? 작성 코드 public void Rander() { ConsoleColor prevColor = Console.ForegroundColor; for (int x = 0; x < _size; x++) { for (int y = 0; y < _size; y++) { if (x == 3 && y == 4) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(CIRCLE); } else { Console.ForegroundColor = GetTileColoer(_tile[x, y]); Console.Write(CIRCLE); } } Console.WriteLine(); } Console.ForegroundColor = prevColor; }
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
연결리스트 Remove 관련 질문입니다.
지우고자 하는 노드의 전 후를 서로 연결시켜줘도 삭제할 노드가 그 전 노드와 뒤 노드를 가리키고 있어도 가비지 컬렉터가 삭제를 해주나요? 저는 이 점이 헷갈려서 room.Next = null; room.Prev = null; 이 내용을 추가했는데 추가할 필요가 없을까요?
- [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
for mac 관련해서 질문 드려요
삭제된 글입니다
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
선형리스트와 연결 리스트에 대하여 질문드립니다.
배열과 동적 배열은 연속된 순서의 자료집합으로 선형임을 알수 있었습니다. 연결리스트는 연속되지 않은 자료집합임을 알게 되었는데요. 이는 순서대로가 아니기에 선형이 아닌 비선형이라고 생각 했었습니다. 하지만 다시 생각해보니 비선형인 트리와 그래프는 노드 및 버텍스를 통해 다음으로 들어갈 수 있는 방이 여러개이므로 비선형이다- 라고 다시 이해했습니다. 정리해서 말씀 드리자면 연결 리스트는 연속되지 않지만 기준의 방에서 앞의 방과 뒤의 방을 각각 하나씩만 갖고 있기에 선형, 트리와 그래프는 앞과 방이 여러개 일수도 있기에 비선형이다- 이렇게 이해 했는데 이게 맞는 것일까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
class 안에서 자신을 재사용? 하는 경우
class TreeNode<T> { public T Data { get; set; } public List<TreeNode<T>> Children { get; set; } = new List<TreeNode<T>>(); } 이 부분에서 현재 정의하는 클래스 내부에 자신을 다시 사용하는 것이 왜 가능한 것인가요?(TreeNode 클래스의 정의 내부에 TreeNode가 사용되는 것) 이전부터 이렇게 사용하시길래 그냥 지나가려다가 궁금해서 질문드립니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
class Vertex 내용에 대하여 질문드립니다.
class Vertex { public List<Vertex> edges = new List<Vertex>(); } 이 부분이 좀 헷갈리는데요. edges의 List의 일반화 값으로 자기 자신인 Vertex 클래스를 넣어 리스트를 만들었는데 edges는 재귀호출같은 건가요?? 뭔가 링크드리스트의 노드만드는 것과 비슷한것 같기도 하고 아닌 것 같고 아리송해서... 구체적인 설명 부탁드리겠습니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
A* 알고리즘 코드 질문입니다.
강의하신 A* 알고리즘의 코드 중에서 // 다른 경로에서 더 빠른 길을 이미 찾았으면 스킵 if (open[nextY, nextX] < g + h) continue; 이 부분의 코드가 잘 이해가 가지않습니다. 여기서 다음 경로, 즉 open[nextY, nextX]의 값은 MaxValue로 채워져있고 다른 값이 채워져 있는 상태라면, 이미 방문한 상태라 closed가 true값이 되어 위에서 이미 continue 되는거라 생각되서, 저 값이 g + h 보다 작은 상황이 어디서 일어나는 건지 잘 모르겠습니다... 제가 어느 부분을 놓치고 있는 건지 궁금합니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
입력 로직 렌더링에 관하여 질문드립니다.
입력 로직 렌더링에 대한 설명을 들었을 때 MVC라는 패턴이 생각 났습니다. 제가 MVC에 대한 패턴은 자세히 모르지만 M(Model) : 실질적으로 바뀌는 곳 V(View) : 보여지는 곳 C(Controller) : 명령을 내리는 곳 이렇게 알고 있는데요. 해당 입력로직렌더링에 맞춰보니까 모델 : 로직 뷰 : 렌더링 컨틀롤러 : 입력 으로 연상되더라고요. 이렇게 이해해도 문제 없는지 궁금하며 혹시 부가적으로 MVC에 대해 설명을 해주신다면 감사하겠습니다. 사실... 저번에 면접보다 Unity의 MVC 패턴 설명해보세요. 라는 질문에 막혀버린 경험이 있어 질문드렸습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
node의 child
이런 경우를 몇번 봤는데 node의 child의 경우 new TreeNode<string>()해서 추가 하잖아요 이럴경우 변수의 이름이 없는 상태로 메모리 할당 될텐데 이름을 지정하지 않는 특별한 이유가 있는건가요?