유니티 엔진 - 게임 프로젝트/데디케이트 기반 모바일 게임

인게임 구현 - 4) 보드판에 놓여진 마커 검증 + 승패 판단

monstro 2026. 1. 6. 16:36
728x90
반응형

- 개요

플레이어가 보드판에 놓은 마커의 결과를 판단하고 결과에 따라 승패를 결정하는 로직을 추가한다

 

- 서버 사이드

1) BasicExtensions 클래스

 

확장 메서드를 소유하고 있는 BasicExtensions 클래스를 생성한다

GetRowCol 함수의 로직을 위와 같이 구성하여 인자로 받은 인덱스에 해당하는 행과 열의 값을 반환한다

 

2) UsersManager 클래스

 

GetConnection 함수의 오버로드 버전을 추가한다

인자로 사용자의 아이디를 받아 일치하는 사용자의 ServerConnection을 반환한다

 

3) Game 클래스

동일한 namespace에 MarkResult 구조체 추가

 

동일한 namespace MarkResult 구조체를 새롭게 생성한다

구성은 다음과 같다

  • Outcome 멤버변수 : 놓여진 마커로 인해 발생한 3가지 결과
  • WinLineType 멤버변수 : 우승했을 경우 놓여진 마커로 만든 라인의 상태

 

 

 

2개의 멤버변수를 새로 추가한다

  • GRID_SIZE 멤버변수 : 보드판의 가로 + 세로
  • Grid 멤버변수 : 보드판에 놓인 마커들을 저장하는 역할

 

생성자에서는 Grid 멤버변수의 크기를 설정한다

 

 

GetOpponent 함수를 새롭게 추가하여 인자로 받은 값에 따라 상대 유저의 이름을 반환한다

 

 

GetPlayerType 함수를 새롭게 추가하여 인자로 받은 플레이어의 ID를 비교하여 마커의 타입을 반환한다

 

 

ResolveLineTypeRow 함수ResolveLineTypeCol 함수를 새롭게 추가하여

하나의 행을 전부 채워 승리했거나 하나의 열을 전부 채워 승리했다면 해당하는 승리를 반환한다

 

 

CheckWin 함수를 추가하여 승리의 경우의 수를 판별하여 승리했는지 승리의 경우를 반환한다

  • 가로 행(Row)을 검사하여 승리했는지 판단 
  • 세로 열(Col)을 검사하여 승리했는지 판단
  • [0, 0] ~ [2, 2]의 정대각선을 검사하여 승리했는지 판단
  • [0, 2] ~ [2, 0]의 역대각선을 검사하여 승리했는지 판단
  • 위 판단식에서 반환하지 못했다면 아직 승리가 결정되지 않음

 

 

CheckDraw 함수를 추가하여 빈칸이 남아있다무승부가 아니므로 false를 반환하고

빈칸이 존재하지 않는다무승부이므로 true를 반환한다

 

 

MarkCell 함수를 추가하여 보드판에 놓인 마커의 결과값을 반환한다

  • 1) 마커가 놓인 위치의 인덱스를 사용하여 을 반환
  • 2) 반환된 행과 열의 위치플레이어의 타입에 맞는 마커를 저장
  • 3) 반환된 행과 열의 위치를 사용하여 승리했는지승리 타입 저장
  • 4) 무승부를 확인
  • 승리했다면 : 반환할 MarkResultOutcomeWin으로 설정 + WinLineType 3)의 승리 타입으로 설정
  • 무승부라면 : 반환할 MarkResultOutcomeDraw로 설정
  • 이후 MarkResult 반환

 

4) MarkCellRequestHandler 클래스

 

3개의 멤버변수를 추가하여 플레이어에 대한 접근 + 게임에 대한 접근 + 네트워크 통신을 처리한다

생성자에서 추가한 3개의 멤버변수를 설정한다

 

 

Validate 함수를 새롭게 추가하여 게임을 검증한다

  • Game의 현재 플레이어 이름검증중인 플레이어 이름동일하지 않은 경우 예외 처리
  • 마커를 놓을 보드판의 위치이미 채워진 경우 예외 처리

 

 

Handle 함수에 위의 로직을 새롭게 추가한다

  • 패킷을 전송한 플레이어의 아이디를 사용하여 Game 인스턴스를 가져옴
  • Game 인스턴스부가 정보를 사용하여 검증
  • Game 인스턴스로부터 MarkCell 함수를 호출하여 마커를 놓은 결과값 저장
  • 새로운 Net_OnMarkCell 패킷을 생성하고 저장한 결과값으로 설정
  • 설정된 패킷을 플레이어상대 플레이어게게 전송

 

- 클라이언트 사이드

1) UI_BoardCell 클래스

 

CellClicked 함수에 로직을 추가하여 Net_MarkCellRequest 패킷을 생성하고 서버로 전송한다

728x90
반응형