Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python错误:';int';对象不可下标_Python_Python 3.x_Pygame - Fatal编程技术网

python错误:';int';对象不可下标

python错误:';int';对象不可下标,python,python-3.x,pygame,Python,Python 3.x,Pygame,我对这一切都不熟悉,我正试着做一个射击游戏。尝试运行代码后,我遇到一个错误TypeError:'int'对象不可下标: 第269行: collision=isCollision(enemyX[i],enemyY[i],knifeX,knifeY) 第118行: distance=math.sqrt((math.pow(enemyX[i]-knifeX,2))+(math.pow(enemyY[i]-knifeY,2))) 不只是在这里,如果我在循环中的每一个地方加上一个“i” import py

我对这一切都不熟悉,我正试着做一个射击游戏。尝试运行代码后,我遇到一个错误
TypeError:'int'对象不可下标

第269行:
collision=isCollision(enemyX[i],enemyY[i],knifeX,knifeY)

第118行:
distance=math.sqrt((math.pow(enemyX[i]-knifeX,2))+(math.pow(enemyY[i]-knifeY,2)))

不只是在这里,如果我在循环中的每一个地方加上一个“i”

import pygame
from pygame import mixer
mixer.init()
import random
import math

#Define some colors
BLACK = (0,0,0)
WHITE = (255,255,255)

#intialize the pygame
pygame.init()

#create the screen
screen = pygame.display.set_mode((700,583))



#Caption and icon
pygame.display.set_caption("Yoshi & the rise of mushroom ")
icon = pygame.image.load("Yoshi_icon.png")
pygame.display.set_icon(icon)

#Player
playerImg = pygame.image.load("YoshiMario.png")
playerX = 370
playerY = 480
playerX_change = 0
playerY_change = 0

#Enemy
enemyImg = [] 
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies = 10

for i in range(num_of_enemies):
    enemyImg.append(pygame.image.load('msh1.png'))
    enemyImg.append(pygame.image.load('msh2.png'))
    enemyX.append(random.randint(0,583))
    enemyY.append(random.randint(50,150))
    enemyX_change.append(2)
    enemyY_change.append(20)


#Knife

# ready - you cant see the knife on the screen
# fire - the knife is currently moving

knifeImg = pygame.image.load('diamondsword3.png')
knifeX = 0
knifeY = 480
knifeX_change = 0
knifeY_change = 10
knife_state = "ready"

#Score

score_value = 0
font = pygame.font.Font('freesansbold.ttf',28)

testX = 10
testY = 10

#Game Over Text
over_font = pygame.font.Font('freesansbold.ttf',64)

def show_score(x,y):
    score = font.render("Score : "+ str(score_value),True,(255,255,255))
    screen.blit(score, (x, y))

def game_over_text():
    over_text = over_font.render("GAME OVER",True,(255,255,255))
    screen.blit(over_text, (150, 250))
    
def player(x,y):
    screen.blit(playerImg, (x, y))

def enemy(x,y,i):
    screen.blit(enemyImg[i], (x, y))

def fire_knife( x, y ):
    """ Start a knife flying upwards from the player """
    global knife_state, knifeX, knifeY
    knifeX = x + 16
    knifeY = y + 10
    knife_state = "fire"

def knife_hits( enemyX, enemyY ):
    """ Return True if the knife hits the enemy at the given (x,y).
        If so, prepare the knife for firing again. """
    global knife_state, knifeX, knifeY
    collision_result = False
    if ( knife_state == "fire" and isCollision( enemyX[i], enemyY[i], knifeX, knifeY ) ):
        knife_state = "ready"
        collision_result = True
    return collision_result

def draw_knife( screen ):
    """ If the knife is flying, draw it to the screen """
    global knife_state, knifeImg, knifeX, knifeY
    if ( knife_state == "fire" ):
        screen.blit( knifeImg, ( knifeX, knifeY ) )

def update_knife():
    """ Make any knife fly up the screen, resetting at the top """
    global knife_state, knifeX, knifeY, knifeY_change
    # if the knife is already flying, move it
    if ( knife_state == "fire" ):
        knifeY -= knifeY_change
        if ( knifeY <= 0 ):
            knife_state = "ready"   # went off-screen
        
def isCollision(enemyX,enemyY,knifeX,knifeY):
    distance = math.sqrt((math.pow(enemyX[i] - knifeX,2)) + (math.pow(enemyY[i] - knifeY,2)))
    if distance < 27:
        return True
    else:
        return False

