8/12
#2020.08.12
*오늘 할 일
1. C로 Cellular Automata 구현해보기
2. Unity Scene에서 카메라가 어떤 역할을 하는 친구인지, 걔가 Magic leap의 카메라와 어떻게 연동되는 건지 알아보기
3. 버튼을 누를 때 마다 구가 하나씩 떨어지게 수정해보기
4. Magic leap에서 시점 설정? 하는거 공부하기
*오늘 한 일
1. C로 Cellular Automata 구현해보기
- 코드 < 개발환경: VS 2019>
#define _CRT_SECURE_NO_WARNINGS
#define rep 5000
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <conio.h>
void get_board_size(int* range);
int** create_board(int range);
void print_board(int range, int** pBoard, int cur_row, int cur_col);
void initiate_board(int** pBoard, int* cur_row, int* cur_col, int range);
void check_limit(int cur_row, int cur_col, int range);
void calc_board(int** pBoard, int** pBoardchange, int range);
void calc_nbhd(int** pBoard, int** pBoardchange, int col, int row, int range);
void move_board(int** pBoard, int** pBoardchange, int range);
int main()
{
int range = 0;
int** pBoard;
int** pBoardchange;
int cur_row = 0, cur_col = 0;
// 보드의 사이즈를 입력받는다.
get_board_size(&range);
// 동적할당으로 배열을 만든다.
pBoard = create_board(range);
pBoardchange = create_board(range);
//printf("여기까진 성공!1");
print_board(range, pBoard, cur_row, cur_col);
//printf("여기까진 성공!2");
// 보드의 시작값을 입력해준다.
initiate_board(pBoard, &cur_row, &cur_col, range);
//printf("여기까진 성공!3");
for(int i = 1; i<rep+1; i++)
{
print_board(range, pBoard, -1, -1);
//printf("여기까진 성공!4");
calc_board(pBoard, pBoardchange, range);
printf("\n\n<<%d 회차>>\n", i);
move_board(pBoard, pBoardchange, range);
}
return 0;
}
// 보드의 사이즈를 입력받아 포인터로 넘겨주는 함수
void get_board_size(int *range)
{
int check_input = 0;
do{
printf("size of board: ");
check_input = scanf("%d", range);
if (check_input == 0)
printf("입력에 실패했습니다.");
else if (*range < 10 || *range > 40)
printf(" 10 이상 40 이하의 숫자만 입력해주세요. \n");
else
break;
} while (1);
return;
}
//입력받은 사이즈의 보드를 만들어주는 함수
int** create_board(int range)
{
int** pBoard = malloc(sizeof(int*) * range);
if (pBoard == NULL)
{
printf("동적할당 실패\n");
return NULL;
}
for (int i = 0; i < range; i++)
{
pBoard[i] = malloc(sizeof(int) * range);
for (int j = 0; j < range; j++)
{
pBoard[i][j] = -1;
}
}
return pBoard;
}
//보드를 출력하는 함수
void print_board(int range, int** pBoard, int cur_row, int cur_col)
{
system("cls");
printf("\n");
for (int i = 0; i < range; i++)
{
for (int j = 0; j < range; j++)
{
//해당 위치에 커서가 있다면 색을 바꿔서 출력
if (cur_row == i && cur_col == j)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11);
if (pBoard[i][j] == -1)
printf("□");
else if (pBoard[i][j] == 1)
printf("■");
else
printf("보드에 -1과 1 이외의 숫자가 들어가 있다\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
printf("\n");
}
}
//보드를 초기화하는 함수
void initiate_board(int** pBoard, int* cur_row, int* cur_col, int range)
{
char key_input;
do{
print_board(range, pBoard, *cur_row, *cur_col);
printf("\n<<초기 세포 선택하기>>\n\ni: Up j: Left k: Down l: Right | 스페이스 바 : 세포 선택 | E 또는 e : 선택 종료\n\n");
key_input = _getch();
if (key_input == 106)// j-left 입력
*cur_col -= 1;
else if (key_input == 105)// i-up 입력
*cur_row -= 1;
else if (key_input == 108)// l-right 입력
*cur_col += 1;
else if (key_input == 107)// k-down 입력
*cur_row += 1;
else if (key_input == 32)// 스페이스바 입력
{
pBoard[*cur_row][*cur_col] *= -1;
}
else if (key_input == 69 || key_input == 101)// E 또는 e 입력
{
printf("E를 입력받았습니다.\n");
break;
}
else
printf("잘못된 입력\n");
check_limit(cur_row, cur_col, range);
} while (1);
}
//이동이 가능한지 확인하는 함수. 커서가 범위를 벗어나면 가장가리로 데려오는 역할
void check_limit(int* cur_row, int* cur_col, int range)
{
if (*cur_row < 0)
*cur_row = 0;
else if (*cur_row > range-1)
*cur_row = range-1;
if (*cur_col < 0)
*cur_col = 0;
else if (*cur_col > range-1)
*cur_col = range-1;
}
//현재 보드의 정보를 가지고 다음 상황을 계산하는 함수
void calc_board(int** pBoard, int** pBoardchange, int range)
{
for (int i = 0; i < range; i++)
{
for (int j = 0; j < range; j++)
{
calc_nbhd(pBoard, pBoardchange, j, i, range);
}
}
//printf("\n\n확인");
//print_board(range, pBoard, -1, -1);
//print_board(range, pBoardchange, -1, -1);
}
//다음 상황을 계산해주는 함수
void calc_nbhd(int** pBoard, int** pBoardchange, int col, int row, int range)
{
int count = 0, count_col_min = col - 1, count_col_max = col + 1, count_row_min = row - 1, count_row_max = row + 1;
int i=0, j=0;
if (row <= 0)
count_row_min = 0;
else if (row >= range-1)
count_row_max = range-1;
if (col <= 0)
count_col_min = 0;
else if (col >= range-1)
count_col_max = range-1;
//printf("\n\nrow: %d, col: %d, count_row_min: %d, count_row_max: %d, count_col_min: %d, count_col_max: %d\n\n\n", row, col, count_row_min, count_row_max, count_col_min, count_col_max);
for (i = count_row_min; i <= count_row_max; i++)
{
for (j = count_col_min; j <= count_col_max; j++)
{
if (pBoard[i][j] == 1)
{
count++;
}
}
}
if (pBoard[row][col] == -1)//기준 세포가 죽어있을 경우
{
if (count == 3)
pBoardchange[row][col] = pBoard[row][col] * (-1);
else
pBoardchange[row][col] = pBoard[row][col] * 1;
}
else if (pBoard[row][col] == 1)//기준 세포가 살아있을 경우
{
--count;
if (count == 2 || count == 3)
pBoardchange[row][col] = pBoard[row][col] * 1;
else
pBoardchange[row][col] = pBoard[row][col] * (-1);
}
//print_board(range, pBoard, -1, -1);
//print_board(range, pBoardchange, -1, -1);
//printf("%d, %d", i, j);
}
//pBoardchange의 내용을 pBoard로 옮겨주는 함수
void move_board(int** pBoard, int** pBoardchange, int range)
{
for (int i = 0; i < range; i++)
{
for (int j = 0; j < range; j++)
{
pBoard[i][j] = pBoardchange[i][j];
pBoardchange[i][j] = -1;
}
}
return;
}
- 임의로 찍으면 살리기 무척 어렵다.
- Life of Game을 유니티에서 구현해보자
- 강화학습
2. Unity Scene에서 카메라가 어떤 역할을 하는 친구인지, 걔가 Magic leap의 카메라와 어떻게 연동되는 건지 알아보기 + 4. Magic leap에서 시점 설정? 하는거 공부하기
- Unity 프로젝트를 실행시키면 실행 화면에 나타나는 장면이 카메라에 보이는 장면에서 비롯된다.
- Unity에서 Magic Leap 프로젝트를 만들기 위해 해주어야 하는 사전 설정이 몇가지 있는데, 그 중 하나는 Magic Leap 라이브러리를 임포트해서 Scene의 카메라를 Magic Leap Assets 의 카메라로 바꾸어주는 것이다.
이 설정을 바탕으로 Magic Leap 를 구현시키면 카메라가 머리를 따라 움직이도록 설계되어 있는 것 같다.
그런데 어제 Magic Leap에서 실행시킨 유니티 프로젝트는 머리 방향을 따라 움직이지 않고 랜덤한 장소에 가만히 놓여있었다.
=> 카메라 위치설정을 건드리지 말고 새로운 오브젝트를 카메라 방향에 맞도록 두어야겠다.
3. 버튼을 누를 때 마다 구가 하나씩 떨어지도록 수정해보기
-
댓글
댓글 쓰기