Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Zombot (Клиент для игры Зомби ферма) [Обсуждение]

-

Свободное обсуждение

- Ваши идеи, вопросы и ответы на тему браузерных игр и социальных сетей

Ответ
 
Опции темы
Старый 02.02.2015, 15:09   #4036
 Пехотинец
Аватар для vintets
 
vintets скоро будет известенvintets скоро будет известенvintets скоро будет известен
Регистрация: 01.08.2012
Сообщений: 95
Популярность: 255
Сказал(а) спасибо: 28
Поблагодарили 54 раз(а) в 38 сообщениях
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Цитата:
Сообщение от Shurup240Посмотреть сообщение
Происходит это вот так.
Скрин

Проблема не в том, что ресурс в тени.


Добавления в рулетс сделаны

Ну видно же что учёт неправильный. Выиграл 18. Стало 25
Рубишь 22 - остаток 3
дроп 3 - остаток 6
И тут же бот рубит снова на 22...
Выводи в лог остаток инструмента.

Скорее всего ты правки не все сделал.

И в оригинальном чопере, рубил только если инструмента хватало на весь ресурс.
Здесь надеюсь ты поправил. было
PHP код:
if self._get_item_reader().get(tool.item).chopInstrumentType == type_of_instrument and tool.count >= tool_needed
на
PHP код:
if self._get_item_reader().get(tool.item).chopInstrumentType == type_of_instrument and tool.count 0
И дальше уже ограничиваем рубку. Если хочешь оставить только для трезубцев, остальное по старому, то перед формированием эвента добавляй
PHP код:
                        if tool.count tool_needed:
                            if 
type_of_instrument == '@CIT_TRIDENT':
                                
tool_needed tool.count
                                logger
.info(u'Рубим неполный')
                            else: continue 
Если хочешь всё рубить неполное (что плохо для дропа)
PHP код:
                        if tool.count tool_needed:
                            
tool_needed tool.count
                            logger
.info(u'Рубим неполный'

Последний раз редактировалось vintets; 02.02.2015 в 15:22.
  Ответить с цитированием
Старый 02.02.2015, 21:02   #4037
 Разведчик
Аватар для GadW1n
 
GadW1n никому не известный тип
Регистрация: 24.08.2011
Сообщений: 17
Популярность: 10
Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Привет всем! полгода не мониторил "рынок"... ой как много понаписано! можете ткнуть в скачку последней версии бота (лучше страницей этой темы), оттуда начну штудировать)))
хотя не откажусь и от немного доведённого до ума бота)))
всем откликнувшимся, спасибо заранее...
  Ответить с цитированием
Старый 03.02.2015, 02:54   #4038
 Разведчик
Аватар для megabyte0
 
megabyte0 никому не известный тип
Регистрация: 29.07.2014
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 8 раз(а) в 5 сообщениях
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Цитата:
Сообщение от NoraInuПосмотреть сообщение
user is not valid

message_factory и read_swf взять отсюда — http://zhyk.ru/forum/showpost.php?p=...postcount=3690
И будет рабочий бот.
Цитата:
Сообщение от vintetsПосмотреть сообщение
Скорее всего ты правки не все сделал.

Там только одна правка, от меня... логичнее было бы попросить работающий на равнине чоппер у уважаемого greyzza,
Но я таки не понимаю -- где я по сути неправ? Оно таки не ссылки вставило в локальную переменную instruments, а копии? Потом по нему for tool in instruments: , tool тоже ссылкой должен быть вроде тогда, и потом
tool.count -= tool_needed . То оно должно вычитаться именно со склада...
И почему было сделано именно копии, через dict2obj , мне тоже непонятно...

Последний раз редактировалось megabyte0; 03.02.2015 в 10:15.
  Ответить с цитированием
Старый 03.02.2015, 03:22   #4039
 Разведчик
Аватар для NoraInu
 
NoraInu никому не известный тип
Регистрация: 18.01.2015
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Цитата:
Сообщение от megabyte0Посмотреть сообщение
message_factory и read_swf взять отсюда — http://zhyk.ru/forum/showpost.php?p=...postcount=3690
И будет рабочий бот.

Воспользовалась вашим советом. Действительно, пошло дальше. Теперь вылетело с вот такой ошибкой:

