Beispiel #1
0
 // 플레이어의 상태를 변경합니다.
 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);
        }
Beispiel #3
0
        // 클라이언트에서 턴 연출이 모두 완료 되었을 때 호출합니다.
        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();
        }
Beispiel #4
0
        // 상대방의 세균을 감염시킨다.
        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);
            }
        }
Beispiel #5
0
        // 클라이언트에서 로딩을 완료한 후 요청함
        // 이 요청이 들어오면 게임을 시작해도 좋다는 뜻이다.
        // sender == 요청한 유저
        public void loading_complete(CPlayer sender)
        {
            // 해당 플레이어를 로딩완료 상태로 변경한다.
            change_playerstate(sender, PLAYER_STATE.LOADING_COMPLETE);

            // 모든 유저가 준비 상태인지 체크한다.
            if (!allplayers_ready(PLAYER_STATE.LOADING_COMPLETE))
            {
                // 아직 준비가 안된 유저가 있다면 대기한다.
                return;
            }

            // 모든 유저가 준비 상태인지 체크한다.
            // 아직 준비가 안된 유저가 있다면 대기한다.
            // 모두 준비 되었다면 게임을 시작한다.
            battle_start();
        }
Beispiel #6
0
        // 클라이언트의 이동 요청
        // 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();
        }
Beispiel #7
0
 public void enter_room(CPlayer player, CGameRoom room)
 {
     this.player      = player;
     this.battle_room = room;
 }