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); } }
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"); } }
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; }
////////////////////////////////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; } }
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; }
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; }