首页 > 解决方案 > i = self.pos[0] 说 TypeError: 'int' object is not subscriptable,我的代码的第 18 行和第 19 行

问题描述

我正在尝试通过跟随 Tech 与 Tim 发布的视频来使用 pygame 构建一个蛇游戏。我在视频的第 3 部分,我不知道我说它不适合他时它是不可订阅的。

class cube(object):

    rows = 20
    w = 500
    def __init__(self, start, dirnx=1, dirny=0, color=(255, 0, 0)):
        self.pos = start
        self.dirnx = 1
        self.dirny = 0
        self.color = color

    def move(self, dirnx, dirny):
        self.dirnx = dirnx
        self.dirny = dirny
        self.pos(self.pos[0] + self.dirnx, self.pos[1] + self.dirny)

    def draw(self, surface, eyes=False):
        dis = self.w // self.rows
        i = self.pos[0]
        j = self.pos
        pygame.draw.rect(surface, self.color, (self.pos[0]*dis+1, self.pos[0]*dis+1, dis -2, dis -2) )
        if eyes:
            centre = dis // 2
            radius = 3
            circleMiddle = (i*dis+centre-radius, j*dis+8)
            circleMiddle2 = (i*dis+dis - radius*2, j*dis+8)
            pygame.draw.rect(surface, (0, 0, 0), circleMiddle)
            pygame.draw.rect(surface, (0, 0, 0,), circleMiddle2)

这是我遇到问题的课程,如果这些信息还不够,这里是我到目前为止完成的完整代码,我真诚地希望有人能帮助我。


import math
import random
import pygame
import tkinter as tk
from tkinter import messagebox


class cube(object):
    rows = 20
    w = 500
    def __init__(self, start, dirnx=1, dirny=0, color=(255, 0, 0)):
        self.pos = start
        self.dirnx = 1
        self.dirny = 0
        self.color = color

    def move(self, dirnx, dirny):
        self.dirnx = dirnx
        self.dirny = dirny
        self.pos(self.pos[0] + self.dirnx, self.pos[1] + self.dirny)

    def draw(self, surface, eyes=False):
        dis = self.w // self.rows
        i = self.pos[0]
        j = self.pos
        pygame.draw.rect(surface, self.color, (self.pos[0]*dis+1, self.pos[0]*dis+1, dis -2, dis -2) )
        if eyes:
            centre = dis // 2
            radius = 3
            circleMiddle = (i*dis+centre-radius, j*dis+8)
            circleMiddle2 = (i*dis+dis - radius*2, j*dis+8)
            pygame.draw.rect(surface, (0, 0, 0), circleMiddle)
            pygame.draw.rect(surface, (0, 0, 0,), circleMiddle2)


class snake(object):
    body = []
    turns = {}
    def __init__(self, color, pos):
        self.color = color
        self.head = cube(pos)
        self.body.append(self.head)
        self.dirnx = 0
        self.dirny = 1

    def move(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()

        keys = pygame.key.get_pressed()

        for key in keys:
            if keys[pygame.K_LEFT]:
                self.dirnx == -1
                self.dirny = 0
                self.turns[self.head.pos[:]] == [self.dirnx, self.dirny]
            elif keys[pygame.K_RIGHT]:
                self.dirnx == 1
                self.dirny = 0
                self.turns[self.head.pos[:]] == [self.dirnx, self.dirny]
            elif keys[pygame.K_UP]:
                self.dirnx == 0
                self.dirny = -1
                self.turns[self.head.pos[:]] == [self.dirnx, self.dirny]
            elif keys[pygame.K_DOWN]:
                self.dirnx == 0
                self.dirny = 1
                self.turns[self.head.pos[:]] == [self.dirnx, self.dirny]

            for i, c in enumerate:
                p = c.pos[:]
                if p in self.turns:
                    turn = self.turns[p]
                    c.move[turn[1], turn[0]]
                if i == len(self.body) - 1:
                    self.turns.pop(p)

                else:
                    if c.dirnx == -1 and c.pos[0] <= 0:
                        c.pos == (c.rows -1,c.pos[1])
                    elif c.dirnx == 1 and c.pos[0] >= c.rows[-1]:
                        c.pos == (0, c.pos[1])
                    elif c.dirny == 1 and c.pos[1] >= c.rows[-1]:
                        c.pos == (c.rows[0],c.pos[0])
                    elif c.dirny == -1 and c.pos[1] <= 0:
                        c.pos == (c.pos[0], c.rows -1)
                    else:
                        c.move(c.dirnx, c.dirny)





    def reset(self, pos):
        pass

    def addCube(self):
        pass

    def draw(self, surface):
        for i, c in enumerate(self.body):
            if i == 0:
                c.draw(surface,True)
            else:
                c.draw(surface)


def drawGrid(w, rows, surface):
    sizeBtwn = w // rows
    x = 0
    y = 0
    for l in range(rows):
        x = x + sizeBtwn
        y = y + sizeBtwn

        pygame.draw.line(surface, (255, 255, 255), (x, 0), (x, w))
        pygame.draw.line(surface, (255, 255, 255), (0, y), (w, y))



def redrawWindow(surface):
    global rows, width, s
    surface.fill((0, 0, 0))
    s.draw(surface)
    drawGrid(width, rows, surface)
    pygame.display.update()


def randomSnack(rows, item):
    pass


def message_box(subject, content):
    pass


def main():
    global width, rows, s
    width = 500
    rows = 20
    win = pygame.display.set_mode((width, width))
    s = snake((0, 170, 0), 10)
    clock = pygame.time.Clock()
    flag = True

    while flag:
        pygame.event.get()
        pygame.time.delay(50) # lower this is the faster
        clock.tick(10) # lower this is the slower
        redrawWindow(win)




main() ```

标签: pythontypeerror

解决方案


您将snake对象创建为

snake((0, 170, 0), 10)

snake.__init__函数内部,您创建一个cube对象为

cube(pos)

您传递给函数pos的值在哪里。确实是一个对象,您不能将其用作列表、元组或字典(它不可下标)。10snake.__init__10int


推荐阅读