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

Случайные строки

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

Статус темы:
Закрыта.
  1. Egor Ньюфаг

    Сообщения:
    52
    Спасибы:
    0
    Как сделать чтобы бот в течение игры выводил случайные строки из файла

    Код:
    if (m_GameLoadedTime==60)
    ifstream inn;
    inn.open( "gameloaded.txt" );
    uint32_t Count = 0;
    string Line;
    
    while( !inn.eof( ) && Count < 8 )
    	{
    		getline( inn, Line );
    
    		if( Line.empty( ) )
    			SendAllChat( " " );
    		else
    			SendAllChat( Line );
    
    		if( inn.eof( ) )
    			break;
    
    		Count++;
    	}
    	inn.close( );
    Как он от сюда вычисляет номер строки???
    Потом как сделать чтобы выводил не строку, а допустим выполнил команду !ping, тк все строки, переменные описаны в файле bnet.cpp, поэтому он ругается на их отсутсвие если тупо допустим ископировать текст команды.
    А sleep(60); будет работать?
  2. fake Старожила

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

    Код:
    if( count == nomerstroki)
    {
     if( Line.empty( ) )
             SendAllChat( " " );
          else
             SendAllChat( Line );
    }
  3. Egor Ньюфаг

    Сообщения:
    52
    Спасибы:
    0
    попробую, отпишу.
    ......................
    И всё же как у людей каждые 3 мин вылезает случайный текст. Не смотря на то что я хочу сделать вместо одной строки команду ping. Как это будет выглядеть? Типа синий игрок послал команду "ping"?
    ......................
    Код:
    	if (GetTime()==60)
    {		
    		ifstream inn;
    
    		int nstroki;
    		srand((unsigned)time(0));
    		nstroki = (rand()%15);
    
    		inn.open( "gameloaded.txt" );
    			uint32_t Count = 0;
    			string Line;
    			
    			while( !inn.eof( ) && Count < 15 )
    			{
    				if (Count == nstroki)
    				{
    					getline( inn, Line );
    					SendAllChat( Line );
    				}
    				if( inn.eof( ) ) break;				
    				Count++;
    			}
    			inn.close( );
    
    }
    После моих кракозябр бот вылетел
    ..................
    а, да, синтаксис рэндома вытянул из рулетки
  4. Egor Ньюфаг

    Сообщения:
    52
    Спасибы:
    0
    мертвый форум, 1-3 человека появляются, а на американском лажа. :newcry:
  5. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    попробуй так

    Код:
    if (m_GameLoadedTime==60)
    ifstream inn;
    inn.open( "gameloaded.txt" );
    uint32_t Count = 0;
    string Line;
    vector<string> randoms;
    
    while( !inn.eof( ))
       {
          getline( inn, Line );
    randoms.push_back(line);
    
          if( inn.eof( ) )
             break;
    
          Count++;
       }
       inn.close( );
    random_shuffle(randoms.begin(), randoms.end());
    Line=string();
    if (randoms.size()>0)
    Line = randoms[0];
    if (Line!=string())
    SendAllChat(Line);
    
    
    если есть какойто текст по дефоулту можно заменить
    на


    ps^ это я изменил твой кусок кода поэтому за работоспособность не могу ничего сказать..
  6. Egor Ньюфаг

    Сообщения:
    52
    Спасибы:
    0
    не хочет=(
  7. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    log

    компиляции
  8. Egor Ньюфаг

    Сообщения:
    52
    Спасибы:
    0
    Щас ещё раз заряжу. Просто не очень тестить когда компилится минуты 3, ап на серв 2 мин, включение, создание игры
    .....
    Да нет ошибок, код не работает
  9. Deals Старожила

    Сообщения:
    784
    Спасибы:
    21
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    А че автору нужно то?
    Чтоб с файла читало строки и рандомно выводило через определенный промежуток времени в игре?
  10. Deals Старожила

    Сообщения:
    784
    Спасибы:
    21
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    1. Выведет однократно (если это не отдельная ф-я)
    2. if (randoms.size()>0) стоило бы заменить на if (!randoms.empty() && Line!=string() /*это по твоему*/) SendAllChat(randoms[0]); И убрать if (randoms.size()>0) Line = randoms[0]; Т.к. любое обращение к индексу большему чем у вектора - бот вылетит с ошибкой. Хотя тут та-же проверка но выглядит не красиво.
    3. Вектор после использования обязательно нужно очищать. Т.к. если функция с данным примером вызвать разиков 10 и в файле будет 50 строк - вектор наполнится 10*50=500 индексов.
    4. ОМГ? if (m_GameLoadedTime==60) ifstream inn; Т.е. если m_GameLoadedTime==60 то создать файловый поток inn? А на остачу пофиг? :bIbIbIblya: :lol:
    Короче это вообще ОМГ :facepalm:
  11. Egor Ньюфаг

    Сообщения:
    52
    Спасибы:
    0
    В точку. Если получится, встроить команды из гейм.ццп. Ну т.е. в txt файле попадается строка !ping, бот её воспринимает как введенную в чат админом без отображения в чате.
    Просто в каком то посте прочитал что такой метод не работает(с командами) если послать команду от бота, а не обратно. Есть ещё второй способ, подключить EventPlayerBotCommand. Но я всего лишь ученик, а не учитель, я только детские задачи прошел.
    Но главное же не результат, а идея? Ну или дайте аналог, если кто встречал подобное.
    .......
    Даа, не стоит создавать утечки в круглостуточном боте на слабой железке.
    .......
    Я же говорю ноль в этом, а глупое условия я случайно копирнул ;D
  12. Deals Старожила

    Сообщения:
    784
    Спасибы:
    21
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    Данную систему довольно легко можно сделать. Даже с пингом.
    Но если я ее и напишу - выложу только патчем.
  13. Egor Ньюфаг

    Сообщения:
    52
    Спасибы:
    0
    Вообщем не знаю, но если получится, то выложи в отдельной теме. Всё же посты по 6 листов с кодом в 10 строк, выложены в 5и вариациях это убийственно.
  14. Deals Старожила

    Сообщения:
    784
    Спасибы:
    21
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    А какой бот и какой версии?
  15. Egor Ньюфаг

    Сообщения:
    52
    Спасибы:
    0
    brt 1.7.0.91.
  16. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    посмотри первый пост
    измененно только:

    Код:
    string Line;
    vector<string> randoms;
    
    getline( inn, Line );
    randoms.push_back(line);
    
    random_shuffle(randoms.begin(), randoms.end());
    Line=string();
    if (randoms.size()>0)
    Line = randoms[0];
    if (Line!=string())
    SendAllChat(Line);
    забыл randoms.clear();
    а переменная лайн нужна для последушей оброботки строки, мб автор захочет внедрить переменные?

    upd: если те нужно на протяжении всей игры то вектор можно не очищять...
  17. Egor Ньюфаг

    Сообщения:
    52
    Спасибы:
    0
    это уже кто захочет, тема конкретная.
    Спасибо за рэндом.
    В итоге вот что получилось
    game_base.h - объявил
    Код:
    	
    int n_raz;
    int q_min;
    int vrema;
    bool slu4_stroki;
    
    game_base.cpp - присвоил
    Код:
    n_raz=0;
    q_min=1; // частота в минутах
    vrema=0;
    bool slu4_stroki=true;
    
    game_base.cpp в условии if( m_GameLoaded ) или после условия m_GameLoadedMessage - выполнил
    Код:
    if (slu4_stroki)		
    	{
    	int period=3+m_GameLoadedTime+n_raz*60*q_min;
    	if (GetTime()==period && GetTime()!=vrema)
    		{
    		n_raz++;
    		vrema = GetTime();
    		ifstream inn;
    		inn.open( "gameloaded.txt" );
    		uint32_t Count = 0;
    		string Line;
    		vector<string> randoms;
    
    		while( !inn.eof( ))
    			{
    				getline( inn, Line );
    				randoms.push_back(Line);
    
    				 if( inn.eof( ) )
    				    break;
    
    		     Count++;
    			}
    		inn.close( );
    		random_shuffle(randoms.begin(), randoms.end());
    		Line=string();
    		if (randoms.size()>0)
    		Line = randoms[0];
    		if (Line!=string())
    		SendAllChat(Line);
    		}
    }
    
    Найдите утечку если она такова есть, не считая предыдущего сообщения
    Протестил
    прежде чем критиковать мой размер кода, предложи свой
    Очень хотелось бы твой вариант с автоматической командой вместо строки;
    И кстати я тупанул, можно было лангвич использовать в качестве строк, хотя, так красивей ;D
    какая частота выполнения у гэймлоадед? я поэтому поставил условие GetTime()!=vrema, тк первый раз у меня писало по 5 строк или 6, не помню точно, это получается каждые 200мс?


    Планирую боту:
    хочу сделать в боте, где вместо банов - варны(предупреждение), чтоб давал варн за 3ех кратный мат.
    хочу включить(существующий в боте) автобаланс слотов по очкам,
    введение не очков, а рангов, написал код только на вывод рангов по формулам при заходе в игру по формулам
    общие убийства >100 +1, >200 +1, >300 +1 = 3
    количество побед >20 +1, >50 +1, >100 +1 = 3
    В сумме 6 очков, то ранг игрока новичок*, а после каждой игры подсчет по этим форумалам и занесение в мускул.
    и тд...... >xxx +1, >xxx +1
  18. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    после сендаллчат либо random.clear();
    либо если текст статичен то можно вектор сделать глобальной переменной и замутить проверку.
  19. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    Код:
    	
    vector<string> randoms;
    uint32_t q_min;
    uint32_t vrema;
    bool slu4_stroki;
    
    game_base.cpp - присвоил
    Код:
    q_min=1; // частота в минутах
    vrema=0;
    bool slu4_stroki=true;
    randoms.clear();
    ifstream inn;
    inn.open( "gameloaded.txt" );
    while( !inn.eof( ))
    	{
    	getline( inn, Line );
    	randoms.push_back(Line);
    	if( inn.eof( ) )
    	break;
    	}
    inn.close( );
    
    game_base.cpp
    Код:
    if (slu4_stroki)		
    	{
    	if (GetTime()>=vrema+q_min*60)
    		{
    		string Line=string();
    		if (!randoms.empty())
    			{
    			random_shuffle(randoms.begin(), randoms.end());
    			Line = random.front();
    			}
    		if (!Line.empty())
    			{
    			//обработка строки
    			SendAllChat(Line);
    			}
    		vrema = GetTime();
    		}
    }
    
    вроде бы так...
  20. Egor Ньюфаг

    Сообщения:
    52
    Спасибы:
    0
    Да, так логичнее.
    Всем спасибо, тема закрыта.
Статус темы:
Закрыта.