Пример #1
0
bool PieceManager::GetRequest(std::list<SliceInfo> &slice_list, t_uint32 want_num, const BitField &remote_own_pieces)
{
    assert(want_num > 0);
    slice_list.clear();
    DownloadingPiece* pdown = get_best_downloading(remote_own_pieces);
    if(pdown == 0)
    {
        DEBUG_PRINT0("get_best_downloading failed\n");
        return false;
    } else
    {
        for(size_t i = 0; i < want_num; ++i)
        {
            SliceInfo si;
            if(!pdown->GetRequest(si, IsEndGame()))
            {
                DEBUG_PRINT1("pdown->GetRequest(si) failed slist.size() == %d\n", slice_list.size());
                break;
            } else
            {
                DEBUG_PRINT1("slice_list.size() == %d\n", slice_list.size());
                slice_list.push_back(si);
            }
        }
        return (slice_list.size() > 0);
    }
}
Пример #2
0
void ShowGame()
{
    system("cls");
    for (int i = 0; i < GAME_HIGH; i++)
    {
        for (int j = 0; j < GAME_LENGTH; j++)
        {
            if (g_Game[i][j] == 'N' ||
                g_Game[i][j] == 2)
            {
                printf("¡ö");
            }
            else if( g_Game[i][j] == 0)
            {
                //printf("¡õ");
                printf("  ");
            }
        }
        printf("\r\n");
    }

    printf("Score:%d \r\n", g_nScore);

    if (IsEndGame())
    {
        printf("Game over!\r\n");
        system("pause");
    }
    
}
Пример #3
0
bool GGameScene::CheckEndGame()
{
	GUserCtlrManager* userCtlrManager = (GUserCtlrManager*)((GActorCtlrManager*)mpsActorManages[USER_CTLRMANAGER]);
	if( mpsEnemyCastle->GetCurrentHP() <= 0 )
	{
		if( IsEndGame() == false )
			WinGame();
		SetEndGame( true );
		return true;
	}
	else if( mpsForcesCastle->GetCurrentHP() <= 0 || userCtlrManager->GetUserCurrentHP() <= 0 )
	{
		if( IsEndGame() == false )
			LoseGame();
		SetEndGame( true );
		return true;
	}
	
	return false;
}
Пример #4
0
////////////////////////////////new/////////////////////////////////////////////
DownloadingPiece* PieceManager::get_best_downloading(const BitField &remote_own_pieces)
{
    t_uint32 best_pidx = NONE_PIECE_INDEX;
    t_uint32 best_num = 0;

    DownloadingPiece *pdown = 0;

    for(StartedPiecesMap::iterator it = m_started_pieces.begin(); it != m_started_pieces.end(); ++it)
    {
        t_uint32 pidx = it->second->GetPieceIdx();
        assert(pidx < m_bitfield.NBits());
        assert(m_pieces_info[pidx].state == P_DOWNLOADING);

        if(remote_own_pieces.IsSet(pidx) && it->second->HasFreeSlice(IsEndGame()))
        {
            if(m_pieces_info[pidx].have > best_num)
            {
                best_pidx = pidx;
                best_num = m_pieces_info[pidx].have;
                pdown = it->second;
            }
        }
    }

    if(pdown != 0)
    {
        assert(best_num > 0);
        return pdown;
    }

    t_uint32 piece_idx = NONE_PIECE_INDEX;
    if(!get_req_piece(piece_idx, remote_own_pieces))
    {
        return 0;
    } else
    {
        assert(m_pieces_info[piece_idx].state == P_FREE);
        m_pieces_info[piece_idx].state = P_DOWNLOADING;
        DownloadingPiece *pd = new DownloadingPiece(piece_idx, m_torrent_file.GetPieceLength(piece_idx), SLICE_LENGTH);
        assert(m_started_pieces.count(piece_idx) == 0);
        m_started_pieces[piece_idx] = pd;
        return pd;
    }
}
Пример #5
0
bool PieceManager::need_enter_endgame()
{
    if(IsEndGame())return false;

    size_t un_finished = 0;

    for(size_t idx = 0; idx < m_bitfield.NBits(); ++idx)
    {
        if(!m_bitfield.IsSet(idx))
        {
            if(++un_finished >= END_GAME_LINE)
            {
                return false;
            }
        }
    }

    return true;
}
Пример #6
0
bool PieceManager::SliceCompleted(const SliceInfo &slice_info, const t_byte *pbuf)
{
    StartedPiecesMap::iterator it = m_started_pieces.find(slice_info.piece_idx);

    if(it == m_started_pieces.end()) return false;

    DownloadingPiece *pdown = it->second;
    if(!pdown->RequestCompleted(slice_info))
    {
        return false;
    } else
    {
        WriteData(pbuf, slice_info.slice_len, slice_info.piece_idx, slice_info.start_pos);
    }

    if(pdown->IsCompleted())
    {
        if(CheckPiece(slice_info.piece_idx))
        {
            t_uint32 pidx = slice_info.piece_idx;
            assert(m_pieces_info[pidx].state == P_DOWNLOADING);
            m_pieces_info[pidx].state = P_DONE;

            t_uint32 pos = m_pos_in_interests[pidx];

            assert(pos != NONE_POS);
            m_pos_in_interests[pidx] = NONE_POS;
            std::vector<t_uint32> &piece_list = m_interests[m_pieces_info[pidx].have];
            assert(!piece_list.empty());

            if(pos == piece_list.size() - 1)
            {
                piece_list.erase(piece_list.end() - 1);
            } else
            {
                piece_list[pos] = piece_list[piece_list.size() - 1];
                m_pos_in_interests[piece_list[pos]] = pos;
                piece_list.erase(piece_list.end() - 1);
            }
            m_bitfield.Set(pidx);

            //确认此片写入磁盘中(因为此片也许会在cache中)
            m_storage.FlushPiece(pidx);


            if(!IsEndGame() && need_enter_endgame())
            {
                m_is_endgame = true;
                DEBUG_PRINT0("ENTER END GAME MODE!!!!!!!!!!!!!!!\n");

            }
        } else
        {
            DEBUG_PRINT1("Piece index == %d hash check failed\n", slice_info.piece_idx);
            t_uint32 pidx = slice_info.piece_idx;
            assert(m_pieces_info[pidx].state == P_DOWNLOADING);
            m_pieces_info[pidx].state = P_FREE;
        }

        m_started_pieces.erase(it);
        delete pdown;

    }
    return true;




}