Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 24, 2014 11:38:46

kisel
Зарегистрирован: 2014-12-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Одноранговый морской бой. (За вознаграждение)

Доброго времени суток. Не могу разобраться в ошибке, хотя все правильно написано. В долгу не останусь. Вот собственно ошибка:

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

main:
# -*- 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!"

user:
# -*- 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)

Офлайн

#2 Дек. 24, 2014 11:57:16

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Одноранговый морской бой. (За вознаграждение)

Или проблема в обработке протокола где-то около

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"])
Или смотрите реализацию Shot, которую нам тут не видно.

Отредактировано Shaman (Дек. 24, 2014 11:59:20)

Офлайн

#3 Дек. 24, 2014 12:02:52

kisel
Зарегистрирован: 2014-12-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Одноранговый морской бой. (За вознаграждение)

Вся игра

Прикреплённый файлы:
attachment Battle.zip (13,7 KБ)

Офлайн

#4 Дек. 24, 2014 12:07:59

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Одноранговый морской бой. (За вознаграждение)

Ну да - напутано. getShotState есть у ShotResponse.

Офлайн

#5 Дек. 24, 2014 14:03:15

kisel
Зарегистрирован: 2014-12-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Одноранговый морской бой. (За вознаграждение)

Все ровно не выходит, getShotState поменял. Ошибки те же

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version