1 of 21

SNAKE GAME

우리가 배운 내용 응용해봅시다

아 몰랑 일단 만들어봐

2 of 21

넌 누구?

  • 40대 아조씨
  • 네트워크 장비 QA 및 QA 자동화 개발자(약 8년)
  • 인프라 운영 자동화 개발자(약 5년)
  • 주 언어
    • 한국어
    • Python
    • Vue.js (아주 약간)
    • C# (같이 시작했죠?)

3 of 21

SNAKE GAME 이란?

  • 뱀에게 먹이를 먹여 길이를 키우는 게임
  • 머리가 움직인 방향으로 몸이 따라감 (뱀이니까!?)
  • 되도록 몸을 최대한 길게 만드는 것이 관건

4 of 21

만든 이유?

  • 콘솔 실습이었던 소코반 게임과 유사한 패턴으로 만들 수 있음.
  • 실시간 데이터 편집에 대한 공부를 할 수 있음.
  • 그냥 한번 만들어 보고 싶었음.

(사실 이게 가장 큰 이유)

5 of 21

주요 목표

  • 소코반 응용
  • 자동 움직임 및 자동 움직임 내 Keyboard 입력 가능 구현
  • 벽이나 자기 몸에 부딪힐 경우 게임 종료 구현
  • 먹이를 획득할 경우 길이 변화 구현
  • 몸이 길어지면
    • 머리는 사용자 입력에 따라 움직임
    • 몸통은 지나간 궤적 유지
    • 꼬리는 궤적을 따라 움직임

6 of 21

프로그램 흐름도

Main

  • 게임 데이터 준비
  • 맵 정의
  • 플레이어 정의
  • 먹이 정의
  • 키 입력 대기
    • Escape 시 강제 종료
  • 플레이어 자동 이동
  • 충돌 조건 별 행위 정의
    • 벽 or 몸 ; 게임오버
    • 먹이 ; 몸통 추가 + 먹이 재생성
  • 맵 데이터 갱신
  • 콘솔에 그리기

  • 결과 출력

강제 종료 혹은

게임오버 조건 발생시

7 of 21

구현 핵심 내용 및 코드

  • List? : “간단히 배열보다 데이터 변조가 비교적 자유로운”
    • MSDN 링크
    • (솔직히 Python 때 List 생각나서 찾아봐서 썼습니다)

데이터 구조

8 of 21

구현 핵심 내용 및 코드

  • 플레이어 및 먹이 위치를 무작위로 주기 위해 사용
  • MSDN 링크

Random

9 of 21

구현 핵심 내용 및 코드

  • “async Task” “await” 는 일단 잊으세요!!
  • Console.KeyAvailable; MSDN (링크)
    • Input Stream 에서 키 입력이 사용 가능한지 여부 확인.
  • 복수개의 자료 리턴
    • “Tuple” (Immutable) ; MSDN (링크)

키 입력

10 of 21

구현 핵심 내용 및 코드

  • GetVectorPosOfDirection
    • Head 의 방향에 따른 다음 VectorPos 값 획득
  • 몸통의 위치 정보 갱신

  • 머리의 새로운 위치 정보 갱신

자동 이동

11 of 21

구현 핵심 내용 및 코드

  • 머리가 벽을 부딪히거나 (OR) 내 몸에 부딪히거나

게임 오버

12 of 21

구현 핵심 내용 및 코드

  • 몸통 늘리기 (데이터 구조 참고)
  • 새로운 먹이 놓기 (Random 활용)

먹이 먹기

13 of 21

구현 핵심 내용 및 코드

  • 모든 데이터를 새로 갱신.
    • 뱀이 지나간 공간을 EMPTY 로 채워 주기 위함
    • 최적화 취약성 있음.

맵 데이터 갱신

14 of 21

구현 핵심 내용 및 코드

  • 갱신한 맵 데이터를 화면에 출력

화면 출력

15 of 21

구현 핵심 내용 및 코드

  • Task 를 활용했기 때문에 Task 내 Delay 기능 사용.
  • 기존 Main 함수에서는 `Thread.Sleep`을 쓰면 같은 효과.
    • 해당 함수를 이용해 초당 Frame 제어.
  • gameValue.Interval 값이 작을 수록 Frame/sec 가 높아짐 �🔜 성능 이슈 발생 가능�🔜 뱀이 미쳐 날뛸 수도 있다

Frame 제어

16 of 21

Demonstration

17 of 21

고찰

  • 비동기(Async)?
    • 🔹동기; 기능의 종료시까지 대기 �🔹비동기; 기능의 종료 여부에 따른 대기X
    • 이런 키워드는 어떻게 알았나?
      • Web 개발 쪽에서는 자주 쓰는 용어.
    • 왜? 쓰려고 했는가?
      • 자동 이동과 키보드 입력의 동시성을 확보하기 위해. 하지만,
      • 사실 굳이 사용 할 필요가 없었다고 한다. �아래 기능으로 인해..
    • Console.KeyAvailable
      • Input Stream 에서 키 입력이 사용 가능한지 여부 확인.

18 of 21

고찰

  • Console.KeyAvailable

키보드 입력

Stream Buffer

(Queue, FIFO, ..)

프로그램

데이터 전달

데이터 적재

데이터 회수

19 of 21

고찰

  • 몸체 움직임 (feat. 그림 그리기의 중요성)
    • 머리속에서만 생각하면?
      • 눈에 보이지 않아 사고가 정지되는 경우가 많다!!
    • 손으로 그려가며 혹은 써가며 생각하기
      • 시각 정보가 추가되어 사고의 흐름이 유연 해진다.
      • 코드화 시키기도 좋다.
    • 디버그 툴 사용?
      • 익숙해 지기 까지 갭 극복 필요.
      • 디버그 툴 활용이 어려운 경우도 있음.
      • 설계 단계에서부터 디버그 툴을 쓸 수는 없잖아요? 😀

하지만 여러분!

이건 지극~~히 개인적인 의견 입니다!

20 of 21

Q & A

21 of 21

Thank you for your attention.