По сути, я работаю над проектом AI, и я пытаюсь создать цикл, который делает это, пока одна координата <= другой координате, и я определил функцию, но когда я пытаюсь ее вызвать, у нее есть эта ошибка
Traceback (most recent call last):
File "not important", line 66, in
A()
NameError: name 'A' is not defined
и если я попытаюсь переупорядочить определение, он столкнется с проблемой переменной, исправленной путем размещения там, где она есть.
Вот мой код (обратите внимание, что я использую pygame для фактического интерфейса)
import pygame as pg
import math
import time
import random
#starts pygame/create window
pg.init()
screen = pg.display.set_mode((800,600))
pg.display.set_caption("AI ALG")
clock = pg.time.Clock()
#Presets
KillerX = 50
KillerY = 50
EnemyX = 375
EnemyY = 275
gray = (255,255,255)
font = pg.font.Font(None, 32)
TICKSPASSED = 0
font_color = (100, 200, 150)
killertexture = pg.Surface((25,25))
killertexture.fill((0, 255, 0))
enemytexture = pg.Surface((25,25))
enemytexture.fill((255, 0, 0))
startAI = False
#main loop
runing = True
while runing:
ticktxt = font.render(str(TICKSPASSED), True, font_color)
activetxt = font.render(str(startAI), True, font_color)
COO1 = font.render(str(KillerX), True, font_color)
clock.tick(60)
keys = pg.key.get_pressed()
#events
if keys[pg.K_SPACE]:
startAI = True
TICKSPASSED += 1
for event in pg.event.get():
#if event.type == pg.QUIT:
#runing = False
if event.type == pg.QUIT:
runing = False
#update
#render
screen.fill(gray)
screen.blit(ticktxt, ((8,8), (8,8)))
screen.blit(activetxt, ((730,8), (792,8)))
screen.blit(COO1, ((730,8), (792,8)))
screen.blit(killertexture, (KillerX,KillerY))
screen.blit(enemytexture, (EnemyX,EnemyY))
A()
pg.display.flip()
def A():
if not KillerX <= EnemyX:
KillerX =- .5
pg.quit()
Любая помощь была бы потрясающей, спасибо
также извините, если мой код запутан :)
Вы должны определить A
до того, как на него будет ссылаться. Переместите определение A
перед циклом while
, в котором вызывается A
, и ошибка исчезнет.
Обратите внимание, что вы также должны либо объявить KillerX
и EnemyX
как глобальные переменные в функции A
, либо сделать их параметрами для A
и заставить A
возвращать измененный KillerX
.
Код, который вы выполняете, является встроенным, а не функцией, поэтому он запускается, как только он встречается в файле, то есть до того, как он увидит определение функции A
. Вы можете переместить определение A
до точки, прежде чем на него будет сделана ссылка, или вы можете поместить свой основной код в функцию, которую вы вызываете в конце файла. Просто нужно увидеть определение A
, прежде чем пытаться его вызвать.