<div>#include <stdio.h></div> <div>#include <stdlib.h></div> <div>#include <windows.h></div> <div>#include <conio.h></div> <div>#include <time.h></div> <div>#include <math.h></div> <div><br></div> <div>#define MAZE_BOARD_HEIGHT 21</div> <div>#define MAZE_BOARD_WIDTH 21</div> <div>#define POINT_X 4 //보드시작좌표x</div> <div>#define POINT_Y 2 //보드시작좌표y</div> <div><br></div> <div>#define LEFT 75</div> <div>#define RIGHT 77</div> <div>#define UP 72</div> <div>#define DOWN 80</div> <div>#define DELAY 100</div> <div>#define EXIT 50</div> <div><br></div> <div>int maze[21][21] = { 0 };</div> <div>int closed[21][21] = { 0 };</div> <div>int gmat[21][21] = { 0 };</div> <div>int expand[21][21] = { -1 };</div> <div>int action[21][21] = { -1 };</div> <div><br></div> <div>void astar(void)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int start[1][2] = { 6, 3 };</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int delta[4][2] = {{ -1, 0 }, { 0, -1 }, { 1, 0 }, {0,1}};</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int goal[1][2] = { 20, 20 };</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int open[1][5];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int cost = 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int x, y,i;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int g,h,f;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int found, resign = 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int count;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>closed[0][0] = 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>x = start[0][0];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>y = start[0][1];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>g = 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>h = abs(x - goal[0][0]) + abs(y - goal[0][1]);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>f = g + h;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>count = 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>open[0][0] = f;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>open[0][1] = g;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>open[0][2] = h;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>open[0][3] = x;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>open[0][4] = y;</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>while (~found && ~resign)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (length(open) == 0)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>resign = 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>open</div> <div><br></div> <div><br></div> <div><br></div> <div>}</div> <div><br></div> <div><br></div> <div>void setCursor(int x, int y)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>COORD pos;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>pos.X = x;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>pos.Y = y;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);</div> <div>}</div> <div><br></div> <div>COORD getCursor(void)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>COORD curPoint;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CONSOLE_SCREEN_BUFFER_INFO pos;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &pos);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>curPoint.X = pos.dwCursorPosition.X;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>curPoint.Y = pos.dwCursorPosition.Y;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return curPoint;</div> <div>}</div> <div><br></div> <div>void removeCursor(void)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>CONSOLE_CURSOR_INFO cur;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cur);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>cur.bVisible = 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cur);</div> <div>}</div> <div><br></div> <div>void showBoard(void)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int x, y;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>COORD cur = getCursor();</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>srand((unsigned)time(NULL));</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (x = 0; x<MAZE_BOARD_HEIGHT; x++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (y = 0; y<MAZE_BOARD_WIDTH; y++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>maze[x][y] = rand() % 2;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>} /*미로를 랜덤으로 발생*/</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (x = 0; x<MAZE_BOARD_HEIGHT; x++) /*벽은 모두 1로 채운다*/</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>maze[0][x] = 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>maze[MAZE_BOARD_WIDTH - 1][x] = 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (x = 0; x<MAZE_BOARD_HEIGHT; x++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>maze[x][MAZE_BOARD_WIDTH - 1] = 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>maze[x][0] = 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>maze[1][1] = 2; </div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>maze[MAZE_BOARD_HEIGHT - 2][MAZE_BOARD_WIDTH - 2] = 3;</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (y = 0; y<MAZE_BOARD_HEIGHT; y++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (x = 0; x<MAZE_BOARD_WIDTH; x++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>setCursor(cur.X + (x * 2), cur.Y + y);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (maze[y][x] == 1)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("■");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else if (maze[y][x] == 2)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("@");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else if (maze[y][x] == 3)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("★");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("□");</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>setCursor(cur.X, cur.Y);</div> <div>}</div> <div>void showCharacter(void)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>COORD cur = getCursor();</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("⊙");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>setCursor(cur.X, cur.Y);</div> <div><br></div> <div>}</div> <div>int detect(int x, int y)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int x1 = 0;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int y1 = 0;</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>// 커서위치얻기</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>COORD cur = getCursor();</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>// 미로내에서의위치계산</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>x1 = cur.X + x;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>y1 = cur.Y + y;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>x1 = x1 / 2 - 2;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>y1 = y1 - 2;</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>// 미로밖에있느냐</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (!((x1 >= 0 && x1 <MAZE_BOARD_WIDTH) && (y1 >= 0 && y1 <MAZE_BOARD_HEIGHT)))</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//배열을넘어가지않는이유</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (maze[y1][x1] == 1)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 1;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//미션성공</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else if (maze[y1][x1] == 3)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return EXIT;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return 0;</div> <div>}</div> <div>void RemoveCharacter_Set(int x, int y)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int value = detect(x, y);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (value == 0)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>COORD cur = getCursor();</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("□");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>setCursor(cur.X + x, cur.Y + y);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>else if (value == EXIT)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>setCursor(10, 15);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("성공");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>system("pause");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>exit(1);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div>}</div> <div><br></div> <div><br></div> <div>void character_static(void)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int kb;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>setCursor(6, 3); //케릭터시작위치</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>while (1)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>while (!_kbhit())</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>showCharacter();</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>Sleep(DELAY);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>kb = _getch();</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>switch (kb)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case UP:</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>RemoveCharacter_Set(0, -1);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case DOWN:</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>RemoveCharacter_Set(0, 1);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case RIGHT:</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>RemoveCharacter_Set(2, 0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>case LEFT:</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>RemoveCharacter_Set(-2, 0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>break;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div>}</div> <div><br></div> <div><br></div> <div><br></div> <div>int main()</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>removeCursor(); //커서깜박이지우기</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>setCursor(POINT_X, POINT_Y); //보드시작좌표</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>showBoard(); //미로판보여주기</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>character_static(); //케릭터움직이기</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>getchar();</div> <div>}</div> <div><br></div> <div>미로를 랜덤하게 만들고 user가 직접 작동하는거는 만들었는데 여기다가 A*알고리즘을 도입해서 로봇이 </div> <div><br></div> <div>길을 못찾으면 찾을때까지 미로를 계속 생성하고 그것을 토대로 가장 빠른길을 보여주고 싶은데</div> <div><br></div> <div><br></div> <div>3일째 A* 이해할라고해도 도대체가 이해가 안갑니다. f= g+h로 해서 가장 작은 f찾아서 움직이는거 같은데</div> <div><br></div> <div>c로 구현할라면 g값 백터따로 h값 백터 따로 거기다가 찾았던곳은 closed 시켜서 다시 안가게 만들어야하고(이것도 백터따로)</div> <div><br></div> <div>골을 찾는 조건도 모르겠고 A*가 이해안가네요 ㅠㅜ A*좀 이해하기 쉬운방법 없을까요 c로? 이해만 하면 코딩해서 h값따라 </div> <div><br></div> <div>로봇이 움직이게 하는건 할수있을거같은데 A*를 대략적으론 알겠는데 c로 구현하기가 어렵네요.....</div> <div><br></div> <div>A* c로 구현할라면 어찌해야하나요? 간단한 예제같은거 없을까요 ㅠㅜㅠㅜㅠㅜ</div> <div><br></div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.