예제 #1
0
        // 보드판에 플레이어의 세균을 배치한다.
        void put_virus(byte player_index, byte row, byte col)
        {
            short position = CHelper.get_position(row, col);

            put_virus(player_index, position);
        }
예제 #2
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();
        }