python - 尝试绘制角色时Pygame蛇游戏属性错误
问题描述
第 134 行我收到一个属性错误,我对 pygame 还很陌生,所以我相信这与我的论点有关,但我不确定。这是错误所在的行:
pygame.draw.rect(window.pygame.Color("RED"), pygame.Rect(int(foodpos[0]), int(foodpos[1]), 10, 10))
确切的错误是:
AttributeError: 'pygame.Surface' object has no attribute 'pygame'.
Traceback (most recent call last):
File "C:\Program Files (x86)\Thonny\lib\site-packages\thonny\backend.py", line 1744, in _trace
return self._trace_and_catch(frame, event, arg)
File "C:\Program Files (x86)\Thonny\lib\site-packages\thonny\backend.py", line 1819, in _trace_and_catch
assert last_custom_frame.event.startswith("before_")
AssertionError
Traceback (most recent call last):
File "D:\CS 20 School Projects\Daily Work.py", line 134, in <module>
pygame.draw.rect(window.pygame.Color("RED"), pygame.Rect(int(foodpos[0]), int(foodpos[1]), 10, 10))
AttributeError: 'pygame.Surface' object has no attribute 'pygame'"""
import pygame, sys, random, time
BLACK = (0, 0, 0)
WHITE = (225, 225, 225)
BLUE = (0, 0, 225)
RED = (225, 0, 0)
class Snake(object):
def __init__(self):
self.position = [100, 50] # sets initial position of the snake
self.body = [[100, 50], [90, 50], [80, 50]] # sets initial length of the snakes body to 3 segments
self.direction = "RIGHT"
self.change_direction_to = self.direction
# ---------------------------- Makes it possible to change directions but you cannot go directly backwards
def change_direction_to(self, dir):
if dir == "RIGHT" and not self.direction == "LEFT":
self.direction = "RIGHT"
elif dir == "LEFT" and not self.direction == "RIGHT":
self.direction = "LEFT"
elif dir == "UP" and not self.direction == "DOWN":
self.direction = "UP"
elif dir == "DOWN" and not self.direction == "UP":
self.direction = "DOWN"
# ----------------------------
# -------------------------------- Sets the speed of the snake
def move(self):
if self.direction == "RIGHT":
self.position[0] += 10
if self.direction == "LEFT":
self.position[0] -= 10
if self.direction == "UP":
self.position[0] += 10
if self.direction == "DOWN":
self.position[0] -= 10
# ---------------------------------
# ----------------------------- Checks if snake has ate food
self.body.insert(0, list(self.position))
if self.position == foodpos:
return 1
else:
self.body.pop()
return 0
# -----------------------------
# ---------------------------------checks if snake has hit a wall
def check_collision(self):
if self.position[0] > 490 or self.position < 0:
return 1
elif self.position[1] > 490 or self.position < 0:
return 1
# ----------------------------------
# ---------------------------checks if snake has hit itself
for body_part in self.body[1:]:
if self.position == body_part:
return 1
return 0
# ---------------------------
def get_head_position(self):
return self.position
def get_body(self):
return self.body
class FoodSpawner:
def __init__(self):
self.position = [random.randrange(1, 50) * 10], [random.randrange(1, 50) * 10]
self.is_food_on_screen = True
def spawn_food(self):
if not self.is_food_on_screen:
self.position = [random.randrange(1, 50) * 10], [random.randrange(1, 50) * 10]
self.is_food_on_screen = True
return self.position
def set_food_on_screen(self, b):
self.is_food_on_sceen = b
window = pygame.display.set_mode((700, 600))
pygame.display.set_caption("Definitely Not Snake")
fps = pygame.time.Clock()
score = 0
snake = Snake()
food_spawner = FoodSpawner()
def game_over():
pygame.quit()
sys.exit()
while True:
for event in pygame.event.get():
# ------------------------- quits the game
if event.type == pygame.QUIT:
game_over()
# -------------------------
# ------------------------- movement of the snake
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
snake.change_dir_to("RIGHT")
if event.key == pygame.K_LEFT:
snake.change_dir_to("LEFT")
if event.key == pygame.K_RIGHT:
snake.change_dir_to("UP")
if event.key == pygame.K_RIGHT:
snake.change_dir_to("DOWN")
# -------------------------
# ----------------------------- adds to score if the snake eats the food
foodpos = food_spawner.spawn_food()
if snake.move(foodpos) == 1:
score += 1
food_spawner.set_food_on_screen(False)
# ------------------------------
# ------------------------------ draws the screen, the snake, and its food
window.fill(pygame.Color("BLACK"))
for pos in snake.get_body():
pygame.draw.rect(window, pygame.Color("BLUE"), pygame.Rect(pos[0], pos[1], 10, 10))
pygame.draw.rect(window.pygame.Color("RED"), pygame.Rect(int(foodpos[0]), int(foodpos[1]), 10, 10))
# ------------------------------
if snake.check_collision() == 1:
game_over()
pygme.display.set_caption("Definitely not Snake | Score : " + str(score))
pygame.display.flip()
fps.tick(24)
解决方案
for pos in snake.get_body():
pygame.draw.rect(window,pygame.Color("BLUE"),pygame.Rect(pos[0],pos[1],10,10))
^
pygame.draw.rect(window.pygame.Color("RED"), pygame.Rect(int(foodpos[0]), int(foodpos[1]), 10, 10))
^
我相信有一个错字。由于您的蓝色绘图没有错误,因此应该是“window.pygame”错误。
推荐阅读
- python - 从用于数据转换的 Python 脚本转换为 BigQuery
- reactjs - 如何根据状态变量正确更新屏幕
- reactjs - 此表达式不可调用。键入'SpringRef <{滚动:数字;}>' 没有调用签名
- azure-machine-learning-service - ubuntu 18.04 中的 onnx 模型未运行
- c - 是否可以从 C 中的 C 宏定义中调用该函数
- javascript - 如何添加
餐桌后?(php/JS/wordpress)
- node.js - 使用 nack() 时更改消息顺序
- javascript - react js中分别状态和一起状态的区别
- kotlin - 需要帮助完成 kotlinlang 建议的练习,使用 javafx 支持 Webhooks
- python - 如果我的因变量和自变量是自相关的,有没有办法检查我的线性回归模型的准确性?