|
Zombot (Клиент для игры Зомби ферма) [Обсуждение] - Свободное обсуждение - Ваши идеи, вопросы и ответы на тему браузерных игр и социальных сетей |
18.08.2016, 15:47
|
#5086
|
|
|
|
Разведчик
|
Регистрация: 25.02.2013
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
18.08.2016, 16:36
|
#5087
|
|
|
|
Разведчик
|
Регистрация: 13.03.2013
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
18.08.2016, 16:41
|
#5088
|
|
|
|
Разведчик
|
Регистрация: 27.04.2014
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
21.08.2016, 03:16
|
#5089
|
|
|
|
Разведчик
|
Регистрация: 19.10.2014
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Почему-то перестал крафтить в Летучем корабле, в остальных постройках вроде нормально. Не могу понять почему. Никто не сталкивался?
Модуль:
Код:
# coding=utf-8
import logging
import math
from game_actors_and_handlers.base import BaseActor
from game_state.game_event import dict2obj, obj2dict
from ctypes import windll
import sys
stdout_handle = windll.kernel32.GetStdHandle(-11)
SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute
logger = logging.getLogger(__name__)
class GameCraft(BaseActor):
def perform_action(self):
crafts = {
"B_SHIP":{1:40000},
u'Летучий корабль':{2:10000},
u'Летучий корабль':{3:10000},
u'Глаз-алмаз':{1:20000},
u'Склеп':{1:200},
u'Бизнес-Центр':{3:1990000000},
u'Останкино за монеты':{1:44},
## u'Сфинкс':{1:500},
## u'АЭС':{1:[5000,100],2:10000},
## 'B_MILL_EMERALD2':{
## 1:[900,900],
## 2:[900,900],
## 3:[900,900],
## 4:[900,900],
## 5:[900,900],
}
if not crafts: return
self.coll = obj2dict(self._get_game_state().get_state().collectionItems)
for building in self._get_game_location().get_all_objects_by_type('building'):
reader_buil = self._get_item_reader().get(building.item)
if not reader_buil.crafts: continue
if reader_buil.name in crafts: craft_buil = crafts[reader_buil.name]
elif reader_buil.id in crafts: craft_buil = crafts[reader_buil.id]
else: continue
for itemId in craft_buil:
if type(craft_buil[itemId]) == list:
min_material0_count = craft_buil[itemId][0]
min_material1_count = craft_buil[itemId][1]
max_result_count = None
else:
min_material0_count = 0
min_material1_count = 0
max_result_count = craft_buil[itemId]
for craft in reader_buil.crafts:
if craft.level > building.level: continue
if reader_buil.crafts[itemId-1] != craft: continue
craft_0 = (self.count_item(craft.materials[0].item) - min_material0_count)/craft.materials[0].count
craft_1 = (self.count_item(craft.materials[1].item) - min_material1_count)/craft.materials[1].count
if not max_result_count:
max_result_count = (min(craft_0,craft_1))*craft.resultCount
result_count = int(math.ceil(1.0*max_result_count/craft.resultCount))
else: result_count = int(math.ceil(1.0*(max_result_count - self.count_item(craft.result))/craft.resultCount))
craft_count = min([craft_0,craft_1,result_count])
events = []
for i in range(craft_count):
event = {"type":"item","action":"craft",
"objId":building.id,"itemId":str(itemId)}
events.append(event)
self.rem(craft.materials[0].item, craft.materials[0].count)
self.rem(craft.materials[1].item, craft.materials[1].count)
self.add(craft.result, craft.resultCount)
if len(events) == 500:
if craft_count > 5000:
print u'\rСоздаю "%s": %d/%d' %(
self._get_item_reader().get(craft.result).name,
(i+1)*craft.resultCount,
craft_count*craft.resultCount),
self._get_events_sender().send_game_events(events)
events = []
if events:
if craft_count > 5000:
print u'\rСоздаю "%s": %d/%d' %(
self._get_item_reader().get(craft.result).name,
craft_count*craft.resultCount,
craft_count*craft.resultCount),
self._get_events_sender().send_game_events(events)
if craft_count > 0:
if craft_count > 5000:
print ''
SetConsoleTextAttribute(stdout_handle, 0x0006 | 0x0008)
print u'СОЗДАЛ %d "%s" В ПОСТРОЙКЕ "%s"' %(craft_count,
self._get_item_reader().get(craft.result).name,
reader_buil.name)
SetConsoleTextAttribute(stdout_handle, 0x0002 | 0x0008)
sys.stdout.flush()
self._get_game_state().get_state().collectionItems=dict2obj(self.coll)
def rem(self,item, count):
typ = self._get_item_reader().get(item).type
if typ == 'collectionItem':
self.coll[item[1:]] -= count
elif item == "@COINS":
self._get_game_state().get_state().gameMoney -= count
else: self._get_game_state().remove_from_storage(item, count)
def add(self,item, count):
typ = self._get_item_reader().get(item).type
if typ == 'collectionItem':
if item[1:] in self.coll: self.coll[item[1:]] += count
else: self.coll[item[1:]] = count
elif typ == 'brains':
self._get_game_state().get_state().buyedBrains.append(
dict2obj({u'count': 1L, u'endTime': u'86400000'}))
elif item == "@COINS":
self._get_game_state().get_state().gameMoney += count
else: self._get_game_state().add_from_storage(item, count)
def count_item(self,item):
typ = self._get_item_reader().get(item).type
if typ == 'collectionItem':
if item[1:] in self.coll: return self.coll[item[1:]]
return 0
elif typ == 'brains':
count = 0
for brain in self._get_game_state().get_state().buyedBrains:
if int(brain.endTime) < 180000: continue
count += int(brain.count)
return count
elif item == "@COINS":
return self._get_game_state().get_state().gameMoney
return self._get_game_state().count_in_storage(item)
|
|
|
21.08.2016, 09:42
|
#5090
|
|
|
|
Разведчик
|
Регистрация: 25.02.2013
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
Цитата: |
|
|
|
|
|
|
|
|
Почему-то перестал крафтить в Летучем корабле, в остальных постройках вроде нормально. Не могу понять почему. Никто не сталкивался? |
|
|
|
|
|
давайте попробуем разобрать:
обходим обьекты
for building in self._get_game_location().get_all_objects_by_type( 'building'):проверка:
if reader_buil.name in crafts: craft_buil = crafts[reader_buil.name] elif reader_buil.id in crafts: craft_buil = crafts[reader_buil.id] else: continue например произошло совпадение по name 'летучий корабль' в вашем словаре ключей 'летучий корабль' два какой из них будет активен? вероятно последний)(на самом деле нет, ну для примера пусть будет последний) таким образом у вас проверится крафт с ид "3" и проверим количество например на складе у вас больше или равно указанному количеству т.е.=10000, соответственно пропускаем а другие крафты естественно будут игнорироваться так как у вас совпадение по имени if reader_buil.name in crafts уже есть то же самое произойдет если первым будет совпадение по "B_SHIP", при такой реализации крафтов будет работать только один какой-то крафт, вам нужно подумать и либо делать модуль для крафтов в корабле отдельно либо полностью переделать данный модуль ну или как вариант если крафты в
'B_MILL_EMERALD2' работают корректно то сделать по аналогии "B_SHIP"
т.е.
"B_SHIP":{1:40000,2:10000,3:10000}
Последний раз редактировалось greyzza; 21.08.2016 в 11:44.
|
|
|
21.08.2016, 11:52
|
#5091
|
|
|
|
Разведчик
|
Регистрация: 19.10.2014
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
21.08.2016, 12:30
|
#5092
|
|
|
|
Разведчик
|
Регистрация: 25.02.2013
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
Последний раз редактировалось greyzza; 21.08.2016 в 12:34.
|
|
|
21.08.2016, 17:17
|
#5093
|
|
|
|
Разведчик
|
Регистрация: 19.10.2014
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
23.08.2016, 11:57
|
#5094
|
|
|
|
Разведчик
|
Регистрация: 18.02.2013
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
как заставить бот бить палочками по определенному предмету??
|
|
|
23.08.2016, 13:16
|
#5095
|
|
|
|
Разведчик
|
Регистрация: 25.02.2013
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
Цитата: |
|
|
|
|
|
|
|
|
как заставить бот бить палочками по определенному предмету?? |
|
|
|
|
|
что то типа такого
PHP код:
class MagicWandBuilding(BaseActor): def perform_action(self): eventWand=[] magicUsed=int(self._get_game_state().get_state().magic.used) countWand=self._get_game_state().countStorage('@MAGIC_WAND') if magicUsed >= 500 :return if countWand<=0:return needItemObject=[u'@D_SAKURA_SWING_A'] needObjects = self._get_game_location().get_all_objects_by_items(needItemObject) if not needObjects:return needObject=needObjects[0] readerItem = self._get_item_reader().get(needObject.item) countUsed=500-magicUsed countChop=0 for _ in range(countUsed): if countWand <=0:break if magicUsed>=500:break eventWand.append({"action":"magic","type":"item","objId":needObject.id}) countWand-=1 magicUsed+=1 countChop+=1 self._get_game_state().get_state().magic.used += 1 self._get_game_state().removeStorage('@MAGIC_WAND',1) if not eventWand:return print u' Рубанул палочками по "%s" %d'%(readerItem.name,countChop) self._get_events_sender().send_game_events(eventWand)
p.s. это просто пример, у меня работает, у вас могут возникнуть проблемы здесь:needObjects = self._get_game_location().get_all_objects_by_items (needItemObject) исправляется добавлением в gameEngine.py в класс GameLocation вот это):
PHP код:
def get_all_objects_by_items(self, object_items): objects=[obj for obj in self.get_game_objects() if obj.item in object_items] return objects
быть может еще где могут быть проблемы,т.к. все-таки нет единой версии бота
|
|
|
24.08.2016, 03:58
|
#5096
|
|
|
|
Разведчик
|
Регистрация: 19.10.2014
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
Цитата: |
|
|
|
|
|
|
|
|
т.к. все-таки нет единой версии бота |
|
|
|
|
|
У меня так реализовано:
Код:
# coding=utf-8
import logging
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
from ctypes import windll
import sys
stdout_handle = windll.kernel32.GetStdHandle(-11)
SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute
logger = logging.getLogger(__name__)
class MagicWand(BaseActor):
def perform_action(self):
if self._get_game_state().get_state().magic.used < 500 :
magic_count = 500-self._get_game_state().get_state().magic.used
storage_wand = self._get_game_state().count_in_storage('@MAGIC_WAND')
count_wand = magic_count
eventwand = []
if magic_count>storage_wand:
count_wand = storage_wand
SetConsoleTextAttribute(stdout_handle, 0x0006 | 0x0008)
print u' НАДО ПОТРАТИТЬ %d ВОЛШЕБНЫХ ПАЛОЧЕК '%count_wand
SetConsoleTextAttribute(stdout_handle, 0x0002 | 0x0008)
sys.stdout.flush()
location_id = "main" # на каком острове
buildfromwand = "@D_MONEYBOX_CAT"#"@D_SAKURA_SWING_A" # под какой постройкой
#buildfromwand="@B_CATAPULT"
if location_id == self._get_game_state().get_location_id():
build_id = None
for item in self._get_game_state().get_state().gameObjects:
if item.item == buildfromwand:
build_id = item.id
if not build_id: return
for _ in range(count_wand):
if self._get_game_state().get_state().magic.used != 500:
if self._get_game_state().count_in_storage('@MAGIC_WAND') > 0:
eventwand.append({"action":"magic","type":"item","objId":build_id})
self._get_game_state().get_state().magic.used += 1
self._get_game_state().remove_from_storage('@MAGIC_WAND',1)
self._get_events_sender().send_game_events(eventwand)
logger.info(u'ИСТРАТИЛ %d ПАЛОЧЕК '%count_wand)
Улей:
Код:
#### Стучим в Улей####
if object.item == '@B_HIVE':
remoteTrick = self._get_game_state().get_state().remoteTrickTreating
if len(remoteTrick)>0:
for cot in remoteTrick:
if frend_users == cot.user :
baranka = 1
break
if baranka == 0:
if self._get_game_state().countCircus < 100 and self._get_game_state().tentCircus == True :
self._get_events_sender().send_game_events([{"objId":object.id,"type":"item","itemId":"HONEY_PACK_DEFAULT","action":"remoteTrickTreating"}])#"HONEY_PACK_SMALL" "HONEY_PACK_MEDIUM"
self.cprint(u'5 Стучим в Улей!!!')
self._get_game_state().countCircus+=1
self._get_game_state().tentCircus = False
|
|
|
24.08.2016, 08:01
|
#5097
|
|
|
|
Разведчик
|
Регистрация: 25.02.2013
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
вы до сих пор вписываете каждую туковую которая вводится в игру??!! тогда мы идем к вам))
|
|
|
24.08.2016, 14:04
|
#5098
|
|
|
|
Разведчик
|
Регистрация: 19.10.2014
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
|
|
24.08.2016, 18:43
|
#5099
|
|
|
|
Разведчик
|
Регистрация: 25.02.2013
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
Цитата: |
|
|
|
|
|
|
|
|
Рад буду посмотреть другие решения) |
|
|
|
|
|
PHP код:
def halloweenTower(self,obj,user): remoteTrick=self._get_game_state().get_state().remoteTrickTreating dayLimit=int(self._get_item_reader().get('bells').dayLimit) reader_Tower=self._get_item_reader().get(obj.item) transformationDate=hasattr(reader_Tower,'transformationDate') if transformationDate and int(reader_Tower.transformationDate)/1000<time.time():return if [rem.user for rem in remoteTrick if rem.user == user]: # тукаем за ЗБ избранным друзьям if not str(user) in self.vip_friends():return itemId=self.bell_id(reader_Tower.material,False) if self.cashBuy:return# self.cashBuy=True# это сделано чтобы стучать только в одну туковку если туковок на острове много else: itemId=self.bell_id(reader_Tower.material,True) if len(remoteTrick)>=dayLimit:return if not itemId:return event_rem={"objId":obj.id,"type":"item","itemId":itemId,"action":"remoteTrickTreating"} trick_user=dict2obj({u'count': 0L, u'date': u'-3131420', u'user': str(user), u'item':reader_Tower.material}) self._get_game_state().get_state().remoteTrickTreating.append(trick_user) self._get_events_sender().send_game_events([event_rem]) self.cprint(u'5 Стукнул в %s'%(reader_Tower.name))
def bell_id(self,material,default): # если default True--> возвращает ид бесплатного тука, иначе ид тука за максимальное кол-во ЗБ bells=self._get_item_reader().get('bells').items cash_pack={} for bell in bells: bellRead=self._get_item_reader().get(bell) if bellRead.item!=material:continue if self._get_game_state().countAll('CASH')<int(bellRead.buyCash):continue cash_pack[bellRead.id]=bellRead.buyCash if default:itemId=min(cash_pack, key=lambda i: cash_pack[i]) else: itemId=max(cash_pack, key=lambda i: cash_pack[i]) bellRead=self._get_item_reader().get(itemId) if bellRead.buyCash<=0:return False self._get_game_state().removeAll('CASH',bellRead.buyCash) return itemId
посмотрите )
Последний раз редактировалось greyzza; 24.08.2016 в 19:06.
|
|
|
24.08.2016, 19:47
|
#5100
|
|
|
|
Разведчик
|
Регистрация: 19.10.2014
Сообщений: 0
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Zombot (Клиент для игры Зомби ферма) [Обсуждение]
|
Цитата: |
|
|
|
|
|
|
|
|
|
PHP код:
def halloweenTower(self,obj,user):
remoteTrick=self._get_game_state().get_state().remoteTrickTreating
dayLimit=int(self._get_item_reader().get('bells').dayLimit)
reader_Tower=self._get_item_reader().get(obj.item)
transformationDate=hasattr(reader_Tower,'transformationDate')
if transformationDate and int(reader_Tower.transformationDate)/1000<time.time():return
if [rem.user for rem in remoteTrick if rem.user == user]:
# тукаем за ЗБ избранным друзьям
if not str(user) in self.vip_friends():return
itemId=self.bell_id(reader_Tower.material,False)
if self.cashBuy:return#
self.cashBuy=True# это сделано чтобы стучать только в одну туковку если туковок на острове много
else:
itemId=self.bell_id(reader_Tower.material,True)
if len(remoteTrick)>=dayLimit:return
if not itemId:return
event_rem={"objId":obj.id,"type":"item","itemId":itemId,"action":"remoteTrickTreating"}
trick_user=dict2obj({u'count': 0L, u'date': u'-3131420', u'user': str(user), u'item':reader_Tower.material})
self._get_game_state().get_state().remoteTrickTreating.append(trick_user)
self._get_events_sender().send_game_events([event_rem])
self.cprint(u'5 Стукнул в %s'%(reader_Tower.name))
def bell_id(self,material,default):
# если default True--> возвращает ид бесплатного тука, иначе ид тука за максимальное кол-во ЗБ
bells=self._get_item_reader().get('bells').items
cash_pack={}
for bell in bells:
bellRead=self._get_item_reader().get(bell)
if bellRead.item!=material:continue
if self._get_game_state().countAll('CASH')<int(bellRead.buyCash):continue
cash_pack[bellRead.id]=bellRead.buyCash
if default:itemId=min(cash_pack, key=lambda i: cash_pack[i])
else:
itemId=max(cash_pack, key=lambda i: cash_pack[i])
bellRead=self._get_item_reader().get(itemId)
if bellRead.buyCash<=0:return False
self._get_game_state().removeAll('CASH',bellRead.buyCash)
return itemId
посмотрите )
|
|
|
|
|
|
Ок, Спасибо, Будем посмотреть))
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 14:40.
|
|