Цитата:
You selected vk
2015-02-03 03:12:02,495 Логинимся...
2015-02-03 03:12:03,550 Загружаем остров...
Traceback (most recent call last):
File "src/main.py", line 93, in <module>
run_game()
File "src/main.py", line 74, in run_game
Game(site, UserPrompt(gui_input), gui_input=gui_input).start()
File "/home/nora/sources/nora/zombot-0.9.2/zombot-0.9.2/src/game_engine.py", line 324, in start
self.save_game_state(start_response)
File "/home/nora/sources/nora/zombot-0.9.2/zombot-0.9.2/src/game_engine.py", line 354, in save_game_state
self.__game_state_ = GameState(start_response, self.__itemReader)
File "/home/nora/sources/nora/zombot-0.9.2/zombot-0.9.2/src/game_engine.py", line 238, in __init__
occupied_brain_count = self.__player_brains.get_occupied_brains_count()
File "/home/nora/sources/nora/zombot-0.9.2/zombot-0.9.2/src/game_state/brains.py", line 35, in get_occupied_brains_count
zombie_types)
File "/home/nora/sources/nora/zombot-0.9.2/zombot-0.9.2/src/game_engine.py", line 63, in get_all_objects_by_types
for game_object in self.get_game_objects():
File "/home/nora/sources/nora/zombot-0.9.2/zombot-0.9.2/src/game_engine.py", line 56, in get_game_objects
return self.get_game_location().gameObjects
AttributeError: 'GameLocation' object has no attribute 'gameObjects'

  Ответить с цитированием
Старый 03.02.2015, 10:28   #4040
 Пехотинец
Аватар для vintets
 
vintets скоро будет известенvintets скоро будет известенvintets скоро будет известен
Регистрация: 01.08.2012
Сообщений: 95
Популярность: 255
Сказал(а) спасибо: 28
Поблагодарили 54 раз(а) в 38 сообщениях
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Цитата:
Сообщение от megabyte0Посмотреть сообщение
message_factory и read_swf взять отсюда — http://zhyk.ru/forum/showpost.php?p=...postcount=3690
И будет рабочий бот.

Там только одна правка, от меня... логичнее было бы попросить работающий на равнине чоппер у уважаемого greyzza,
Но я таки не понимаю -- где я по сути неправ? Оно таки не ссылки вставило в локальную переменную instruments, а копии? Потом по нему for tool in instruments: , tool тоже ссылкой должен быть вроде тогда, и потом
tool.count -= tool_needed . То оно должно вычитаться именно со склада...
И почему было сделано именно копии, через dict2obj , мне тоже непонятно...

Я на ссылки не переделывал, делал учёт так как было написано раньше.
И равнина и Сказочный лес всё нормально рубилось.
PHP код:
# coding=utf-8
import logging
import sys
import time
import os
.path
import os
from game_state
.game_types import GameWoodGraveGameWoodGraveDouble,\
    
GamePickItemGameWoodTreeGameStoneGameGainItemGamePickup
from game_state
.game_event import dict2objobj2dict
from game_actors_and_handlers
.base import BaseActor

logger 
logging.getLogger(__name__)


class 
PirateTreeCut(BaseActor):

    
def get_object_type(self):
        return 
"chop"

    
def perform_action(self):
        
options = [
                
u'вскрытие сокровищ'
                
]
        
resources self._get_game_location().get_all_objects_by_type(
                    
self.get_object_type()
                )
        
enemies self._get_game_location().get_all_objects_by_type("pirateEnemy")
          
        
# пиратские острова : Остров сокровищ , Таинственный , Жуткий , Северный полюс , Остров сокровищ , Древний
        
pirate_locs_id = ["exploration_isle1_random","exploration_isle2_random","exploration_isle3_random","exploration_snow1","exploration_isle1_1","exploration_isle4_random"]
        
_loc self._get_game_state().get_game_loc().get_location_id() # текущая локация

        
instruments = []        # переменная для инструментов
        
_loc self._get_game_state().get_game_loc().get_location_id() # текущая локация
        
        
sklad False
        
if resources:
            if 
_loc not in pirate_locs_id:
                
sklad True
                st_items 
self._get_game_state().get_state().storageItems # Предметы на складе
                #print u'СКЛАД!'
                
for item in list(st_items):
                    if 
hasattr(item"item"):
                        if 
'@CHOP_' in item.item
                            
