2015-08-28 1 views
-1

Как вы конвертируете [x] [y] float обратно в целое число после преобразования Python 2.7 в 3.4, который отформатирован как поплавокПреобразование [x] [y] назад в целое число после преобразования Python 2.7 в 3.4

ex. self.table [x] [y] в целое число, чтобы получить значения x и y.

Ошибка я получаю

return self.table[x][y].physics_module 
TypeError: list indices must be integers, not float 

То, что я пытался

Я знаю метода обращенного (х) в целое, как этот междунар (х) или 5/3 в 5 // 3 и т. Д. Это работало на преобразование всех других времен в прошлом, я попал в проблему до сих пор. Была аналогичная проблема, но эти ответы не работают в этом случае TypeError: integer argument expected got float' Python 3.4 Что я пробовал эти методы, так как это был мой вопрос.

Я использую Python 3.4 с Pygame, которые не могут иметь значение для этого примера

То, что я пытаюсь сделать:

Цель состоит в том, чтобы преобразовать учебник в с Python 2.7 в Python 3.4 для понять это с помощью python 3.4. Я запустил 2to3.py, чтобы узнать, будет ли это работать.

участок кода, где проблема

def makeGround(self, xa, ya, xb, yb): 
     if (xa == xb): 
      for y in range(ya, yb + 1): 
       self.table[xa][y].makeGround() 
     elif (ya == yb): 
      for x in range(xa, xb + 1): 
       self.table[x][ya].makeGround() 

    def applyTileData(self, x, y, imageSequenceStack, passable, physics): 
     self.table[x][y].images = imageSequenceStack 
     self.table[x][y].passable = passable 
     self.table[x][y].physics_module = physics 

    def addPlatform(self, x, y, width): 
     self.platforms.append((x, y, width)) 

Bigger раздел упаковывают его необходимо

import pygame 
    from .Tile import * 


    class TileSet: 

    def __init__(self, width, height): 
     cols = list(range(width)) 
     for i in range(width): 
      cols[i] = list(range(height)) 
      for j in range(height): 
       cols[i][j] = Tile(i, j, False) 
     self.table = cols 
     self.platforms = [] 
     self.background_color = (0, 0, 0) 
     self.pixel_origin = (0, 0) 
     self.background = None 

    def setBackground(self, imageFile): 
     self.background = imageFile 

    def makeGround(self, xa, ya, xb, yb): 
     if (xa == xb): 
      for y in range(ya, yb + 1): 
       self.table[xa][y].makeGround() 
     elif (ya == yb): 
      for x in range(xa, xb + 1): 
       self.table[x][ya].makeGround() 

    def applyTileData(self, x, y, imageSequenceStack, passable, physics): 
     self.table[x][y].images = imageSequenceStack 
     self.table[x][y].passable = passable 
     self.table[x][y].physics_module = physics 

    def addPlatform(self, x, y, width): 
     self.platforms.append((x, y, width)) 

    def drawBackground(self, screen, topleft, frameNum): 
     screen.fill(self.background_color) 
     bg = self.background.getImageForFrame(frameNum) 
     width = len(self.table) * 32 
     height = len(self.table[0]) * 32 
     pic_width = bg.get_width() - 640 
     pic_height = bg.get_height() - 480 
     left = 0 
     top = 0 
     if pic_width > 0 and width > 0: 
      left = -1 * pic_width * topleft[0]/width 
     if pic_height > 0 and height > 0: 
      top = -1 * pic_height * topleft[1]/height 

     screen.blit(bg, (left, top)) 


    def drawBottom(self, screen, camera, frameNum): 
     top_left = self.fromPixelToTile(camera[0], camera[1]) 
     bottom_right = self.fromPixelToTile(camera[0] + 640, camera[1] + 480) 
     left = min(len(self.table) - 1, max(0, top_left[0])) 
     top = min(len(self.table[0]) - 1, max(0, top_left[1])) 
     right = min(len(self.table) - 1, max(0, bottom_right[0])) 
     bottom = min(len(self.table[0]) - 1, max(0, bottom_right[1])) 

     for x in range(left, right + 1): 
      for y in range(top, bottom + 1): 
       topleft = self.fromTileToPixel(x, y) 
       for imgSeq in self.table[x][y].images: 
        screen.blit(imgSeq.getImageForFrame(frameNum), (x * 32 - camera[0], y * 32 - camera[1])) 


    def fromTileToPixel(self, tile_x, tile_y): 
     x = 32 * (tile_x - self.pixel_origin[0]) 
     y = 32 * (tile_y - self.pixel_origin[1]) 
     return (x, y) 

    def fromPixelToTile(self, pixel_x, pixel_y): 
     x = (pixel_x/32) + self.pixel_origin[0] 
     y = (pixel_y/32) + self.pixel_origin[1] 
     return (x, y) 

    def nearbyTiles(self, coordinate, radius = 1, tileFilter = None): 
     tiles = [] 
     left = max(0, coordinate[0] - radius) 
     right = min(coordinate[0] + radius, len(self.table) - 1) 
     top = max(0, coordinate[1] - radius) 
     bottom = min(coordinate[1] + radius, len(self.table[0]) - 1) 
     for x in range(left, right + 1): 
      for y in range(top, bottom + 1): 
       tiles.append(self.table[x][y]) 

     if tileFilter: 
      return list(filter(tileFilter, tiles)) 
     return tiles 

    def getPhysicsModule(self, xy): 
     x = xy[0] 
     y = xy[1] 
     x = max(0, x) 
     x = min(x, len(self.table) - 1) 
     y = max(0, y) 
     y = min(y, len(self.table[0]) - 1) 
     return self.table[x][y].physics_module 

    def isTilePassable(self, xy): 
     x = xy[0] 
     y = xy[1] 
     x = max(0, x) 
     x = min(x, len(self.table) - 1) 
     y = max(0, y) 
     y = min(y, len(self.table[0]) - 1) 
     return self.table[x][y].passable 
+0

Трудно понять, что вы просите, потому что вы используете некоторые запутанные неопределенные термины («таблица», «плавающий стол»), но это звучит как вы просто хотите преобразовать float в целые числа. Как вы ожидаете, что это сработает? Вы хотите округлить или просто усечь? Почему 'int (x)' недостаточно для некоторого float 'x'? –

+0

Я преобразовал учебник, написанный на python 2.7, в 3.4. Я еще не совсем понял код. Но я понимаю, что проблема заключается в том, что [x] и [y] в python 3.4 преобразуются в float. Я попробовал self.table (int ([x] [y]). Изображения и т. Д., Но это не сработало или выглядело правильно. –

ответ

1

int([x][y]) является совершенно бессмысленным заявление. [] - оператор индексирования для получения элементов в определенной позиции в списке. Индексирование тонкого воздуха бессмысленно.

Для преобразования чисел с плавающей точкой индексации для отступа с int, вы должны сделать что-то вроде

self.table[int(x)][int(y)].images 

или любой другой код вы хотите. Вы конвертируете каждый номер с плавающей запятой в целое число в отдельности. Обратите внимание, что это усечение не округление: 2.99 станет 2.

+0

спасибо, я знал, что это выглядело неправильно .. но это легко запомнить в будущем. в обучающий питон. Я исправил их плюс 4 других документа в пакетах, в которых обнаружена связка более несвязанных ошибок, но я буду работать с ними. –