// 보드판에 플레이어의 세균을 배치한다. void put_virus(byte player_index, byte row, byte col) { short position = CHelper.get_position(row, col); put_virus(player_index, position); }
// 클라이언트의 이동 요청 // sender = 요청한 유저 // begin_pos = 시작 위치 // target_pos = 이동하고자 하는 위치 public void moving_req(CPlayer sender, short begin_pos, short target_pos) { // sender 차례인지 체크 // 체크 이유 : 현재 자신의 차례가 아님에도 불구하고 이동 요청을 보내온다면 게임의 턴이 엉망이 됩니다. if (this.current_turn_player != sender.player_index) { // 현재 턴이 아닌 플레이어가 보낸 요청이라면 무시한다. // 이런 비정상적인 상황에서는 화면이나 파일로 로그를 남겨두는 것이 좋다 return; } // begin_pos에 sender의 캐릭터가 존재하는지 체크 // 체크 이유 : 없는 캐릭터를 이동하려고 하면 안됩니다. // Begin_pos에 Sender의 세균이 존재하는지 체크 if (this.gameboard[begin_pos] != sender.player_index) { // 시작 위치에 해당 플레이어의 세균이 존재하지 않는다. return; } // target_pos가 이동 또는 복제 가능한 범위인지 체크 // 체크 이유 : 이동할 수 없는 범위로는 갈 수 없도록 처리해야 합니다. if (this.gameboard[target_pos] != EMPTY_SLOT) { // 목적지는 0으로 설정된 빈 곳이어야 한다. // 다른 세균이 자리하고 있는 곳으로 이동할 수 없다. return; } short distance = CHelper.get_distance(begin_pos, target_pos); if (distance > 2) { // 2칸을 초과하는 거리는 이동할 수 없다. return; } if (distance <= 0) { // 자기 자신의 위치로는 이동할 수 없다. return; } // 모든 체크가 정상이라면 이동을 처리합니다. if (distance == 1) { // 이동 거리가 한 칸일 경우에는 복제를 수행한다. // 이전 위치에 있는 세균을 삭제한다. put_virus(sender.player_index, target_pos); } else if (distance == 2) { // 이동 거리가 두 칸일 경우에는 이동을 수행한다. remove_virus(sender.player_index, begin_pos); // 새로운 위치에 세균을 놓는다. put_virus(sender.player_index, target_pos); } // 세균을 이동하여 로직 처리를 수행합니다. // 전염시킬 상대방 세균이 있다면 룰에 맞게 전염시킵니다. // 목적지를 기준으로 주위에 존재하는 상대방 세균을 감염시켜 같은 편으로 만듭니다. CPlayer opponent = get_opponent_player(); infect(target_pos, sender, opponent); // 최종 결과를 모든 클라이언트들에게 전송합니다. CPacket msg = CPacket.create((short)PROTOCOL.PLAYER_MOVED); msg.push(sender.player_index); // 누가 msg.push(begin_pos); // 어디서 msg.push(target_pos); // 어디로 이동 했는지 broadcast(msg); // 턴을 종료합니다 //turn_end(); }