instruments.append(dict2obj({"item":item.item"count"item.count}))
                        
                        
# или
                        # reader = self._get_item_reader().get(item.item)
                        # if reader.type == 'chopInstrument':
                            # instruments.append(dict2obj({"item":item.item, "count": item.count}))
                        
                        # или
                        # if item.item == ('@CHOP_MACHETE'): #мачете
                            # instruments.append(dict2obj({"item":"@CHOP_MACHETE", "count": item.count}))
                        # if item.item == ('@CHOP_AXE'): #топор
                            # instruments.append(dict2obj({"item":"@CHOP_AXE", "count": item.count}))
                        # if item.item == ('@CHOP_HAMMER'): #кирка
                            # instruments.append(dict2obj({"item":"@CHOP_HAMMER", "count": item.count}))
                        # if item.item == ('@CHOP_TRIDENT'): #Трезубец
                            # instruments.append(dict2obj({"item":"@CHOP_TRIDENT", "count": item.count}))
                        
                        # или ссылками, тогда исправить учёт траты
                        # if hasattr(item, "item") and item.item in ['@CHOP_MACHETE','@CHOP_AXE','@CHOP_HAMMER','@CHOP_TRIDENT','@CHOP_TRIDENT_GOLDEN']: 
                            # instruments.append(item)
            
else: instruments self._get_game_state().get_state().pirate.instruments
            
            CHOP_MACHETE 
0
            CHOP_AXE 
0
            CHOP_HAMMER 
0
            CHOP_TRIDENT 
0
            
for tool in instruments:
                if 
hasattr(tool"item"):
                    if 
tool.item == '@CHOP_MACHETE'CHOP_MACHETE tool.count
                    
if tool.item == '@CHOP_AXE'CHOP_AXE tool.count
                    
if tool.item == '@CHOP_HAMMER'CHOP_HAMMER tool.count
                    
if tool.item == '@CHOP_TRIDENT'CHOP_TRIDENT tool.count
            
print u'Инструмента перед рубкой М-Т-К-Тр:'str(CHOP_MACHETE)+'-'+str(CHOP_AXE)+'-'+str(CHOP_HAMMER)+'-'+str(CHOP_TRIDENT)
            if (
CHOP_MACHETE 250 and CHOP_HAMMER 250):
                
self._get_game_state().many_chop 1  # проставили many_chop если мачете и кирки за 250

            
resources_dict = {resource resource.for resource in resources}
            
resources_order resources_dict.items()
            if 
not hasattr(self._get_game_state(), 'many_chop'): # рублено не много, будем сортировать
                
resources_order.sort(key=lambda xx[::-1], reverse=True)  # ресурсы отсортированные по X
            #print resources_order
            
            # Пинатель       
            
if enemies:
                if 
not hasattr(self'enemies'):self.enemies = []
                for 
enemy in enemies:
                    if 
enemy.id in self.enemies:continue
                    print 
u'Шуганём сильвера '+str(enemy.id)
                    
self._get_events_sender().send_game_events([{"type":"pirateEnemy","objId":enemy.id,"action":"hit"}])
                    
self.enemies.append(enemy.id)
                    
#self._get_game_location().remove_object_by_id(enemy.id)
            
            
print u'Ресурсов видно:'len(resources_order)
            for 
resource in resources_order:
                
resource resource[0]
                
#print 'Obj: ', resource.item.ljust(27, " "), ' id = ', resource.id
                #print 'resource ', resource,' ', resource.x 
                #print obj2dict(resource)
                
tool_needed resource.chopCount
                type_of_res 
resource.item
                type_of_instrument 
self._get_item_reader().get(type_of_res).chopInstrumentType
                    
                
# сортируем что рубим, а что нет
                
if (not hasattr(self._get_game_state(), 'many_chop')): # рублено не много, ограничиваем траты
                    
if type_of_instrument == '@CIT_MACHETE':                     # мачете
                        
pass
                    elif type_of_instrument 
== '@CIT_TRIDENT':                  # трезубец
                        
pass
                    elif type_of_instrument 
== '@CIT_AXE':                       # топоры
                        
if CHOP_AXE 600 or tool_needed == 10 or tool_needed == 15 or tool_needed == 16 or tool_needed 49:
                            
pass
                        
else: continue
                    
elif type_of_instrument == '@CIT_HAMMER':                    # кирки
                        
if ('CH_BLACKSTONE' in type_of_res) or ('CH_GREENSTONE' in type_of_res) or ('CH_WHITESTONE' in type_of_res) or ('CH_CRYSTALSTONE' in type_of_res) or tool_needed 49:
                            
pass
                        
else: continue 
                
                for 
tool in instruments:
                    
#print "self._get_item_reader().get(tool.item).chopInstrumentType", self._get_item_reader().get(tool.item).chopInstrumentType
                    #print "type_of_instrument", type_of_instrument
                    
if not hasattr(tool"item"):
                        print 
u'Нет итема'obj2dict(tool)
                        continue
                    if 
self._get_item_reader().get(tool.item).chopInstrumentType == type_of_instrument and tool.count 0#= tool_needed:
                        
enemy_here 0
                        
if enemies:
                            for 
