1. Соблюдайте Правила форума и проявляйте уважение к другим участникам беседы.

update_dota_elo только для > 3 игроков

Тема в разделе 'Кодинг/Собственные решения', создана пользователем k1b0rg, 19 дек 2010.

  1. k1b0rg Ньюфаг

    Сообщения:
    34
    Спасибы:
    0
    Добрый день!
    Требуется сделать так, что бы update_dota_elo начислял очки только если в игре > 3 игроков
    Предпологаю, что нужно это делать тут:
    update_dota_elo.cpp
    Код:
    		string QSelectPlayers = "SELECT dota_elo_scores.id, gameplayers.name, spoofedrealm, newcolour, winner, score FROM dotaplayers LEFT JOIN dotagames ON dotagames.gameid=dotaplayers.gameid LEFT JOIN gameplayers ON gameplayers.gameid=dotaplayers.gameid AND gameplayers.colour=dotaplayers.colour LEFT JOIN dota_elo_scores ON dota_elo_scores.name=gameplayers.name WHERE dotaplayers.gameid=" + UTIL_ToString( GameID );
    
    		if( mysql_real_query( Connection, QSelectPlayers.c_str( ), QSelectPlayers.size( ) ) != 0 )
    		{
    			cout << "error2: " << mysql_error( Connection ) << endl;
    			return 1;
    		}
    
    пример результата, для игры 3х1:
    Код:
    +------+---------+--------------+-----------+--------+---------+
    | id   | name    | spoofedrealm | newcolour | winner | score   |
    +------+---------+--------------+-----------+--------+---------+
    |  381 | BARFY   | bnet.local   |         1 |      1 | 1014.24 |
    |  380 | BonD    | bnet.local   |         2 |      1 |  985.76 |
    | NULL | NULL    | NULL         |         3 |      1 | NULL    |
    | NULL | NULL    | NULL         |         4 |      1 | NULL    |
    | NULL | NULL    | NULL         |         5 |      1 | NULL    |
    |   59 | EgoiZma |              |         7 |      1 | 1067.54 |
    | NULL | NULL    | NULL         |         8 |      1 | NULL    |
    | NULL | NULL    | NULL         |         9 |      1 | NULL    |
    | NULL | NULL    | NULL         |        10 |      1 | NULL    |
    | NULL | NULL    | NULL         |        11 |      1 | NULL    |
    +------+---------+--------------+-----------+--------+---------+
    
    Решить думаю можно, так:
    проверять результат(скорей всего это массив), на количество не занулленых строк столбца name.
    Не знаю как это реализовать в C++, прошу помощи )

    P.S update_dota_elo с brtGhost
    http://code.google.com/p/brtghost/sourc ... .cpp?r=128
  2. k1b0rg Ньюфаг

    Сообщения:
    34
    Спасибы:
    0
    придумал пока такое вот глупое решение...
    update_dota_elo.cpp
    Код:
    				bool ignore = false;
    				uint32_t rowids[10];
    				string names[10];
    				string servers[10];
    				bool exists[10];
    				int num_players = 0;
    
    вначало добавляем int polojitelno = 0;
    находим:
    Код:
    					if( !Row[0].empty( ) )
    						rowids[num_players] = UTIL_ToUInt32( Row[0] );
    					else
    						rowids[num_players] = 0;
    
    заменяем на:
    Код:
    					if( !Row[0].empty( ) )
    					{
    						rowids[num_players] = UTIL_ToUInt32( Row[0] );
    					    polojitelno++;
    					}
    					else
    					{
    						rowids[num_players] = 0;
    					}
    
    находим:
    Код:
    					else
    					{
    						cout << "gameid " << UTIL_ToString( GameID ) << " has a player with an invalid newcolour, ignoring" << endl;
    						ignore = true;
    						break;
    					}
    
    					num_players++;
    					Row = MySQLFetchRow( Result );
    				}
    
    				mysql_free_result( Result );
    
    после добавляем:
    Код:
                    if( polojitelno < 4)
    				{
    						cout << "gameid " << UTIL_ToString( GameID ) << " hhas less than 4 players" << endl;
    						ignore = true;
    						//break;
    				}
    
  3. Fanat Ranetok Старожила

    Сообщения:
    167
    Спасибы:
    0
    Сборка бота GHost:
    Skynet++ 2.0
    кран штоле? не проще ли вообще в базу не писать результат таких игр?
  4. k1b0rg Ньюфаг

    Сообщения:
    34
    Спасибы:
    0
    умник? - подскажи.
    проще, но мне не подходит такой вариант.
  5. Fanat Ranetok Старожила

    Сообщения:
    167
    Спасибы:
    0
    Сборка бота GHost:
    Skynet++ 2.0
    ну а какой вообще смысл их сохранять?
  6. k1b0rg Ньюфаг

    Сообщения:
    34
    Спасибы:
    0
    образумил.
    в принципе да, проще, но все же не всегда.
    второй пост пригодится для пересчёта рейтинга, т.к игры не очень охото удалять.
    к сожелению сейчас нет под рукой кода и VS, если есть готовые наработки, подскажи, как не писать в базу игры с кол-вом игроков < 4, буду благодарен!
  7. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    Как по мне,то должно записываться всё, но подсчёт очей только в случае
    равного количества игроков в обоих тимах.
  8. k1b0rg Ньюфаг

    Сообщения:
    34
    Спасибы:
    0
    вот-вот, того же мнения. взаимно :)
  9. k1b0rg Ньюфаг

    Сообщения:
    34
    Спасибы:
    0
    предполагаяю, что делать проверку надо тут:
    Код:
    	if( m_Players.empty( ) && ( m_GameLoading || m_GameLoaded ) )
    	{
    		if( !m_Saving )
    		{
    			CONSOLE_Print( "[GAME: " + m_GameName + "] is over (no players left)" );
    			SaveGameData( );
    
    			m_Saving = true;
    		}
    		else if( IsGameDataSaved( ) )
    			return true;
    	}
    
    но, не знаю как узнать кол-во игроков, т.е как измерить m_Players?
  10. Fanat Ranetok Старожила

    Сообщения:
    167
    Спасибы:
    0
    Сборка бота GHost:
    Skynet++ 2.0
    в классе CBaseGame организовать новую переменную, а затем в методе EventGameLoaded( ) сохранить в ней результат GetNumHumanPlayers( ). где сохраняется игра - ты правильно нашел, плюс еще надо воткнуть проверку при сохранении самих игроков, это делается в деструкторе ~CGame.
  11. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    лол а не легче в ф-кции сейва?)
    statsdota.cpp
    вот этот код изменяем
    Код:
    		for( unsigned int i = 0; i < 12; i++ )
    		{
    			if( m_Players[i] )
    			{
    				uint32_t Colour = m_Players[i]->GetNewColour( );
    
    				if( !( ( Colour >= 1 && Colour <= 5 ) || ( Colour >= 7 && Colour <= 11 ) ) )
    				{
    					CONSOLE_Print( "[STATSDOTA: " + m_Game->GetGameName( ) + "] discarding player data, invalid colour found" );
    					DB->Commit( );
    					return;
    				}
    
    				for( unsigned int j = i + 1; j < 12; j++ )
    				{
    					if( m_Players[j] && Colour == m_Players[j]->GetNewColour( ) )
    					{
    						CONSOLE_Print( "[STATSDOTA: " + m_Game->GetGameName( ) + "] discarding player data, duplicate colour found" );
    						DB->Commit( );
    						return;
    					}
    				}
    			}
    		}
    
    		// save the dotaplayers
    
    		for( unsigned int i = 0; i < 12; i++ )
    		{
    			if( m_Players[i] && m_Winner!=0 )
    			{
    				GHost->m_Callables.push_back( DB->ThreadedDotAPlayerAdd( GameID, m_Players[i]->GetColour( ), m_Players[i]->GetKills( ), m_Players[i]->GetDeaths( ), m_Players[i]->GetCreepKills( ), m_Players[i]->GetCreepDenies( ), m_Players[i]->GetAssists( ), m_Players[i]->GetGold( ), m_Players[i]->GetNeutralKills( ), m_Players[i]->GetItem( 0 ), m_Players[i]->GetItem( 1 ), m_Players[i]->GetItem( 2 ), m_Players[i]->GetItem( 3 ), m_Players[i]->GetItem( 4 ), m_Players[i]->GetItem( 5 ), m_Players[i]->GetHero( ), m_Players[i]->GetNewColour( ), m_Players[i]->GetTowerKills( ), m_Players[i]->GetRaxKills( ), m_Players[i]->GetCourierKills( ) ) );
    				Players++;
    			}
    		}
    для простототы я сделал вот так...Если не ясно объясню
    Код:
    		for( unsigned int i = 0; i < 12; i++ )
    		{
    			if( m_Players[i] )
    			{
    				Players++;
    				uint32_t Colour = m_Players[i]->GetNewColour( );
    
    				if( !( ( Colour >= 1 && Colour <= 5 ) || ( Colour >= 7 && Colour <= 11 ) ) )
    				{
    					CONSOLE_Print( "[STATSDOTA: " + m_Game->GetGameName( ) + "] discarding player data, invalid colour found" );
    					DB->Commit( );
    					return;
    				}
    
    				for( unsigned int j = i + 1; j < 12; j++ )
    				{
    					if( m_Players[j] && Colour == m_Players[j]->GetNewColour( ) )
    					{
    						CONSOLE_Print( "[STATSDOTA: " + m_Game->GetGameName( ) + "] discarding player data, duplicate colour found" );
    						DB->Commit( );
    						return;
    					}
    				}
    			}
    		}
    
    		// save the dotaplayers
    if(Players<4)
    return;
    		for( unsigned int i = 0; i < 12; i++ )
    		{
    			if( m_Players[i] && m_Winner!=0 )
    			{
    				GHost->m_Callables.push_back( DB->ThreadedDotAPlayerAdd( GameID, m_Players[i]->GetColour( ), m_Players[i]->GetKills( ), m_Players[i]->GetDeaths( ), m_Players[i]->GetCreepKills( ), m_Players[i]->GetCreepDenies( ), m_Players[i]->GetAssists( ), m_Players[i]->GetGold( ), m_Players[i]->GetNeutralKills( ), m_Players[i]->GetItem( 0 ), m_Players[i]->GetItem( 1 ), m_Players[i]->GetItem( 2 ), m_Players[i]->GetItem( 3 ), m_Players[i]->GetItem( 4 ), m_Players[i]->GetItem( 5 ), m_Players[i]->GetHero( ), m_Players[i]->GetNewColour( ), m_Players[i]->GetTowerKills( ), m_Players[i]->GetRaxKills( ), m_Players[i]->GetCourierKills( ) ) );
    			
    			}
    		}
  12. Fanat Ranetok Старожила

    Сообщения:
    167
    Спасибы:
    0
    Сборка бота GHost:
    Skynet++ 2.0
    ща еще раз посмотрел - ничо менять при сохранении игроков не надо, у нас m_CallableGameAdd будет NULL, значит этот код даже не выполнится.
  13. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    этот код не дополнение к вашему,а альтернатива...
  14. Fanat Ranetok Старожила

    Сообщения:
    167
    Спасибы:
    0
    Сборка бота GHost:
    Skynet++ 2.0
    ок. но смысл в том, что при таком раскладе сама игра всегда пишется в базу, а игроки могут не всегда писаться, поэтому сомнительно выглядит.
  15. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    да, но проверку можно переместить выше
    зато в этом коде есть явные плюсы:
    во первых код будет работать только для доты + дота игры будут сохраняться как обычные
    т.е не полный игнор, а игнор только статистики...
    во вторых (сомнительный плюс) fakeplayerы тоже считаются игроками
    ну и весь код в одном месте...
  16. Fanat Ranetok Старожила

    Сообщения:
    167
    Спасибы:
    0
    Сборка бота GHost:
    Skynet++ 2.0
    ну вот скажи, нахрена вообще нужны игры с 3 игроками, тем более без статистики? замусоривание базы, да и только.
  17. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    имхо вся возможная инфа про игры должна записываться в базы.
    Если ты считаеш что эт замусоривание базы то твоё право не добовлять эти игры в базу, более того можеш даже не добовлять игры которые не поддерживают статистику(Не дота игры).
    да и игры 1х1 почему они не должны быть записанны в базу?
  18. Fanat Ranetok Старожила

    Сообщения:
    167
    Спасибы:
    0
    Сборка бота GHost:
    Skynet++ 2.0
    так хочет автор, я тут причем?