python - 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() ```
解决方案
您将snake
对象创建为
snake((0, 170, 0), 10)
在snake.__init__
函数内部,您创建一个cube
对象为
cube(pos)
您传递给函数pos
的值在哪里。确实是一个对象,您不能将其用作列表、元组或字典(它不可下标)。10
snake.__init__
10
int
推荐阅读
- keras - Keras:层可训练集错误不起作用
- javascript - Reactjs - 如何在视口中心显示网格
- reactjs - 通过 POST Axios 和 React-Final-Form 向数据库提交 CSV 文件的问题
- oracle - 创建过程以通过 max(date) 自动从另一个表插入
- reactjs - 如何在 useEffect Hook 中重新渲染组件
- r - 从 caret::train 获取预测的置信区间
- list - haskell 中的值构造函数
- unit-testing - 运行 Jest 测试永远循环
- flutter - 如何在 Flutter 中定位这张卡片和文字?
- c# - DirectoryEntry 和 ActiveDirectorySecurity 的授权问题