// 터미널 설정
initscr();// ncurses 초기화
cbreak();// Enter 키를 기다리지 않음(문자 단위 입력 모드)
noecho();// 입력한 키가 터미널 화면에 표시되지 않게 함
keypad(stdscr,TRUE);// 방향키 같은 특수 키 입력 사용
curs_set(0);// 커서 숨김
nodelay(stdscr,true);// 입력을 기다리지 않음, 입력 되지 않으면 ERR 반환
WINDOW*board=newwin(kHeight,kWidth,0,0);// 새로운 창을 만듦
// 프레임 갱신...
// 터미널 정리
delwin(board);// 만들었던 창을 소멸 시킴
endwin();// ncurses 종료
// 프레임 갱신
while(!gameOver){ch=getch();head=snake.front();// 키보드 입력 받고
switch(ch){caseKEY_UP:if(dir!=KEY_DOWN)dir=KEY_UP;break;caseKEY_DOWN:if(dir!=KEY_UP)dir=KEY_DOWN;break;caseKEY_LEFT:if(dir!=KEY_RIGHT)dir=KEY_LEFT;break;caseKEY_RIGHT:if(dir!=KEY_LEFT)dir=KEY_RIGHT;break;}// 머리 위치 조정하기
switch(dir){caseKEY_UP:head.y--;break;caseKEY_DOWN:head.y++;break;caseKEY_LEFT:head.x--;break;caseKEY_RIGHT:head.x++;break;}// 갱신된 머리 위치 넣고
snake.push_front(head);if(head==food){// 먹이를 먹었으면 새로운 위치 갱신
do{food.x=xDist(gen);food.y=yDist(gen);}while([&food,&snake](){boolduplicated=false;for(constPoint&p:snake){if(p.x==food.x&&p.y==food.y){duplicated=true;}}returnduplicated;}());}else{// 먹이를 먹지 못한다면 꼬리는 하나 지우기
snake.pop_back();}// GameOver
if(head.x==0||head.x>=kWidth-1||head.y==0||head.y>=kHeight-1){gameOver=true;break;}// 전체를 지우고 새로운 화면으로 다시 그리기
// 테두리 그리기
werase(board);box(board,0,0);// 먹이 그리기
mvwaddch(board,food.y,food.x,'@');//뱀 그리기
for(i=0;i<snake.size();i++){if(i==0){mvwaddch(board,snake[i].y,snake[i].x,'o');}else{mvwaddch(board,snake[i].y,snake[i].x,'*');}}wrefresh(board);std::this_thread::sleep_for(std::chrono::milliseconds(200));}