/// <summary> /// 게임을 지속 할 수 있는지 체크한다. /// </summary> /// <param name="board"></param> /// <param name="players"></param> /// <param name="current_player_index"></param> /// <returns></returns> 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); }
/// <summary> /// 플레이어의 상태를 변경한다. /// </summary> /// <param name="player"></param> /// <param name="state"></param> 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); } }
/// <summary> /// 클라이언트에서 턴 연출이 모두 완료 되었을 때 호출된다. /// </summary> /// <param name="sender"></param> public void turn_finished(CPlayer sender) { change_playerstate(sender, PLAYER_STATE.CLIENT_TURN_FINISHED); if (!allplayers_ready(PLAYER_STATE.CLIENT_TURN_FINISHED)) { return; } // 턴을 넘긴다. turn_end(); }
/// <summary> /// 상대방의 세균을 감염 시킨다. /// </summary> /// <param name="basis_cell"></param> /// <param name="attacker"></param> /// <param name="victim"></param> 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); * }*/ }
/// <summary> /// 클라이언트에서 로딩을 완료한 후 요청함. /// 이 요청이 들어오면 게임을 시작해도 좋다는 뜻이다. /// </summary> /// <param name="sender">요청한 유저</param> public void loading_complete(CPlayer player) { // 해당 플레이어를 로딩완료 상태로 변경한다. change_playerstate(player, PLAYER_STATE.LOADING_COMPLETE); // 모든 유저가 준비 상태인지 체크한다. if (!allplayers_ready(PLAYER_STATE.LOADING_COMPLETE)) { // 아직 준비가 안된 유저가 있다면 대기한다. return; } // 모두 준비 되었다면 게임을 시작한다. battle_start(); }
/// <summary> /// 매칭이 성사된 플레이어들이 게임에 입장합니다. /// </summary> /// <param name="user1"></param> /// <param name="user2"></param> public void enter_gameroom(CGameUser user1, CGameUser user2) { // 플레이어들을 생성하고 각각 1번 , 2번 인덱스를 부여해 준다. CPlayer player1 = new CPlayer(user1, 1); CPlayer player2 = new CPlayer(user1, 2); // 플레이어들의 초기 상태를 지정해 준다. this.player_state.Clear(); change_playerstate(player1, PLAYER_STATE.ENTERED_ROOM); change_playerstate(player2, PLAYER_STATE.ENTERED_ROOM); // 로딩 시작메시지 전송. CPacket msg = CPacket.create((Int16)PROTOCOL.START_LOADING); broadcast(msg); }
public void enter_room(CPlayer player, CGameRoom room) { this.player = player; this.battle_room = room; }
/// <summary> /// 클라이언트의 이동 요청. /// </summary> /// <param name="sender">요청한 유저</param> /// <param name="begin_pos">시작 위치</param> /// <param name="target_pos">이동하고자 하는 위치</param> 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의 세균이 존재하는지 체크. if (this.gameboard[begin_pos] != sender.player_index) { // 시작 위치에 해당 플레이어의 세균이 존재하지 않는다. return; } // 목적지는 EMPTY_SLOT으로 설정된 빈 공간이어야 한다. // 다른 세균이 자리하고 있는 곳으로는 이동할 수 없다. if (this.gameboard[target_pos] != EMPTY_SLOT) { // 목적지에 다른 세균이 존재한다. return; } // target_pos가 이동 또는 복제 가능한 범위인지 체크. 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); // 최종 결과를 broadcast한다. CPacket msg = CPacket.create((short)PROTOCOL.PLAYER_MOVED); msg.push(sender.player_index); // 누가 msg.push(begin_pos); // 어디서 msg.push(target_pos); // 어디로 이동 했는지 broadcast(msg); }