#used to manage how fast the screen updates
clock = pygame.time.Clock()
font = pygame.font.Font(None,28)

frame_count = 0
frame_rate = 60
start_time = 90

#game loop
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

     

    #if keystroke is pressed check whether its right or left
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            playerX_change = -2
        if event.key == pygame.K_RIGHT:
           playerX_change = 2
        if event.key == pygame.K_UP:
           playerY_change = -2
        if event.key == pygame.K_DOWN:
           playerY_change = 2
        if event.key == pygame.K_SPACE:
            if knife_state is "ready":
                knife_Sound = mixer.Sound("knife_hitwall1.wav")
                knife_Sound.play()
                # get the current x coordinate of yoshi
                knifeX = playerX
                fire_knife(playerX,playerY)
    
    if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change = 0
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                playerY_change = 0

    ## -- Timer going up --
    #Calculate total seconds
    total_seconds = frame_count // frame_rate

    #divide by 60 to get total minures
    minutes = total_seconds // 60

    #use modulus (remainder) to get seconds
    seconds = total_seconds % 60

    #use python string formatting to format in leading zeros
    output_string = "Time : {0:02}:{1:02}".format(minutes, seconds)

    # Blit to the screen
    text = font.render(output_string, True, (255,255,255))
    screen.blit(text, [10,40])
 
    # --- Timer going down ---
    # --- Timer going up ---
    # Calculate total seconds
    total_seconds = start_time - (frame_count // frame_rate)
    if total_seconds < 0:
        total_seconds = 0
 
    # Divide by 60 to get total minutes
    minutes = total_seconds // 60
 
    # Use modulus (remainder) to get seconds
    seconds = total_seconds % 60
 
    # Use python string formatting to format in leading zeros
    output_string = "Time left: {0:02}:{1:02}".format(minutes, seconds)
 
    # Blit to the screen
    text = font.render(output_string, True,(255,255,255))
 
    screen.blit(text, [10,70])
 
    # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT
    frame_count += 1
 
    # Limit frames per second
    clock.tick(frame_rate)
 
    # Go ahead and update the screen with what we've drawn.
    pygame.display.flip()
            
    # RGB - Red, Green, Blue
    screen.fill((0, 255, 0))
    
    #add a wallpaper
    bgimage=pygame.image.load("Background.png")
    screen.blit(bgimage, (0, 0))

    
    # 5 = 5 + -0.1 ->5 = 5 - 0.1
    # 5 = 5 + 0.1

    # checking for boundaries of yoshi/mushroom so it doesnt go out of bounds
    playerX += playerX_change
    if playerX < 0:
        playerX = 0
    elif playerX > 645:
        playerX = 645

    playerY += playerY_change    
    if playerY < 0:
        playerY = 0
    elif playerY > 500:
        playerY = 500

    # enemy movement
    for i in range(num_of_enemies):
        
        #Game Over
        if enemyY[i]> 440:
            for j in range(num_of_enemies):
                enemyY[j] = 2000
            game_over_text()
            break
        
        enemyX[i] += enemyX_change[i]
        if enemyX[i] <= 0:
            enemyX_change[i] = 2
            enemyY[i] += enemyY_change[i]
        elif enemyX[i] > 645:
            enemyX_change[i] = -2
            enemyY[i] += enemyY_change[i]

        update_knife()                         # move the flying knife (if any)

        if ( knife_hits( enemyX[i], enemyY[i] ) ):   
            score_value += 1
            print(score_value)
            enemyX[i] = random.randint(0,735)
            enemyY[i] = random.randint(50,150)
        else:
            draw_knife( screen )               # paint the flying knife (if any)
        
        player(playerX,playerY)
        enemy(enemyX[i],enemyY[i],i)
        pygame.display.update() 

        # collision
        collision = isCollision(enemyX[i],enemyY[i],knifeX,knifeY)
        if collision:
            pop_Sound = mixer.Sound('pop.wav')
            pop_Sound.play()
            knifeY = 480
            knife_state = "ready"
            score_value += 1
            
            enemyX[i] = random.randint(0,735)
            enemyY[i] = random.randint(50,150)

        enemy(enemyX[i],enemyY[i],i)
        

    # knife movement
    if knifeY <= 0:
        knifeY = 480
        knife_state = "ready"
        
    if knife_state == "fire":
        fire_knife(knifeX,knifeY)
        knifeY -= knifeY_change
        
    playerX += playerX_change
    playerY += playerY_change
    player(playerX,playerY)
    show_score(testX,testY)
    pygame.display.update()

    
导入pygame
从pygame导入混合器
mixer.init()
随机输入
输入数学
#定义一些颜色
黑色=(0,0,0)
白色=(255255)
#初始化游戏
pygame.init()
#创建屏幕
screen=pygame.display.set_模式((700583))
#标题和图标
pygame.display.set_标题(“Yoshi&蘑菇的崛起”)
icon=pygame.image.load(“Yoshi_icon.png”)
pygame.display.set_图标(图标)
#玩家
playerImg=pygame.image.load(“YoshiMario.png”)
playerX=370
playerY=480
playerX_change=0
playerY_change=0
#敌人
enemyImg=[]
灌肠剂=[]
Enemy=[]
enemyX_change=[]
Enemy_change=[]
敌人的数量=10
对于范围内的i(敌人的数量):
enemyImg.append(pygame.image.load('msh1.png'))
enemyImg.append(pygame.image.load('msh2.png'))
enemyX.append(random.randint(0583))
enemyY.append(random.randint(50150))
enemyX_变更追加(2)
Enemy_变更追加(20)
#刀
#准备就绪-您无法在屏幕上看到刀
#开火-刀正在移动
knifeImg=pygame.image.load('diamondsword3.png')
knifeX=0
刀子=480
刀形变化=0
换刀=10
刀具状态=“就绪”
#得分
分值=0
font=pygame.font.font('freesansbold.ttf',28)
testX=10
暴躁=10
#文字游戏
over_font=pygame.font.font('freesansbold.ttf',64)
def显示_分数(x,y):
score=font.render(“score:+str(score_值),True,(255255))
屏幕blit(分数,(x,y))
def game_over_text():
over_text=over_font.render(“游戏结束”,True,(255255))
屏幕。blit(超过文本(150250))
def播放器(x,y):
屏幕光点(playerImg,(x,y))
def敌人(x,y,i):
screen.blit(enemyImg[i],(x,y))
def灭火刀(x,y):
“启动一把刀从播放器向上飞”
全球刀州,刀州,刀州
刀x=x+16
刀子y=y+10
刀状态=“火”
def刀击(灌肠、灌肠):
“”“如果刀在给定(x,y)处击中敌人,则返回True。”。
如果是这样,准备好刀以便再次开火
全球刀州,刀州,刀州
碰撞结果=错误
如果(刀的状态==“开火”并合并(enemyX[i],enemyY[i],knifeX,knifeY)):
刀具状态=“就绪”
碰撞结果=真
返回碰撞结果
def牵引刀(屏幕):
“”“如果刀在飞,请将其拖到屏幕上”“”
全球刀州,刀州,刀州,刀州
如果(刀_状态==“火”):
屏幕。blit(knifeImg,(knifeX,knifeY))
def更新_刀():
“”“使任何刀具飞上屏幕,在顶部重置”“”
全球刀锋状态,刀锋,刀锋,刀锋变化
#如果刀已经在飞,移动它
如果(刀_状态==“火”):
刀子-=刀子的变化

如果(knifeY您使用
enemyX[i]
调用
isCollision()
,但是在
isCollision
中,您尝试访问
enemyX[i]
。因此您尝试执行
enemyX[i][i]
。但是由于
enemyX[i]
是一个整数,因此尝试获取它的下标,
[i]
,无效,因此会出现该错误。

您在调用函数
isCollision
时进行订阅:

if(刀的状态==“开火”并合并(enemyX[i],enemyY[i],knifeX,knifeY)):
因此,您必须删除函数中的订阅:

distance=math.sqrt((math.pow(enemyX[i]-knifeX,2))+(math.pow(enemyY[i]-knifeY,2)))

def isCollision(灌肠、灌肠、刀子、刀子):
距离=math.sqrt((math.pow(enemyX-knifeX,2))+(math.pow(enemyY-knifeY,2)))
如果距离小于27:
返回真值
其他:
返回错误

当您调用
isCollision(enemyX[i],…)
时,您已经发送了特定的号码,例如
enemyX[i]
。在该函数中,您可以使用传递的参数(您也碰巧调用了
enemyX
,它只是与调用方的
enemyX
不同)本身,例如
math.pow(enemyX-…
。我建议重新考虑这些变量名。

检查这些变量的类型,它们可能是
int
s,因此不可订阅。我发现抛出一些打印语句来检查存在此类问题的变量通常有助于了解发生了什么。如你所说。我将“I”的位置加倍for循环,因为我从外面调用它,也把它放在里面。所以我试着出错看看哪个是好的。谢谢