enemy in enemies:
                                if(((
enemy.resource.x)**2+(enemy.resource.y)**2)**0.5 16):
                                    
enemy_here 1
                                    
break
                        if(
enemy_here == 1):
                            
self._get_game_location().remove_object_by_id(resource.id)
                            
logger.info("Сильвер мешает вырубке "+str(resource.id))
                            break
                        
                        
# if type_of_instrument == '@CIT_HAMMER' and tool_needed == 100:
                            # tool_needed = 50
                            # logger.info(u'Снижаем удар киркой до 50')
                        
                        
if tool.count tool_needed:
                            if 
type_of_instrument == '@CIT_TRIDENT':
                                
tool_needed tool.count
                                logger
.info(u'Рубим неполный')
                            else: continue

                        
gain_event = {"type":"chop","objId":resource.id,"instruments":{self._get_item_reader().get(tool.item).id:tool_needed},"action":"chop"}
                        
logger.info(u"Рубим " +str(self._get_item_reader().get(tool.item).id).ljust(13' ')+str(tool_needed).rjust(3' ')+u'L, id '+str(gain_event['objId']))
                        
self._get_events_sender().send_game_events( [gain_event] )
                        if 
resource.chopCount == tool_needed:
                            
self._get_game_location().remove_object_by_id(resource.id)
                        else:
                            
resource.chopCount -= tool_needed
                        tool
.count -= tool_needed
                        
if sklad:
                            
#print 'type_of_instrument', type_of_instrument, 'tool.item', tool.item, 'ins', ins
                            
self._get_game_state().remove_from_storage(tool.itemtool_needed)
                        break
            
CHOP_MACHETE2 0
            CHOP_AXE2 
0
            CHOP_HAMMER2 
0
            CHOP_TRIDENT2 
0
            
for tool in instruments:
                if 
hasattr(tool"item"):
                    if 
tool.item == '@CHOP_MACHETE'CHOP_MACHETE2 tool.count
                    
if tool.item == '@CHOP_AXE'CHOP_AXE2 tool.count
                    
if tool.item == '@CHOP_HAMMER'CHOP_HAMMER2 tool.count
                    
if tool.item == '@CHOP_TRIDENT'CHOP_TRIDENT2 tool.count
            
if  CHOP_MACHETE-CHOP_MACHETE2 or CHOP_AXE-CHOP_AXE2 or CHOP_HAMMER-CHOP_HAMMER2 or CHOP_TRIDENT-CHOP_TRIDENT2:
                print 
u'Инструмента после рубки  М-Т-К-Тр:'str(CHOP_MACHETE2)+'-'+str(CHOP_AXE2)+'-'+str(CHOP_HAMMER2)+'-'+str(CHOP_TRIDENT2)                
        else:
            
logger.info("Не осталось ресурсов для добычи")
            
raw_input('-------------   END   ---------------')
            
        if 
u'вскрытие сокровищ' in options:
            
resources self._get_game_location().get_all_objects_by_type("pirateCaptureObject")
            if 
resources:
                for 
resource in resources:
                    
enemy_here 0
                    
if enemies:
                        for 
enemy in enemies:
                            if(((
enemy.resource.x)**2+(enemy.resource.y)**2)**0.5 15):
                                
enemy_here 1
                                
break
                    if(
enemy_here == 1):
                        
self._get_game_location().remove_object_by_id(resource.id)
                        
logger.info("Сильвер мешает взять "+str(resource.id))
                        continue
                    
gain_event = {"type":"pirateCapture","objId":resource.id,"action":"capture"}
                    print 
gain_event
                    logger
.info("Открываем " str(resource.id))
                    
self._get_events_sender().send_game_events( [gain_event] )
                    
self._get_game_location().remove_object_by_id(resource.id)
            else:
                
