// 플레이어의 상태를 변경합니다. void change_playerstate(CPlayer player, PLAYER_STATE state) { if (this.player_state.ContainsKey(player.player_index)) { this.player_state[player.player_index] = state; } else { this.player_state.Add(player.player_index, state); } }
// 게임을 지속 할 수 있는지 체크한다. public static bool can_play_more(List <short> board, CPlayer current_player, List <CPlayer> all_player) { foreach (short cell in current_player.viruses) { if (CHelper.find_available_cells(cell, board, all_player).Count > 0) { return(true); } } return(false); }
// 클라이언트에서 턴 연출이 모두 완료 되었을 때 호출합니다. public void turn_finished(CPlayer sender) { change_playerstate(sender, PLAYER_STATE.CLEINT_TURN_FINISHED); if (!allPlayer_ready(PLAYER_STATE.CLEINT_TURN_FINISHED)) { return; } // 턴을 넘긴다. turn_end(); }
// 상대방의 세균을 감염시킨다. public void infect(short basis_cell, CPlayer attacker, CPlayer victim) { // 방어자의 세균 중에 기존위치로 부터 1칸 반경에 있는 세균들이 감염 대상입니다. List <short> neighbors = CHelper.find_neighbor_cells(basis_cell, victim.viruses, 1); foreach (short position in neighbors) { // 방어자의 세균을 삭제한다. remove_virus(victim.player_index, position); // 공격자의 세균을 추가한다. put_virus(attacker.player_index, position); } }
// 클라이언트에서 로딩을 완료한 후 요청함 // 이 요청이 들어오면 게임을 시작해도 좋다는 뜻이다. // sender == 요청한 유저 public void loading_complete(CPlayer sender) { // 해당 플레이어를 로딩완료 상태로 변경한다. change_playerstate(sender, PLAYER_STATE.LOADING_COMPLETE); // 모든 유저가 준비 상태인지 체크한다. if (!allplayers_ready(PLAYER_STATE.LOADING_COMPLETE)) { // 아직 준비가 안된 유저가 있다면 대기한다. return; } // 모든 유저가 준비 상태인지 체크한다. // 아직 준비가 안된 유저가 있다면 대기한다. // 모두 준비 되었다면 게임을 시작한다. battle_start(); }
// 클라이언트의 이동 요청 // 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(); }
public void enter_room(CPlayer player, CGameRoom room) { this.player = player; this.battle_room = room; }