Форум сайта python.su
0
Доброго времени суток. Не могу разобраться в ошибке, хотя все правильно написано. В долгу не останусь. Вот собственно ошибка:
Traceback (most recent call last):
File “C:\Users\Миша\Desktop\BattleShip\BattleShip\main.py”, line 32, in <module>
userObj.makeShot()
File “C:\Users\Миша\Desktop\BattleShip\Battle\user.py”, line 53, in makeShot
self.enemyField.setValueByCoords(x,y, shotResponse.getShotState());
AttributeError: Shot instance has no attribute ‘getShotState’
GameProtocol:
# -*- coding: UTF-8 -*- from socket import * import Shot import ShotResponse import json import time class netPackage: NPTYPE_GENERIC = 0 NPTYPE_CONNECT = 1 NPTYPE_OK = 200 NPTYPE_SHOT = 2 NPTYPE_SHOTRESPONSE = 3 __pType = NPTYPE_GENERIC def jsonize(self,data): return json.dumps({"type":self.__pType,"data":data}) def __init__(self,type=NPTYPE_GENERIC): self.__pType = type class GameProtocol : __socket = 0 __ip = "127.0.0.1" __conn = 0 def __init__(self, user): self.__socket = socket(AF_INET, SOCK_STREAM) # get server IP if player is't server if(user.isServer) : self.__socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) self.__ip = raw_input("Enter server IP\n") print("Please wait, connecting..") self.__socket.bind((self.__ip, 9090)) self.__socket.listen(1) self.__conn, arrn = self.__socket.accept()# open connection data = json.loads(self.__conn.recv(1024)) if(data["type"] == netPackage.NPTYPE_CONNECT): self.__conn.send(netPackage(netPackage.NPTYPE_OK).jsonize({"timestamp":time.time()})) print "Connected. Delta time = %.3f"%(time.time()-float(data["data"]["timestamp"])) self.__conn.close() else : self.__ip = raw_input("Enter server IP\n") print("Please wait, connecting..") self.__socket.connect((self.__ip, 9090)) self.__socket.send(netPackage(netPackage.NPTYPE_CONNECT).jsonize({"timestamp":time.time()})) data = json.loads(self.__socket.recv(1024)) if(data["type"] == netPackage.NPTYPE_OK): print "Connected. Delta time = %.3f"%(time.time()-float(data["data"]["timestamp"])) #socket configuration #set connecting IP and port def send(self, data): self.__socket = socket(AF_INET, SOCK_STREAM) #conn, addr = self.__socket.accept()# open connection self.__socket.connect((self.__ip, 9090)) self.__socket.send(data)#send it def recive(self): self.__socket = socket(AF_INET, SOCK_STREAM) self.__socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) self.__socket.bind((self.__ip, 9090)) self.__socket.listen(1) self.__conn, arrn = self.__socket.accept()# open connection data = json.loads(self.__conn.recv(1024)) # receive data and decode it self.__conn.close()# close connection resultingData = 0 #define received data type if (data["type"] == netPackage.NPTYPE_SHOT): resultingData = Shot.Shot(data["data"]["x"], data["data"]["y"]) elif (data["type"] == netPackage.NPTYPE_SHOTRESPONSE) : resultingData = ShotResponse.ShotResponse(data["data"]["shotResult"]) else : raise ValueError("Internal error, invalid data type") return resultingData
# -*- coding: utf-8 -*- import sys import gameFields import userGameField import enemyGameField from user import * from GameProtocol import * import StringIO io = StringIO.StringIO() if __name__ == "__main__": print 'Welcome to BattleShip by DarthVader and Livich\n','='*25 name = raw_input("Enter your nickname: ") __isServer = raw_input("Do you want to be a server (s) or client (c)?: ") if __isServer == "s": __isServer = True else: __isServer = False userObj = User(name,__isServer) networkWrapper = GameProtocol(userObj) userObj.assignNetworkWrapper(networkWrapper)#теперь пользователь подключён к сети firstIteration = True while True: #основной игровой цикл if userObj.isLoose==True: break; if firstIteration and userObj.isServer==True: userObj.makeShot() else: userObj.makeShot() enemyShot = networkWrapper.recive() userObj.onShot(enemyShot) if userObj.isLoose==True: print "You loose!" else: print "You win!"
# -*- coding: utf-8 -*- from userGameField import userGameField from enemyGameField import enemyGameField from GameProtocol import netPackage class User: playerName = ""; __isServer = False; __isLoose = False; network = 0 #TODO:network wrapper gameField = userGameField() gameField.randomInit() enemyField = enemyGameField() def __init__(self,playerName="unnamedPlayer",serverMode=False): self.playerName = playerName self.isServer = serverMode return; def onLoose(self): self.__isLoose = True; def onShot(self,enemyShot): shotResult = self.gameField.processShot(enemyShot); #shotResult отвечает константой CELLTYPE_* из gameFields - это новое состояние клетки print "Enemy shot("+enemyShot.getX()+","+enemyShot.getY()+") result: "+{ self.gameField.CELLTYPE_SHOOTED_CELL: "empty cell", self.gameField.CELLTYPE_SHOOTED_SHIP: "ship shooted" }.get(shotResult); if self.gameField.checkAlive() == False: self.onLoose(); def makeShot(self): x=-1 y=-1 print "Your field: \n" self.gameField.friendlyPrint(); print "\n Enemy field: \n" self.enemyField.friendlyPrint(); while x==-1 or y==-1 or self.enemyField.getByCoords(int(x),int(y))!=0: #проверка, чтобы туда действительно можно было стрелять if x>self.enemyField.getSize(0) or y>self.enemyField.getSize(1): continue if(self.enemyField.getByCoords(x,y)==2): print "There we's already shooted. Retry...\n" if(self.enemyField.getByCoords(x,y)==3): print "There we's already shooted and there was a ship. Retry...\n" x = raw_input("X = ") y = raw_input("Y = ") self.network.send(netPackage(netPackage.NPTYPE_SHOT).jsonize({"x":x,"y":y})); shotResponse = self.network.recive() self.enemyField.setValueByCoords(x,y, shotResponse.getShotState()); return; def assignNetworkWrapper(self,network): self.network = network @property def isServer(self): return self.__isServer; @property def isLoose(self): return self.__isLoose;
Отредактировано kisel (Дек. 24, 2014 11:46:51)
Офлайн
88
Или проблема в обработке протокола где-то около
if (data["type"] == netPackage.NPTYPE_SHOT): resultingData = Shot.Shot(data["data"]["x"], data["data"]["y"]) elif (data["type"] == netPackage.NPTYPE_SHOTRESPONSE) : resultingData = ShotResponse.ShotResponse(data["data"]["shotResult"])
Отредактировано Shaman (Дек. 24, 2014 11:59:20)
Офлайн
0
Вся игра
Прикреплённый файлы:
Battle.zip (13,7 KБ)
Офлайн
88
Ну да - напутано. getShotState есть у ShotResponse.
Офлайн
0
Все ровно не выходит, getShotState поменял. Ошибки те же
Офлайн