Ejemplo n.º 1
0
 /// <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);
 }
Ejemplo n.º 2
0
 /// <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);
     }
 }
Ejemplo n.º 3
0
        /// <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();
        }
Ejemplo n.º 4
0
 /// <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);
      * }*/
 }
Ejemplo n.º 5
0
        /// <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();
        }
Ejemplo n.º 6
0
        /// <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);
        }
Ejemplo n.º 7
0
 public void enter_room(CPlayer player, CGameRoom room)
 {
     this.player      = player;
     this.battle_room = room;
 }
Ejemplo n.º 8
0
        /// <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);
        }