#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#
|
# @todo:
|
#
|
# @author: Alee
|
# @date 2018-1-3 ÏÂÎç05:54:40
|
# @version 1.0
|
#
|
# @note:
|
#
|
#---------------------------------------------------------------------
|
# ¼òҪ˵Ã÷ µÇ¼£¬µÇ³ö´¦Àí°ü
|
# ÏêϸÃèÊö None
|
|
import base64
|
from AI.AIBase import *
|
import logging
|
import os
|
import random
|
from ConfigurationReader import ConfigIniReader
|
from DataReader import MapEventPointReader, ChinMapReader
|
from Protocol.PacketsSend import tagCClientVersion
|
from Protocol.PacketsSend import tagCRoleLoginAsk
|
from Protocol.PacketsSend import tagCInitMapOK, tagCCreateRole, tagCGMCMD, tagCCliectReborn
|
from Protocol.PacketsSend import tagCPlayerLogin, tagCWorldTransfer, tagCPlayerLogOut, tagCExitFB
|
|
from Robot.PlayerData import PlayerData
|
from Protocol.PacketsSendPY import tagCMSightZoom, tagCMWorldTick
|
from Robot import DataDefine
|
VER = "2012-08-30 16:30"
|
|
|
#ĬÈϵÚÒ»ÕŵØÍ¼
|
Def_First_MapID = 10010
|
|
## µÇ¼£¬µÇ³ö´¦Àí°ü
|
#
|
# ¼Ì³ÐAIBase
|
class AILoginout(AIBase):
|
|
## ËùÓÐAI±ØÐë²ÉÓÃÕâÖй̶¨µÄ³õʼ»¯ÔÐÍ£¬ÒÔ±ãAIMgr×Ô¶¯¼ÓÔØ
|
# @param None : None
|
# @return bool
|
# @remarks ´ËAI²»ÐèÒªÖÜÆÚÐÔ±»µ÷Óã¬ËùÒÔÉèÖÃΪ²»ÆôÓÃTimer
|
def __init__(self, robot):
|
#´ËAI²»ÐèÒªÖÜÆÚÐÔ±»µ÷Óã¬ËùÒÔÉèÖÃΪ²»ÆôÓÃTimer
|
AIBase.__init__(self, robot, 0, False, False)
|
self.SetActive(True)
|
self.MapID = 0
|
|
|
## ÏòAIMgr×¢²áÏûÏ¢»Øµ÷º¯Êý
|
# @param None : None
|
# @return bool
|
# @remarks
|
def _RegisterPacket(self, aiMgr):
|
aiMgr.RegNetMsg(0x0101, self.OnServerPrepared, False)
|
aiMgr.RegNetMsg(0x0115, self.OnAskClientVersion, False)
|
aiMgr.RegNetMsg(0x0107, self.OnShowLoginFrm, True)
|
aiMgr.RegNetMsg(0x0109, self.OnServerPrepareOK, False)
|
aiMgr.RegNetMsg(0x0103, self.OnNeedCreateRole, False)
|
aiMgr.RegNetMsg(0x0102, self.OnCDBPlayer, True)
|
aiMgr.RegNetMsg(0x0401, self.OnPlayerMapInit, True)
|
aiMgr.RegNetMsg(0x0403, self.OnPlayerLoginLoadOK, False)
|
aiMgr.RegNetMsg(0x0104, self.OnServerDisconnect, True)
|
#aiMgr.RegNetMsg(0xA312, self.OnMagicWeaponData, True)
|
aiMgr.RegNetMsg(0x0418, self.OnAttr, True)
|
aiMgr.RegNetMsg(0xA709, self.OnAttrList, True)
|
#aiMgr.RegNetMsg(0x0114, self.OnAttrList, True) Ïß·
|
#aiMgr.RegNetMsg(0x0906, self.LeaveTeam, True)
|
#aiMgr.RegNetMsg(0xB902, self.TeamRefresh, True)
|
aiMgr.RegNetMsg(0x0609, self.PlayerDie, True)
|
|
def PlayerDie(self, pack):
|
if pack.PlayerID != self.robot.GetPlayerInfo().GetPlayerID():
|
return
|
|
sendPack = tagCCliectReborn()
|
sendPack.Type = 2
|
|
self.robot.Send(sendPack)
|
return
|
|
# À뿪¶ÓÎé
|
def LeaveTeam(self, pack):
|
if pack.PlayerID != self.robot.GetPlayerInfo().GetPlayerID():
|
if self.robot.GetPlayerInfo().GetTeamMemberLV() == 2:
|
# ×éÔ±Í˳ö ¶Ó³¤¼ÌÐøÕÒÈË×é¶Ó
|
self.JoinTeam()
|
return
|
self.robot.GetPlayerInfo().SetTeamID(0)
|
self.robot.GetPlayerInfo().SetTeamMemberLV(0)
|
self.JoinTeam()
|
return
|
|
# ¶ÓÎéË¢ÐÂ
|
def TeamRefresh(self, pack):
|
logging.debug("TeamRefresh----%s"%self.robot.GetPlayerInfo().GetPlayerID())
|
self.robot.GetPlayerInfo().SetTeamID(pack.TeamID)
|
for member in pack.MemberList:
|
if member.PlayerID == self.robot.GetPlayerInfo().GetPlayerID():
|
self.robot.GetPlayerInfo().SetTeamMemberLV(member.MemberLV)
|
break
|
return
|
|
#A709 ÊôÐÔÕûºÏ°ü
|
def OnAttrList(self, pack):
|
if pack.ObjID != self.robot.GetPlayerInfo().GetPlayerID():
|
return
|
|
if pack.ObjType != 1:
|
return
|
|
for i in xrange(pack.Count):
|
lpack = pack.RefreshType[i]
|
self.CalcAttr(lpack)
|
|
return
|
|
#0418
|
def OnAttr(self, pack):
|
if pack.ObjID != self.robot.GetPlayerInfo().GetPlayerID():
|
return
|
|
if pack.ObjType != 1:
|
return
|
|
self.CalcAttr(pack)
|
return
|
|
def CalcAttr(self, pack):
|
if pack.RefreshType == DataDefine.CDBPlayerRefresh_LV:
|
self.robot.GetPlayerInfo().SetPlayerLV(pack.Value)
|
#if self.robot.GetIsLoginOK():
|
# self.RefreshPoint()
|
|
elif pack.RefreshType == DataDefine.CDBPlayerRefresh_DEF:
|
self.robot.GetPlayerInfo().SetDefense(pack.Value)
|
elif pack.RefreshType == DataDefine.CDBPlayerRefresh_Gold:
|
self.robot.GetPlayerInfo().SetGold(pack.Value)
|
elif pack.RefreshType == DataDefine.CDBPlayerRefresh_TeamID:
|
self.robot.GetPlayerInfo().SetTeamID(pack.Value)
|
if pack.Value == 0:
|
self.robot.GetPlayerInfo().SetTeamMemberLV(0)
|
elif pack.RefreshType == DataDefine.CDBPlayerRefresh_HappyPoint:
|
self.robot.GetPlayerInfo().SetTJGTime(pack.Value)
|
# Í˳ö¶ÓÎ飬ÀëÏß
|
self.TJGLeave(pack.Value)
|
elif pack.RefreshType == DataDefine.CDBPlayerRefresh_Tick:
|
self.robot.GetPlayerInfo().SetWorldTick(pack.Value)
|
self.RefreshPoint()
|
elif pack.RefreshType == DataDefine.CDBPlayerRefresh_FBID:
|
self.robot.GetPlayerInfo().SetFBID(pack.Value)
|
elif pack.RefreshType == DataDefine.CDBPlayerRefresh_GMLevel:
|
self.robot.GetPlayerInfo().SetGMLV(pack.Value)
|
elif pack.RefreshType == DataDefine.CDBPlayerRefresh_Job:
|
self.robot.GetPlayerInfo().SetJob(pack.Value)
|
|
|
def TJGLeave(self, tjgTime):
|
|
if tjgTime != 0:
|
return
|
#sendPack = tagCLeaveTeam()
|
#self.robot.Send(sendPack)
|
|
sendPack = tagCPlayerLogOut()
|
self.robot.Send(sendPack)
|
|
from Robot import RobotMgr
|
RobotMgr.GetRobotMgr().DisconnectServer(self.robot)
|
|
def OnMagicWeaponData(self, pack):
|
|
#logging.info("·¨±¦-----%s %s"%(pack.Num, pack.MagicWeaponID))
|
# ½âËøµØÍ¼£¬¼¼ÄÜ
|
if self.robot.GetPlayerInfo().GetMaxMapID() != 0:
|
return
|
|
maxfbID = 0
|
for fbID in pack.MagicWeaponID:
|
# 100¿ªÍ·Îª½âËøµØÍ¼
|
if fbID/100 > 1:
|
continue
|
maxfbID = max(maxfbID, fbID)
|
|
maxMapID = ChinMapReader.GetChinMapData().FindMaxMapID(self.robot.GetPlayerInfo().GetPlayerLV(), maxfbID)
|
#logging.debug("----1111---%s"%(maxMapID))
|
|
self.robot.GetPlayerInfo().SetMaxMapID(maxMapID)
|
return
|
|
## ºÍ·þÎñÆ÷¶Ï¿ª
|
# @param None : None
|
# @return bool
|
# @remarks
|
def OnServerDisconnect(self, packOnServerDisconnect):
|
logging.info("RobotCheckTT peer:0x%08X serverdisconnect, reason:%s " % \
|
(self.robot.GetPeerValue(), packOnServerDisconnect.Reason))
|
self.robot.SetIsLoginOK(False)
|
self.robot.SetLastDisconnectReason(packOnServerDisconnect.Reason)
|
from Robot import RobotMgr
|
RobotMgr.GetRobotMgr().DisconnectServer(self.robot)
|
return
|
|
|
## ·þÎñÆ÷×¼±¸Íê³É
|
# @param None : None
|
# @return bool
|
# @remarks
|
def OnServerPrepared(self, packOnServerPrepared):
|
#=======================================================================
|
# loginPack = tagCPlayerLogin()
|
# loginPack.AccID =
|
# logging.debug(str(loginPack.AccID))
|
# loginPack.Password = base64.standard_b64encode()
|
# loginPack.Version = ConfigIniReader.GetConfig().GetVersionNo()
|
# logging.info("RobotCheckTT peer:0x%08X OnServerPrepared %s,%s,%d"% \
|
# (self.robot.GetPeerValue(), loginPack.AccID, loginPack.Password, loginPack.Version))
|
#=======================================================================
|
# Êý¾Ý¿âÈ¡³öΪunicodeÐèҪתstr
|
if self.IsTokenLogOn():
|
return
|
|
#self.robot.Send(loginPack)
|
return
|
|
|
## ÊÇ·ñTokenµÇ½
|
# @param None : None
|
# @return bool
|
# @remarks
|
def IsTokenLogOn(self):
|
#·¢°üTokenµÇ½
|
|
#===============================================================================
|
# class tagCPlayerLogin(Structure):
|
# Head = tagHead()
|
# IDType = 0 #(BYTE IDType)//Õ˺ÅÀàÐÍ.0:ÆÕͨÕ˺Å;1:FreeSDK;
|
# AccID = "" #(char AccID[65])// ÉçȺÕ˺ŵij¤¶ÈÊÇ30
|
# Password = "" #(char Password[33])//size = Len£¬¿É·¢token
|
# Version = 0 #(DWORD Version)
|
# LineNO = 0 #(BYTE LineNO)
|
# MAC = "" #(char MAC[18])//MACµØÖ·
|
# AppID = 0 #(DWORD AppID)//Ó¦ÓñàÂë, ½ÓFreeSDK
|
# AccountID = 0 #(DWORD AccountID)//Óû§IDÓëÕ˺Ų»Í¬£¬½ÓFreeSDK
|
# TokenExpire = "" #(char TokenExpire[20])//ʱ¼ä´Á£¬ºÁÃë¼¶£¬½ÓFreeSDK
|
# Phone = 0 #(BYTE Phone)//ÊÇ·ñ°ó¶¨ÊÖ»ú
|
# ServerID = 0 #(DWORD ServerID)//·þÎñÆ÷ID
|
# data = None
|
#===============================================================================
|
|
|
|
#=======================================================================
|
# cAccessLogin = tagCAccessLogin()
|
# cAccessLogin.AccessToken = self.robot.GetRobotConfig()[0]
|
# cAccessLogin.MAC = self.robot.GetRobotConfig()[2]
|
# cAccessLogin.Version = ConfigIniReader.GetConfig().GetVersionNo()
|
#=======================================================================
|
accID, appID, sid = self.robot.GetRobotConfig()[1].split("@")
|
cAccessLogin = tagCPlayerLogin()
|
cAccessLogin.IDType = 1
|
cAccessLogin.AccID = accID
|
cAccessLogin.Password = self.robot.GetRobotConfig()[0]
|
cAccessLogin.Version = ConfigIniReader.GetConfig().GetVersionNo()
|
cAccessLogin.LineNO = 255
|
cAccessLogin.MAC = self.robot.GetRobotConfig()[2]
|
cAccessLogin.AppID = appID
|
cAccessLogin.ServerID = int(sid[1:])
|
cAccessLogin.Adult = self.robot.GetRobotConfig()[3]
|
cAccessLogin.ExtraLen = len(appID)
|
cAccessLogin.Extra = appID
|
|
self.robot.Send(cAccessLogin)
|
#print "New Player Login ---------- ", self.robot.GetRobotConfig()[1]
|
return True
|
|
|
## ÇëÇó°æ±¾
|
# @param None : None
|
# @return bool
|
# @remarks
|
def OnAskClientVersion(self, packOnAskClientVersion):
|
ClientVersionPack = tagCClientVersion()
|
ClientVersionPack.Version = ConfigIniReader.GetConfig().GetClientVersion()
|
ClientVersionPack.VersionLen = len(ClientVersionPack.Version)
|
#logging.info("RobotCheckTT peer:0x%08X OnAskClientVersion %s,%d"% \
|
# (self.robot.GetPeerValue(), ClientVersionPack.Version, ClientVersionPack.VersionLen))
|
self.robot.Send(ClientVersionPack)
|
return
|
|
|
## 怫
|
# @param None : None
|
# @return bool
|
# @remarks
|
def OnShowLoginFrm(self, packOnShowLoginFrm):
|
if packOnShowLoginFrm.Type == 1:
|
#ÐèÒª´´½¨½ÇÉ«
|
pack = tagCRoleLoginAsk()
|
pack.Type = 1
|
#logging.info("RobotCheckTT peer:0x%08X OnShowLoginFrm 1"%(self.robot.GetPeerValue()))
|
self.robot.Send(pack)
|
return
|
if packOnShowLoginFrm.Type == 2:
|
#Ñ¡Ôñ½ÇÉ«
|
pack = tagCRoleLoginAsk()
|
pack.Type = 2
|
#logging.info("RobotCheckTT peer:0x%08X OnShowLoginFrm 2"%(self.robot.GetPeerValue()))
|
self.robot.Send(pack)
|
return
|
return
|
|
|
## µØÍ¼×¼±¸Íê³É
|
# @param None : None
|
# @return bool
|
# @remarks
|
def OnServerPrepareOK(self, packOnServerPrepareOK):
|
|
#֪ͨGameServer×Ô¼º¶ÁÈ¡µØÍ¼³É¹¦
|
pack = tagCInitMapOK()
|
pack.MapID = self.MapID
|
self.robot.Send(pack)
|
|
#ÉèÖýøÈëÍæ¼ÒÊý¾Ý
|
self.robot.GetPlayerInfo().SetRoundNpcDict({})
|
#logging.info("RobotCheckTT peer:0x%08X OnServerPrepareOK"%(self.robot.GetPeerValue()))
|
|
|
## ´´½¨Ö÷½Ç
|
# @param None : None
|
# @return bool
|
# @remarks
|
def OnNeedCreateRole(self, packOnNeedCreateRole):
|
#logging.info("RobotCheckTT peer:0x%08X OnNeedCreateRole"%(self.robot.GetPeerValue()))
|
pack = tagCCreateRole()
|
pack.Name = self.robot.GetRobotConfig()[1].split('@')[0]
|
pack.Sex = 1
|
pack.Hair = 10002
|
pack.HairColor = 1
|
pack.Face = 10006
|
pack.FacePic = 11004
|
|
pack.PlayerType = 1
|
pack.Job = random.choice([1, 2])
|
self.robot.Send(pack)
|
return
|
|
|
## Ö÷½Ç³õʼ»¯
|
# @param None : None
|
# @return bool
|
# @remarks
|
def OnCDBPlayer(self, packOnCDBPlayer):
|
self.MapID = packOnCDBPlayer.MapID
|
#=======================================================================
|
# logging.info("RobotCheckTT peer:0x%08X Player%sLogin, ID:%d, AccID:%s " \
|
# "HP:%d MP:%d, MapID:%d Pos:(%d,%d)"%(\
|
# self.robot.GetPeerValue(), packOnCDBPlayer.PlayerName,
|
# packOnCDBPlayer.PlayerID, packOnCDBPlayer.AccID, packOnCDBPlayer.HP,
|
# packOnCDBPlayer.MP, packOnCDBPlayer.MapID,
|
# packOnCDBPlayer.PosX, packOnCDBPlayer.PosY))
|
#=======================================================================
|
self.robot.SetPlayerInfo(PlayerData(packOnCDBPlayer.AccID, \
|
packOnCDBPlayer.PlayerID, packOnCDBPlayer.PlayerName, \
|
packOnCDBPlayer.MapID, packOnCDBPlayer.PosX, packOnCDBPlayer.PosY, {}, packOnCDBPlayer.Job))
|
|
self.robot.GetPlayerInfo().SetPlayerLV(packOnCDBPlayer.LV)
|
self.robot.GetPlayerInfo().SetGold(packOnCDBPlayer.Gold)
|
self.robot.GetPlayerInfo().SetLineID(packOnCDBPlayer.LineID)
|
self.robot.GetPlayerInfo().SetTJGTime(packOnCDBPlayer.HappyPoint)
|
self.robot.GetPlayerInfo().SetFBID(packOnCDBPlayer.FBID)
|
|
self.robot.GetPlayerInfo().SetGMLV(packOnCDBPlayer.GMLevel)
|
|
self.robot.GetPlayerInfo().SetJob(packOnCDBPlayer.Job)
|
self.robot.GetPlayerInfo().SetPlayerID(packOnCDBPlayer.PlayerID)
|
|
## 04 01 ÈËÎïËùÔڵij¡¾°³õʼ»¯#tagPlayerMapInit
|
# @param None : None
|
# @return bool
|
# @remarks
|
def OnPlayerMapInit(self, packOnPlayerMapInit):
|
#logging.info("RobotCheckTT peer:0x%08X ÈËÎïËùÔڵij¡¾°³õʼ»¯"%(self.robot.GetPeerValue()))
|
self.MapID = packOnPlayerMapInit.MapID
|
self.robot.GetPlayerInfo().SetMapID(self.MapID)
|
self.robot.GetPlayerInfo().SetPosX(packOnPlayerMapInit.PosX)
|
self.robot.GetPlayerInfo().SetPosY(packOnPlayerMapInit.PosY)
|
return
|
|
|
## 04 03 Íæ¼ÒµÇ¼Êý¾Ý·¢ËÍÍê±ÏOK#tagPlayerLoginLoadOK
|
# @param None : None
|
# @return bool
|
# @remarks
|
def OnPlayerLoginLoadOK(self, packOnPlayerLoginLoadOK):
|
#logging.info("RobotCheckTT peer:0x%08X tagPlayerLoginLoadOK"%(self.robot.GetPeerValue()))
|
self.robot.SetIsLoginOK(True)
|
self.robot.ClearDisconnectReason()
|
|
sightPack = tagCMSightZoom()
|
sightPack.Sight = 18
|
self.robot.SendMapServerPYPack(sightPack)
|
|
if self.GMCmd():
|
if not self.robot.GetPlayerInfo().GetStartWorldTick():
|
sendPack = tagCMWorldTick()
|
self.robot.SendMapServerPYPack(sendPack)
|
return
|
|
if not self.robot.GetPlayerInfo().GetStartWorldTick():
|
sendPack = tagCMWorldTick()
|
self.robot.SendMapServerPYPack(sendPack)
|
|
mapData = ChinMapReader.GetChinMapData().FindMapByID(self.robot.GetPlayerInfo().GetMapID())
|
|
if mapData and mapData.MapFBType != 0:
|
|
sendPack = tagCExitFB()
|
self.robot.Send(sendPack)
|
return
|
|
|
#self.SendEventAnswer()
|
self.RefreshPoint()
|
|
|
def GMCmd(self):
|
if self.robot.GetPlayerInfo().GetGMLV() != 90:
|
pack = tagCGMCMD()
|
pack.Clear()
|
cmd = "@SetGM 90"
|
pack.CmdLen = len(cmd)
|
pack.Cmd = cmd
|
self.robot.Send(pack)
|
#logging.info("GMCmd---SetGM")
|
|
|
if self.robot.GetPlayerInfo().GetPlayerLV() == 1:
|
cmd = "OpenFunc 1"
|
pack = tagCGMCMD()
|
pack.Clear()
|
pack.CmdLen = len(cmd)
|
pack.Cmd = cmd
|
self.robot.Send(pack)
|
|
cmd = "imba %s"%random.randint(5, 300)
|
pack = tagCGMCMD()
|
pack.Clear()
|
pack.CmdLen = len(cmd)
|
pack.Cmd = cmd
|
self.robot.Send(pack)
|
#logging.info("GMCmd---imba")
|
|
return True
|
return False
|
|
def GetDist(self, posX, posY, tagX, tagY):
|
return max(abs(posX - tagX), abs(posY - tagY))
|
|
# ÖØÉè¹Ò»úµã
|
def RefreshPoint(self):
|
MapEventPointReader.GetMapEventPoint().FindNPC(self.robot)
|
point = self.robot.GetPlayerInfo().GetTJGPoint()
|
if not point:
|
return
|
|
mapID, (posX, posY), npcID = point
|
|
#mapID, posX, posY = 10010, 207, 105
|
|
if posX == 0 and posY == 0:
|
logging.info("¹Ò»úµã±í´íÎ󣡣¡£¡ npcID = %s"%npcID)
|
return
|
|
if self.robot.GetPlayerInfo().GetMapID() == mapID and \
|
self.GetDist(posX, posY, self.robot.GetPlayerInfo().GetPosX(), self.robot.GetPlayerInfo().GetPosY()) < 10:
|
# Òѵ½Ä¿±êµã
|
return
|
|
# 1.´«ËͰü£¬2.ÉèÖùһúNPC 3.×é¶Ó
|
|
sendPack = tagCWorldTransfer()
|
sendPack.Type = 1
|
sendPack.MapID = mapID
|
sendPack.PosX = posX + random.randint(-10, 10)
|
sendPack.PosY = posY + random.randint(-10, 10)
|
sendPack.ExtField1 = self.robot.GetPlayerInfo().GetFBID()#random.randint(0, 2) # ¿ÉÒÔ¸ù¾ÝÏß·Çé¿ö·ÖÅä
|
self.robot.Send(sendPack)
|
|
self.robot.GetPlayerInfo().SetPosX(posX)
|
self.robot.GetPlayerInfo().SetPosY(posY)
|
|
if mapID != self.robot.GetPlayerInfo().GetMapID():
|
logging.debug("µØÍ¼Çл»¹Ò»ú----%s-%s"%(mapID,self.robot.GetPlayerInfo().GetMapID()))
|
return
|
|
self.JoinTeam()
|
return
|
|
|
def JoinTeam(self):
|
if self.robot.GetPlayerInfo().GetTeamID() != 0:
|
return
|
if not self.robot.GetIsLoginOK():
|
return
|
|
#=======================================================================
|
# logging.debug("×é¶ÓÉêÇë----%s"%self.robot.GetPlayerInfo().GetPlayerID())
|
# sendPack = tagCGAutoMatchTeam()
|
# self.robot.SendGameServerPYPack(sendPack)
|
#
|
# sendPack = tagCGCreateTeam()
|
# sendPack.TagMapID = 0
|
# sendPack.TagMapEx = 0
|
# sendPack.ReqMinLV = 1
|
# sendPack.ReqMaxLV = 0
|
# self.robot.SendGameServerPYPack(sendPack)
|
#=======================================================================
|
|
|
|
|
"""
|
ʵÏÖ¸÷ÖÖÏûÏ¢»Øµ÷º¯Êý£¬
|
1. Ïò·þÎñ¶Ë·¢°ü¿ÉʹÓÃÀàËÆ
|
onlineR = tagCOnlineReturn()
|
self.robot.Send( onlineR )
|
|
2.Èç¹ûÐèÒªÏòRobot±£´æÊý¾Ý£¬ÔòÊÂÏÈÈ·ÈÏÕâЩÊý¾ÝÊÇ·ñÖ»ÊÇAIÔËÐÐÏà¹Ø£¬
|
¶øÓëʹÓÃRobotµÄÆäËûÀàµÄʵÀýÎÞ¹Ø
|
Èç¹ûÊÇÕâÖÖÇé¿ö£¬Çë²»Òª±£´æµ½Robot£¬¶øÓ¦¸ÃÔÚ¶ÔÓ¦µÄAIµÄ×ÓÀàÄÚ±£´æÊý¾Ý
|
|
3.Èç¹ûÐèÒªÖÜÆÚÐԻص÷£¬ÔòÔÚ__init__ʱÉèÖÃTimer£¬ÌáÊ¾ÖØÔØ_Processº¯Êý
|
"""
|
|
|
|