logger.info("Нет неоткрытых сокровищ"
  Ответить с цитированием
Старый 03.02.2015, 17:14   #4041
 Разведчик
Аватар для manul78
 
manul78 никому не известный тип
Регистрация: 15.02.2011
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Поделитесь кодом, пожалуйста!
Нужно что бы бот заходил в вавилонскую башню и, если таймер истек, крафтил зомбакс.

UPD
Можно без проверки на наличие денег и зомбаксида

Последний раз редактировалось manul78; 04.02.2015 в 09:48.
  Ответить с цитированием
Старый 04.02.2015, 14:59   #4042
 Разведчик
Аватар для xawe
 
xawe никому не известный тип
Регистрация: 27.03.2011
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Всем привет, чет не могу понять как рубит.... запускаю (линукс убунту).... вот что пишет в ГУИ окне:
Цитата:
2015-02-04 16:57:07,022 user is not valid
2015-02-04 16:57:07,023 Загружаем остров...
2015-02-04 16:57:08,129 user is not valid
2015-02-04 16:57:08,130 Загружаем остров...
2015-02-04 16:57:09,163 user is not valid
2015-02-04 16:57:09,163 Загружаем остров...
2015-02-04 16:57:10,272 user is not valid
2015-02-04 16:57:10,273 Загружаем остров...
2015-02-04 16:57:11,342 user is not valid
2015-02-04 16:57:11,343 Загружаем остров...
2015-02-04 16:57:12,408 user is not valid
2015-02-04 16:57:12,408 Загружаем остров...
2015-02-04 16:57:13,513 user is not valid
2015-02-04 16:57:13,513 Загружаем остров...
2015-02-04 16:57:14,643 user is not valid
2015-02-04 16:57:14,643 Загружаем остров...
2015-02-04 16:57:15,731 user is not valid
2015-02-04 16:57:15,731 Загружаем остров...
2015-02-04 16:57:16,760 user is not valid
2015-02-04 16:57:16,761 Загружаем остров...
2015-02-04 16:57:18,064 user is not valid
2015-02-04 16:57:18,064 Загружаем остров...
2015-02-04 16:57:19,163 user is not valid
2015-02-04 16:57:19,163 Загружаем остров...
2015-02-04 16:57:20,320 user is not valid
2015-02-04 16:57:20,320 Загружаем остров...
2015-02-04 16:57:21,362 user is not valid
2015-02-04 16:57:21,362 Загружаем остров...
2015-02-04 16:57:22,463 user is not valid
2015-02-04 16:57:22,463 Загружаем остров...
2015-02-04 16:57:23,503 user is not valid
2015-02-04 16:57:23,503 Загружаем остров...
2015-02-04 16:57:25,028 user is not valid
2015-02-04 16:57:25,028 Загружаем остров...
2015-02-04 16:57:26,043 user is not valid
2015-02-04 16:57:26,043 Загружаем остров...
2015-02-04 16:57:27,142 user is not valid
2015-02-04 16:57:27,142 Загружаем остров...
2015-02-04 16:57:35,211 user is not valid
2015-02-04 16:57:35,211 Загружаем остров...
2015-02-04 16:57:36,216 user is not valid
2015-02-04 16:57:36,216 Загружаем остров...
2015-02-04 16:57:37,210 user is not valid
2015-02-04 16:57:37,211 Загружаем остров...
2015-02-04 16:57:45,318 user is not valid
2015-02-04 16:57:45,319 Загружаем остров...

в консоле тишина?

Цитата:
# ~/program/ZomBot$ ./run.sh

2013 (c) github.com/Vanuan/zombot
version 0.9.2 stable


You selected vk

клиент брал с ГитХаба и ВК архив от туда же
  Ответить с цитированием
Старый 04.02.2015, 15:39   #4043
Заблокирован
 Разведчик
Аватар для Cheater-84
 
Cheater-84 никому не известный тип
Регистрация: 22.03.2014
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 6 раз(а) в 5 сообщениях
Отправить сообщение для Cheater-84 с помощью Skype™
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Цитата:
Сообщение от xaweПосмотреть сообщение
Всем привет, чет не могу понять как рубит.... запускаю (линукс убунту).... вот что пишет в ГУИ окне:


в консоле тишина?



клиент брал с ГитХаба и ВК архив от туда же

кто-нибудь читает что пишут люди на форуме?

Цитата:
message_factory и read_swf взять отсюда — http://zhyk.ru/forum/showpost.php?p=...postcount=3690
И будет рабочий бот.

  Ответить с цитированием
Старый 04.02.2015, 22:45   #4044
 Разведчик
Аватар для har4a
 
har4a никому не известный тип
Регистрация: 10.05.2014
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Народ что нужно исправить что бы бот крутил фруктовые рулетки за фрукты а не за рецепты??
  Ответить с цитированием
Старый 05.02.2015, 02:52   #4045
Заблокирован
 Разведчик
Аватар для Cheater-84
 
Cheater-84 никому не известный тип
Регистрация: 22.03.2014
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 6 раз(а) в 5 сообщениях
Отправить сообщение для Cheater-84 с помощью Skype™
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Цитата:
Сообщение от har4aПосмотреть сообщение
Народ что нужно исправить что бы бот крутил фруктовые рулетки за фрукты а не за рецепты??

несколько страниц назад greyzza выкладывал рулетки, посмотри. http://zhyk.ru/forum/showpost.php?p=...postcount=3807
  Ответить с цитированием
Старый 05.02.2015, 13:19   #4046
 Разведчик
Аватар для Miha88
 
Miha88 никому не известный тип
Регистрация: 09.07.2011
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Всем привет! Я столкнулся с такой проблемой бот спотыкается о забаненых игроков, а к некоторым просто не может зайти и начинает перебирать ключи, как сделать что бы бот пропускал таких людей ?
  Ответить с цитированием
Старый 05.02.2015, 15:52   #4047
 Разведчик
Аватар для ruslanische
 
ruslanische никому не известный тип
Регистрация: 22.03.2012
Сообщений: 3
Популярность: 12
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Цитата:
Сообщение от Miha88Посмотреть сообщение
бот спотыкается о забаненых игроков

Код:
    @property
    def friends(self):
        if not self.__friends:
            self.__update_friend_list()
        return filter(lambda (friend): not friend['banned'], self.__friends)
где self.__friends - список игроков, которые возвращаются в евенте playersInfo

Добавлено через 17 часов 53 минуты
Я делаю так: получаю список друзей ВКонтакте, по id друзей получаю playerInfo соседей.

vkutils.py:
Код:
...
def getFriendsList(vk_api):
    return vk_api.friends.getAppUsers()

def getUsersInfo(vk_api, users_ids):
    info = vk_api.getProfiles(
        uids=users_ids,
        fields='uid, first_name, last_name,'
               'nickname, screen_name, sex,'
               'bdate, city, country, timezone,'
               'photo, photo_medium, photo_big,'
               'has_mobile, rate, contacts,'
               'education, online, counters'
    )
    return info
...
в game_engine.py храню друзей из контакта:
Код:
     ...
     self.__vk_api = vkontakte.API(token=self.__zfSession.api_access_token)
     ...

    @property
    def vk_friends_ids(self):
        assert self.__vk_api is not None
        ids = vkutils.getFriendsList(self.__vk_api)
        return ids

    @property
    def vk_friends_info(self):
        assert self.__vk_api is not None
        vk_friends_ids = self.vk_friends_ids
        vk_friends_info = vkutils.getUsersInfo(
            self.__vk_api, u''.join(u',%s' % unicode(friend_id) for friend_id in vk_friends_ids)
        )
        friends_info = {}
        for friend_info in vk_friends_info:
            # вконтакте возвращает id пользователя числом, а не строкой
            # т.к. нам нужна строка, то конвертируем
            friend_id = unicode(friend_info[u'uid'])
            friend_info[u'uid'] = friend_id

            friends_info[friend_id] = friend_info
        return friends_info
в game_state.py собираю информацию о соседях:
Код:
    ...
    self.__friends = []
    self.__vk_friends = {}
    ...

    @property
    def friends(self):
        if not self.__friends:
            self.__update_friend_list()
        return filter(lambda (friend): not friend['banned'], self.__friends)

    @property
    def friends_ids(self):
        return self.__vk_friends.keys()

    def get_friend_by_id(self, friend_id):
        assert isinstance(friend_id, unicode)
        matched_friends = filter(lambda (friend): friend[u'id'] == friend_id, self.friends)
        if not matched_friends:
            logger.warning(u"Внимание, соседа с id=%s нет среди друзей", friend_id)
            return None
        assert len(matched_friends) == 1
        return matched_friends[0]

    def update_friend_info(self, friend):
        assert isinstance(friend, dict)
        self.update_friends_info([friend])

    def update_friends_info(self, friends):
        assert isinstance(friends, list)
        friends_ids = [friend['id'] for friend in friends]
        if not self.gameEngine.emulating:
            event = {u'players': friends_ids, u'type': u'players', u'action': u'getInfo'}
            self.gameEngine.send_event(event, need_id=True, wait_event='playersInfo')

    def __update_friend_list(self):
        # обновляем информацию о всех друзьях из вконтакта
        self.__vk_friends = self.gameEngine.vk_friends_info
        assert isinstance(self.__vk_friends, dict)
        # обновляем информацию о всех друзьях из игры
        event = {
            'players': self.__vk_friends.keys(),
            'type': 'players',
            'action': 'getInfo'
        }
        self.gameEngine.send_event(event, need_id=True, wait_event='playersInfo')
Когда приходит от сервера playersInfo, то обновляю и сохраняю инфу о соседях:
Код:
    def __handle_players_info(self, event):
        updated_players = event['players']
        # обновляем игровых друзей
        for friend in self.__friends:
            matched_players = filter(lambda (player): friend[u'id'] == player[u'id'], updated_players)
            if not matched_players:
                updated_players.append(friend)
        self.__friends = updated_players
        # обновляем имена соседей (имена берем из вконтакта)
        for friend in self.friends:
            vk_friend_info = self.__vk_friends[friend['id']]
            friend['real_name'] = vk_friend_info['first_name'] + u' ' + vk_friend_info['last_name']

Последний раз редактировалось ruslanische; 06.02.2015 в 09:46. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 06.02.2015, 14:01   #4048
 Разведчик
Аватар для mike4kz
 
mike4kz никому не известный тип
Регистрация: 23.08.2013
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Цитата:
Сообщение от xaweПосмотреть сообщение
Всем привет, чет не могу понять как рубит.... запускаю (линукс убунту).... вот что пишет в ГУИ окне:

в консоле тишина?

Буквально два сообщения выше был ответ с решением вашей проблемы. Или читать ответы другим участникам вам вера не позволяет?
  Ответить с цитированием
Старый 06.02.2015, 14:21   #4049
 Пехотинец
Аватар для vintets
 
vintets скоро будет известенvintets скоро будет известенvintets скоро будет известен
Регистрация: 01.08.2012
Сообщений: 95
Популярность: 255
Сказал(а) спасибо: 28
Поблагодарили 54 раз(а) в 38 сообщениях
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Цитата:
Сообщение от ruslanischeПосмотреть сообщение
Я делаю так: получаю список друзей ВКонтакте, по id друзей получаю playerInfo соседей.

в game_engine.py храню друзей из контакта:

в game_state.py собираю информацию о соседях:

Когда приходит от сервера playersInfo, то обновляю и сохраняю инфу о соседях:
Код:
 
        # обновляем имена соседей (имена берем из вконтакта)
        for friend in self.friends:
            vk_friend_info = self.__vk_friends[friend['id']]
            friend['real_name'] = vk_friend_info['first_name'] + u' ' + vk_friend_info['last_name']

А зачем такие сложности? Зачем получать всех друзей ВК?
И имена зачем брать из этого списка? В игровой инфе есть имена. Игровые правда.

Разве что для составления отчёта о всех друзьях. Я так делаю, но включаю только по необходимости.
  Ответить с цитированием
Старый 06.02.2015, 14:24   #4050
 Разведчик
Аватар для ruslanische
 
ruslanische никому не известный тип
Регистрация: 22.03.2012
Сообщений: 3
Популярность: 12
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]

