두더지 잡기 게임을 멀티 플레이어 경쟁 게임으로 만들어보는 프로젝트입니다.
두더지 잡기 게임의 프로젝트는 다음과 같은 구조를 가집니다.
-
서버 (라즈베리파이 + 모니터 1대)
- ui : 화면에 점수 및 게임 진행상황을 표시하는 ui 부분입니다. ui는 모니터에 표시됩니다.
- game : 게임 시스템
-
클라이언트 (아두이노 기기)
- client.ino : 클라이언트 아두이노 코드입니다.
서버 <-> 클라이언트 통신에는 Serial 통신을 사용합니다.
서버의 경우, pyserial
모듈을 사용합니다.
클라이언트에서는 Arduino 내장의 Serial 을 사용합니다.
s;
로 시작하는 일련의 문자열을 보내고, 클라이언트에서는 ;
문자로 문자열을 분할해 데이터를 처리합니다.
맵은 3*3의 2차원 구조를 가집니다. 각 칸별로 아래와 같은 번호를 가집니다.
[
[0, 1, 2],
[3, 4, 5],
[6, 7, 8]
]
서버에서 클라이언트에 데이터를 보낼 때는, 이 맵 데이터를 직렬화한 길이 9짜리 숫자를 보냅니다.
각 숫자는 해당 칸에 배치될 아이템의 번호로, 아이템 종류는 하단에 기술합니다.
ex : 001030500
c;
로 시작하는 일련의 문자열을 보내고, 서버에서는 ;
문자로 문자열을 분할해 데이터를 처리합니다.
플레이어가 타격한 칸이 있는지 없는지를 나타냅니다. 만약 false 일 경우, 이후의 데이터가 전달되지 않을 수 있습니다. (추후 개발에 따라 변할 수 있음.)
아래에서는 게임의 구성요소에 대해 설명합니다.
게임 내에는 주기가 존재합니다. 한 주기에, 서버측과 클라이언트측의 데이터 교환이 한번씩 일어납니다. 클라이언트에서, 아이템이 1회 갱신됩니다. 서버측에서, 게임 정보가 1회 갱신됩니다.
아이템은, 3*3의 두더지 패널에 배치되는 요소들입니다. 플레이에 변화를 주고, 플레이어가 때릴지 말지 판단하도록 합니다. 0. BLANK : 아무것도 없는 칸입니다. 때려도 아무 일도 일어나지 않습니다.
- HEAL_SELF : 자신을 회복하는 칸입니다. 피격시 상대방에게 피해를 입히진 않지만 자신의 체력을 (수치) 만큼 회복합니다.
- BLOCK_OPPONENT : 상대방이 일시적으로 피격하지 못하도록 상대방의 패널을 (수치) 주기 동안 봉쇄합니다.
- ATTACK_OPPONENT : 상대방을 공격해 (수치) 만큼의 피해를 입힙니다.
- HEAL_OPPONENT : 피격시 상대방을 (수치) 만큼 회복합니다.
구현한 코드는 다음에서 볼 수 있습니다 : 코드 보기 : PanelItem(enum.Enum)