![](/zhyk/misc/sp.gif) |
Zombot (Клиент для игры Зомби ферма) [Обсуждение] - Свободное обсуждение - Ваши идеи, вопросы и ответы на тему браузерных игр и социальных сетей |
02.02.2015, 15:09
|
#4036
|
|
|
|
Пехотинец
|
![](/zhyk/misc/regist.png) Регистрация: 01.08.2012
![](/zhyk/misc/messages.png) Сообщений: 95
![](/zhyk/misc/reput.png) Популярность: 255
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 28
Поблагодарили 54 раз(а) в 38 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
![](/zhyk/misc/quotes/quot-top-left.gif) |
Цитата: |
![](/zhyk/misc/quotes/quot-top-right.gif) |
|
|
|
|
|
Ну видно же что учёт неправильный. Выиграл 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
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 24.08.2011
![](/zhyk/misc/messages.png) Сообщений: 17
![](/zhyk/misc/reput.png) Популярность: 10
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 9
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Привет всем! полгода не мониторил "рынок"... ой как много понаписано! можете ткнуть в скачку последней версии бота (лучше страницей этой темы), оттуда начну штудировать)))
хотя не откажусь и от немного доведённого до ума бота)))
всем откликнувшимся, спасибо заранее...
|
|
|
03.02.2015, 02:54
|
#4038
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 29.07.2014
![](/zhyk/misc/messages.png) Сообщений: 0
![](/zhyk/misc/reput.png) Популярность: 10
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 0
Поблагодарили 8 раз(а) в 5 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
![](/zhyk/misc/quotes/quot-top-left.gif) |
Цитата: |
![](/zhyk/misc/quotes/quot-top-right.gif) |
|
|
|
|
|
|
|
|
user is not valid
|
|
![](/zhyk/misc/quotes/quot-bot-left.gif) |
|
![](/zhyk/misc/quotes/quot-bot-right.gif) |
|
message_factory и read_swf взять отсюда — http://zhyk.ru/forum/showpost.php?p=...postcount=3690
И будет рабочий бот.
![](/zhyk/misc/quotes/quot-top-left.gif) |
Цитата: |
![](/zhyk/misc/quotes/quot-top-right.gif) |
|
|
|
|
|
|
|
|
Скорее всего ты правки не все сделал.
|
|
![](/zhyk/misc/quotes/quot-bot-left.gif) |
|
![](/zhyk/misc/quotes/quot-bot-right.gif) |
|
Там только одна правка, от меня... логичнее было бы попросить работающий на равнине чоппер у уважаемого greyzza,
Но я таки не понимаю -- где я по сути неправ? Оно таки не ссылки вставило в локальную переменную instruments, а копии? Потом по нему for tool in instruments: , tool тоже ссылкой должен быть вроде тогда, и потом
tool.count -= tool_needed . То оно должно вычитаться именно со склада...
И почему было сделано именно копии, через dict2obj , мне тоже непонятно...
Последний раз редактировалось megabyte0; 03.02.2015 в 10:15.
|
|
|
03.02.2015, 03:22
|
#4039
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 18.01.2015
![](/zhyk/misc/messages.png) Сообщений: 0
![](/zhyk/misc/reput.png) Популярность: 10
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
![](/zhyk/misc/quotes/quot-top-left.gif) |
Цитата: |
![](/zhyk/misc/quotes/quot-top-right.gif) |
|
|
|
|
|
Воспользовалась вашим советом. Действительно, пошло дальше. Теперь вылетело с вот такой ошибкой:
![](/zhyk/misc/quotes/quot-top-left.gif) |
Цитата: |
![](/zhyk/misc/quotes/quot-top-right.gif) |
|
|
|
|
|
|
|
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' |
|
![](/zhyk/misc/quotes/quot-bot-left.gif) |
|
![](/zhyk/misc/quotes/quot-bot-right.gif) |
|
|
|
|
03.02.2015, 10:28
|
#4040
|
|
|
|
Пехотинец
|
![](/zhyk/misc/regist.png) Регистрация: 01.08.2012
![](/zhyk/misc/messages.png) Сообщений: 95
![](/zhyk/misc/reput.png) Популярность: 255
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 28
Поблагодарили 54 раз(а) в 38 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
![](/zhyk/misc/quotes/quot-top-left.gif) |
Цитата: |
![](/zhyk/misc/quotes/quot-top-right.gif) |
|
|
|
|
|
|
|
|
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 , мне тоже непонятно...
|
|
![](/zhyk/misc/quotes/quot-bot-left.gif) |
|
![](/zhyk/misc/quotes/quot-bot-right.gif) |
|
Я на ссылки не переделывал, делал учёт так как было написано раньше.
И равнина и Сказочный лес всё нормально рубилось.
PHP код:
# coding=utf-8
import logging
import sys
import time
import os.path
import os
from game_state.game_types import GameWoodGrave, GameWoodGraveDouble,\
GamePickItem, GameWoodTree, GameStone, GameGainItem, GamePickup
from game_state.game_event import dict2obj, obj2dict
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.x for resource in resources}
resources_order = resources_dict.items()
if not hasattr(self._get_game_state(), 'many_chop'): # рублено не много, будем сортировать
resources_order.sort(key=lambda x: x[::-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.x - resource.x)**2+(enemy.y - 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.item, tool_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.x - resource.x)**2+(enemy.y - 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
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 15.02.2011
![](/zhyk/misc/messages.png) Сообщений: 0
![](/zhyk/misc/reput.png) Популярность: 10
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Поделитесь кодом, пожалуйста!
Нужно что бы бот заходил в вавилонскую башню и, если таймер истек, крафтил зомбакс.
UPD
Можно без проверки на наличие денег и зомбаксида
Последний раз редактировалось manul78; 04.02.2015 в 09:48.
|
|
|
04.02.2015, 14:59
|
#4042
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 27.03.2011
![](/zhyk/misc/messages.png) Сообщений: 0
![](/zhyk/misc/reput.png) Популярность: 10
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Всем привет, чет не могу понять как рубит.... запускаю (линукс убунту).... вот что пишет в ГУИ окне:
![](/zhyk/misc/quotes/quot-top-left.gif) |
Цитата: |
![](/zhyk/misc/quotes/quot-top-right.gif) |
|
|
|
|
|
|
|
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 Загружаем остров... |
|
![](/zhyk/misc/quotes/quot-bot-left.gif) |
|
![](/zhyk/misc/quotes/quot-bot-right.gif) |
|
в консоле тишина?
![](/zhyk/misc/quotes/quot-top-left.gif) |
Цитата: |
![](/zhyk/misc/quotes/quot-top-right.gif) |
|
|
|
|
|
|
|
# ~/program/ZomBot$ ./run.sh
2013 (c) github.com/Vanuan/zombot
version 0.9.2 stable
You selected vk |
|
![](/zhyk/misc/quotes/quot-bot-left.gif) |
|
![](/zhyk/misc/quotes/quot-bot-right.gif) |
|
клиент брал с ГитХаба и ВК архив от туда же
|
|
|
04.02.2015, 15:39
|
#4043
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 22.03.2014
![](/zhyk/misc/messages.png) Сообщений: 0
![](/zhyk/misc/reput.png) Популярность: 10
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 0
Поблагодарили 6 раз(а) в 5 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
04.02.2015, 22:45
|
#4044
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 10.05.2014
![](/zhyk/misc/messages.png) Сообщений: 0
![](/zhyk/misc/reput.png) Популярность: 10
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Народ что нужно исправить что бы бот крутил фруктовые рулетки за фрукты а не за рецепты??
|
|
|
05.02.2015, 02:52
|
#4045
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 22.03.2014
![](/zhyk/misc/messages.png) Сообщений: 0
![](/zhyk/misc/reput.png) Популярность: 10
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 0
Поблагодарили 6 раз(а) в 5 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
05.02.2015, 13:19
|
#4046
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 09.07.2011
![](/zhyk/misc/messages.png) Сообщений: 0
![](/zhyk/misc/reput.png) Популярность: 10
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Всем привет! Я столкнулся с такой проблемой бот спотыкается о забаненых игроков, а к некоторым просто не может зайти и начинает перебирать ключи, как сделать что бы бот пропускал таких людей ?
|
|
|
05.02.2015, 15:52
|
#4047
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 22.03.2012
![](/zhyk/misc/messages.png) Сообщений: 3
![](/zhyk/misc/reput.png) Популярность: 12
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
![](/zhyk/misc/quotes/quot-top-left.gif) |
Цитата: |
![](/zhyk/misc/quotes/quot-top-right.gif) |
|
|
|
|
|
|
|
|
бот спотыкается о забаненых игроков
|
|
![](/zhyk/misc/quotes/quot-bot-left.gif) |
|
![](/zhyk/misc/quotes/quot-bot-right.gif) |
|
Код:
@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
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 23.08.2013
![](/zhyk/misc/messages.png) Сообщений: 1
![](/zhyk/misc/reput.png) Популярность: 10
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 0
Поблагодарили 2 раз(а) в 2 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
06.02.2015, 14:21
|
#4049
|
|
|
|
Пехотинец
|
![](/zhyk/misc/regist.png) Регистрация: 01.08.2012
![](/zhyk/misc/messages.png) Сообщений: 95
![](/zhyk/misc/reput.png) Популярность: 255
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 28
Поблагодарили 54 раз(а) в 38 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
А зачем такие сложности? Зачем получать всех друзей ВК?
И имена зачем брать из этого списка? В игровой инфе есть имена. Игровые правда.
Разве что для составления отчёта о всех друзьях. Я так делаю, но включаю только по необходимости.
|
|
|
06.02.2015, 14:24
|
#4050
|
|
|
|
Разведчик
|
![](/zhyk/misc/regist.png) Регистрация: 22.03.2012
![](/zhyk/misc/messages.png) Сообщений: 3
![](/zhyk/misc/reput.png) Популярность: 12
![](/zhyk/misc/thnx.png) Сказал(а) спасибо: 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 минуты
![](/zhyk/misc/quotes/quot-top-left.gif) |
Цитата: |
![](/zhyk/misc/quotes/quot-top-right.gif) |
|
|
|
|
|
|
|
|
А зачем такие сложности? Зачем получать всех друзей ВК?
И имена зачем брать из этого списка? В игровой инфе есть имена. Игровые правда.
Разве что для составления отчёта о всех друзьях. Я так делаю, но включаю только по необходимости.
|
|
![](/zhyk/misc/quotes/quot-bot-left.gif) |
|
![](/zhyk/misc/quotes/quot-bot-right.gif) |
|
Какие сложности?
А откуда брать друзей, если не из ВК? Сначала ведь получаем именно из ВК друзей GetAppUsers или как-то так, потом уже игровых получаем по id.
Имена из списка друзей ВК беру для того, чтобы лучше в выглядело: "Получен подарок от 'Иван Иванов' (ник: 'хотелку!!!')", а не Получен подарок id 123456789. Мне так удобнее смотреть кто меня закапывает постоянно, кто постоянно откапывается, ну и т.п.
Последний раз редактировалось ruslanische; 06.02.2015 в 14:28.
Причина: Добавлено сообщение
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 11:26.
|
![](/zhyk/misc/sp.gif) |