Хочу поделиться интересным решением. Наверняка некоторые парятся насчет проездных билетов для островов и что бот эти билеты как семечки хавает (если билет на число поездок).
Решение такое: надо создать список локаций куда ходить и при каждом посещении локации определять, когда на нее следует зайти в следующий раз.
Код:
Код:
...
    def free_games_for_building(self, building):
        building_item = self.stateProcessor.get_item_by_id(building[u'item'])
        free_games = []
        for game in building_item.get(u'games', []):
            if building[u'level'] >= game[u'level'] and u'playCost' not in game:
                free_games.append(game)
        return free_games
...

# coding=utf-8
import logging
import collections

from modules.base_module import BaseModule


logger = logging.getLogger(__name__)


class ChangeLocationBot(BaseModule):
    def __init__(self, *args):
        super(ChangeLocationBot, self).__init__(*args)
        self.__locations_info = {}
        self.__locations_to_visit = collections.deque()

    def handle_events(self):
        for event in self.gameEngine.events:
            if event[u'type'] == u'gameState':
                self.gameEngine.remove_event(event)
                self.__handle_game_state(event)

    def perform_action(self):
        self.select_locations()
        if not self.__locations_to_visit:
            return

        ########################################################
        # собираем статистику по локации
        worker_types = [u'stoneGrave', u'stoneGraveDouble', u'woodGrave', u'woodGraveDouble']
        resource_types = [u'woodTree', u'stone']
        cooker_types = [u'cookGrave', u'cookGraveWithBrains']
        digger_types = [u'diggerGrave', u'diggerGraveWithBrains']
        # собираем информацию по всем бесплатным рулеткам (когда можно будет крутить)
        next_play_times = []
        for building in self.buildings:
            games = self.free_games_for_building(building)
            next_play_times.extend([building['nextPlayTimes'][game['id']] for game in games])
        # собираем информацию по всем грядкам и деревьям (когда можно будет собирать)
        next_harvest_times = []
        plants = self.stateProcessor.get_game_objects_by_type(u'plant') + self.stateProcessor.get_game_objects_by_type(
            u'fruitTree')
        next_harvest_times = [plant[u'jobFinishTime'] for plant in plants]

        info = {
            'have_resource_gainers': self.stateProcessor.get_game_objects_by_types(worker_types) != [],
            'have_resources': self.stateProcessor.get_game_objects_by_types(resource_types) != [],
            'have_cookers': self.stateProcessor.get_game_objects_by_types(cooker_types) != [],
            'have_recipes_to_cook': self.settings.selected_recipes.keys() + self.settings.selected_recipes_ids.keys() != [],
            'have_diggers': self.stateProcessor.get_game_objects_by_types(digger_types) != [],
            'have_roulettes': len(next_play_times) > 0,
            'first_roulette_ready_after': min(next_play_times) if next_play_times else None,
            'have_plants': len(next_harvest_times) > 0,
            'first_plant_ready_after': min(next_harvest_times) if next_harvest_times else None,
        }
        self.__locations_info[self.gameState.location_id] = info
        ########################################################

        next_location = None
        for location in self.__locations_to_visit:
            cur_location = self.stateProcessor.get_item_by_id(self.gameState.location_id)
            if location['name'] == cur_location['name']:
                continue
            need_to_travel = False
            info = self.__locations_info.get(location['id'], None)
            if info:
                if info['have_resource_gainers'] and info['have_resources']:
                    need_to_travel = True
                if info['have_cookers'] and info['have_recipes_to_cook']:
                    need_to_travel = True
                if info['have_diggers']:
                    need_to_travel = True
                if info['have_roulettes'] and self.gameTimer.has_elapsed(info['first_roulette_ready_after']):
                    need_to_travel = True
                if info['have_plants'] and self.gameTimer.has_elapsed(info['first_plant_ready_after']):
                    need_to_travel = True
            if info is None or need_to_travel:
                next_location = location

        if next_location:
            self.__travel_to(next_location)

    def __travel_to(self, location):
        logger.debug(u'Переходим на ' + location[u'name'])
        change_location_event = {
            u'user': None,
            u'locationId': location['id'],
            u'type': u"gameState",
            u'action': u"gameState",
            u'objId': None
        }
        self.send_event(change_location_event, wait_event=u'gameState', need_id=True)

    def select_locations(self):
        travel_to_free_locations = self.settings.travel_to_free_locations
        travel_to_paid_locations = self.settings.travel_to_paid_locations
        all_locations_ids = [loc[u'locationId'] for loc in self.game_state[u'params'][u'event'][u'locationInfos']]
        all_locations_ids.append(self.gameState.location_id)
        all_locations = [self.stateProcessor.get_item_by_id(item_id) for item_id in all_locations_ids]

        paid_locations = [loc for loc in all_locations if loc[u'paid'] is True]
        free_locations = [loc for loc in all_locations if loc[u'paid'] is False]

        if not self.settings.travel_to_caves:
            paid_locations = [loc for loc in paid_locations if loc[u'id'][0:3] != u'un_']
            free_locations = [loc for loc in free_locations if loc[u'id'][0:3] != u'un_']

        self.__locations_to_visit = []
        if travel_to_free_locations:
            self.__locations_to_visit.extend(free_locations)

        if travel_to_paid_locations:
            self.__locations_to_visit.extend(paid_locations)

    def __handle_game_state(self, event):
        location = self.stateProcessor.get_item_by_id(event['locationId'])
        logger.info(u'Перешли на ' + location[u'name'])
        self.game_state['params']['event'] = event
