powerslam / KMU_SNAKEGAME

국민대 C++ 프로그래밍 뱀 게임
0 stars 1 forks source link

과제 2단계 #2

Closed powerslam closed 1 year ago

powerslam commented 1 year ago

맵 위에 Snake를 표시하고, 화살표를 입력받아 Snake가 움직이게 하기

kimsangmi2001 commented 1 year ago

처음 뱀의 크기가 머리 포함 길이 3이어야 하니까 Linked List를 사용하여 Snake의 머리(1)와 몸통(2)을 표현하면 될거 같습니다. 화살표 입력 처리의 경우 int key = getch();을 사용하여 화살표 키에 대한 처리를 하면 될거 같네요. tick의 경우 속도가 느리면 난이도가 쉬워지고, 속도가 빠를수록 snake가 빨리 움직여 게임의 난이도가 올라갑니다. 타 게임을 참고해본 결과 난이도가 쉬우면 0.5 ~ 1초, 좀 어려우려면 0.5초 이하로 설명하면 될것 같습니다.

powerslam commented 1 year ago
  1. 뱀의 위치 정보를 배열에 저장하고 이동할 때마다 뱀의 위치 정보 배열을 순회하며 정보를 업데이트할 수 있습니다. 하지만, 다음과 그림과 같이 생각해보면

    image

    뱀이 앞(왼쪽 방향)으로 이동할 때, 꼬리는 삭제되고 머리가 새로 앞에 삽입되는 형태로 이동하는 것을 알 수 있습니다.

    따라서, 앞, 뒤 부분에서 삽입/삭제가 빈번하게 일어날 때 사용하면 좋은 deque 자료구조를 사용하는 것이 좋을 것 같습니다.

  2. 뱀의 이동방향을 결정 짓는 것은 게임에서 흔히 사용되는 WASD 키나 방향키를 사용하면 될 것 같습니다.

  3. timeout 함수를 쓰면 편하지만, 입력이 들어올 때마다 뱀이 움직일 수 있다. 그래서 C++ 라이브러리인 chrono를 사용해서 시간이 300ms 마다 뱀의 위치를 업데이트 하는 것으로 한다. 이러면 문제가 getchar 가 사용자의 입력을 무한 대기한다는 점인데, ncurses 라이브러리의 nodelay 함수를 사용하면 getchar 의 입력여부에 상관없이 프로그램이 작동하게 된다.

Noewewwwew commented 1 year ago
  1. Snake Game Start : head(11,10), body(11,11),(11,12)에 표시 // 시작은 왼쪽 방향으로 시작
  2. 뱀 구조 : ==
  3. 이동 : 시작하기 전 입력을 받아 사용자가 게임 난이도를 설정할 수 있게 하여 Tick을 1초(쉬움), 0.5초(보통), 0.2~3초(어려움)과 같은 난이도 조절 기능 추가
  4. 키 입력 : ==
  5. 방향 전환 : 입력 받은 키를 다음 Tick에서 적용

"=="는 위에서 나온 아이디어와 같아서 비워뒀습니다.

Noewewwwew commented 1 year ago

게임이 시작할 때 SNAKE의 몸통의 길이 2를 포함한 전체 길이가 3이므로 SnakeGame()에서 for문을 for(int i = 1; i < 3; i++)으로 수정하면 2단계 구현은 문제 없는 것 같습니다.

powerslam commented 1 year ago

지금 코드는 SnakeGame안에 모든 로직이 포함되어 있는데, SnakeGame 안에는 최대한 게임의 진행에 관한 코드만 작성하여 기능의 구분을 명확하게 하는 것이 좋아보임. 그래서 이번에 추가한 Snake 코드를 Snake class로 분리하는 수정을 거치는 게 좋을 것 같음