user1159454
user1159454

Reputation: 3317

int object is unscriptable Python

I'm trying to make Battleship for practice, and single player was a success...when there was only one player and one set of ships and a board :P

Any idea why this is giving me an 'int object is unscriptable' error???

Here is the Board class. Well, some of it anyway:

class Board:
    'Game Board'
    topMarkers = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    sideMarkers = list(range(0, 26))


    def __init__(self,h,w): #Makes the map
        self.height = h
        self.width = w

        self.xMarkers = []
        self.yMarkers = []
        self.hitList = []
        self.hitListCopy = []

        self.boardSpace = '         '

        wave = '~'
        self.row = []
        self.column = []
        #self.column = wave * self.width # If width is 4, column is now '~~~~'

        for c in range(self.width):
            self.column.append(wave)
            self.xMarkers.append(Board.topMarkers[c])

        for r in range(self.height): #
            self.row.append(self.column[:]) #Use the slice to make copies
            self.yMarkers.append(Board.sideMarkers[r])



    def showGrid(self):
        print self.boardSpace + '  ' +  ' '.join(self.xMarkers)
        for i in range(self.height):
            print self.boardSpace + str(self.yMarkers[i]) + ' ' + '-'.join(self.row[i])

And here's the code that actually runs it, the part of the code that is causing it is in the bottom while and for loop, where it says in the comment to show the grid of YOUR map.

p1 = [[Board(7,7), Board(7,7)], Move(), Connection(1, netEnable)]
p2 = [[Board(7,7), Board(7,7)], Move(), Connection(2, netEnable)]
#p3 = [[Board(7,7), Board(7,7)], Move(), Connection(3, netEnable)]

#Like this p1 = [[theirBoard, attackBoard], Moves, Connection]



#p = [p1,p2,p3]
p = [p1,p2]


ships = [Ship(0),Ship(0),Ship(0)]
ships2 = [Ship(0),Ship(0),Ship(0)]

numOfPlayers = len(p)


youPlayer = int(raw_input('Which player are you? 1,2,3:   '))

youPlayer -= 1



boardr = p[youPlayer][0][1].getRowData()
boardM = p[youPlayer][0][0].getMarkerData()
#raw_input(boardr)
raw_input(boardM)



#Set Ships Dialog.
for i in range(len(ships)):
    p[youPlayer][0][1].showGrid() 
    ships[i].setShip(boardr, boardM)


shipPosAll = [[],[],[]]    

for i in range(len(ships)):
    shipPosAll[youPlayer].append(ships[i].getShip()) #USE THIS INFO TO FEED TO THE BOARD TO TELL IT WHERE SHIPS ARE SO YOU KNOW WHERE HITS ARE.

print 'shipPos at line 382 : %s' % (shipPosAll[youPlayer])




#INIT, DO ONLY ONCE

for i in range(numOfPlayers): 
    print p[i][2].GetTime()

#MAIN LOOP
while gameNotOver:

    for i in range(numOfPlayers):
        playersCheck = [0,1]
        del playersCheck[youPlayer]

        print 'Player %s turn' % (i)
        print 'Here are your ships'
        #raw_input (p[i][0][1])
        p[i][0][1].showGrid() #Show the grid of the player (TheirShips) HERES WHERE THE PROBLEM IS!!!!

        print 'Where do you want to attack?'
        p[i][0][0].showGrid() #Show the grid of the player (AttackShips)

        hits = p[i][0][0].getHitList()
        alreadyMade = False
        while alreadyMade == False:
            coords = p[i][0][0].chooseMove()
            alreadyMade = p[i][1].addMove(coords) #Returns true if move accepted, otherwise false

        lastMove = p[i][1].getMove()
        print 'The move you made was %s' % (lastMove)
        p[i][2].Send(lastMove)
        changeCoords = p[i][2].Check()
        p[i][0][0].changeRow('B')

        for p in playersCheck: #Check every player who is not you. You were deleted at teh beginning.
            checkForSunk(shipPosAll[p], hits)
            print 'Current Attacked Players shipPos: %s' % (shipPosAll[p])
        #p1Site.Send(coords)
        #print 'Thing %s' % (shipPos[i])
            if isGameOver(shipPosAll[p]): #PROBLEM.
                gameNotOver = False
                break

    for i in range(numOfPlayers):
        print p[i][1].getAllMoves()


print 'All Ships Sunk. The End. Wat more you want from mme its 3:48am'

Thanks

Here's the exact message I get.

Traceback (most recent call last): File "name/battleship_wClasses.py", line 431, in p[i][0][1].showGrid() #Show the grid of the player (TheirShips) TypeError: 'int' object is unsubscriptable –

Upvotes: 3

Views: 1405

Answers (1)

unutbu
unutbu

Reputation: 880369

You have two (overlapping) contradictory definitions for p:

p = [p1,p2]

and

    playersCheck = [0,1]
    for p in playersCheck:

p[i][0][1].showGrid() works with the first definition, but fails when p is assigned an integer value from the second definition.

Upvotes: 8

Related Questions