Пока что работает...

Добавлено через 4 минуты
Цитата:
Сообщение от vintetsПосмотреть сообщение
А зачем такие сложности? Зачем получать всех друзей ВК?
И имена зачем брать из этого списка? В игровой инфе есть имена. Игровые правда.

Разве что для составления отчёта о всех друзьях. Я так делаю, но включаю только по необходимости.

Какие сложности?
А откуда брать друзей, если не из ВК? Сначала ведь получаем именно из ВК друзей GetAppUsers или как-то так, потом уже игровых получаем по id.
Имена из списка друзей ВК беру для того, чтобы лучше в выглядело: "Получен подарок от 'Иван Иванов' (ник: 'хотелку!!!')", а не Получен подарок id 123456789. Мне так удобнее смотреть кто меня закапывает постоянно, кто постоянно откапывается, ну и т.п.

Последний раз редактировалось ruslanische; 06.02.2015 в 14:28. Причина: Добавлено сообщение
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Программа] Zombot (Клиент для игры Зомби ферма) AnonProger Баги игр ВКонтакте 189 26.08.2014 15:50
[Статья] Небольшие секреты игры зомби ферма haussuper Баги игр ВКонтакте 11 26.01.2013 10:54
[Информация] Зомби Ферма dekirillov Баги игр ВКонтакте 40 22.10.2011 18:25

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 11:26.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net