from gasp import *
GRID_SIZE = 30
MARGIN = GRID_SIZE
BACKGROUND_COLOR = color.BLACK # Colors we use
WALL_COLOR = (0.6 * 255, 0.9 * 255, 0.9 * 255)
# The shape of the maze. Each character
# represents a different type of object
# % - Wall
# . - Food
# o - Capsule
# G - Ghost
# P - Chomp
# Other characters are ignored
the_layout = [
"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%",
"%.....%.................%.....%",
"%o%%%.%.%%%.%%%%%%%.%%%.%.%%%o%",
"%.%.....%......%......%.....%.%",
"%...%%%.%.%%%%.%.%%%%.%.%%%...%",
"%%%.%...%.%.........%.%...%.%%%",
"%...%.%%%.%.%%% %%%.%.%%%.%...%",
"%.%%%.......%GG GG%.......%%%.%",
"%...%.%%%.%.%%%%%%%.%.%%%.%...%",
"%%%.%...%.%.........%.%...%.%%%",
"%...%%%.%.%%%%.%.%%%%.%.%%%...%",
"%.%.....%......%......%.....%.%",
"%o%%%.%.%%%.%%%%%%%.%%%.%.%%%o%",
"%.....%........P........%.....%",
"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"]
class Immovable:
def is_a_wall(self):
return False
class Nothing(Immovable):
pass
class Maze:
def __init__(self):
self.have_window = False
self.game_over = False
self.set_layout(the_layout)
set_speed(20)
def set_layout(self, layout):
height = len(layout)
width = len(layout[0])
self.make_window(width, height)
self.make_map(width, height)
max_y = height - 1
for x in range( width ):
for y in range(height):
char = layout[max_y - y][x]
self.make_object((x, y), char)
def make_window(self, width, height):
grid_width = (width -1) * GRID_SIZE
grid_height = (height - 1) * GRID_SIZE
screen_width = 2 * MARGIN + grid_width
screen_height = 2 * MARGIN + grid_height
begin_graphics(screen_width, screen_height,"Chomp",BACKGROUND_COLOR)
def to_screen(self, point):
(x,y) = point
x = x * GRID_SIZE + MARGIN
y = y * GRID_SIZE + MARGIN
return(x,y)
def make_map(self, width, height):
self.width = width
self.height = height
self.map = []
for y in range(width):
new_row = []
for x in range(width):
new_row.append(Nothing())
self.map.append(new_row)
def make_object(self,point,charactor):
(x,y) = point
if charactor == "%":
self.map[y][x] = Wall(self,point)
def finished(self):
return self.game_over
def play(self):
update_when('next_tick')
def done(self):
end_graphics()
self.map = []
def object_at(self,point):
(x,y) = point
if y < 0 or y >= self.height:
return Nothing()
if x < 0 or x >= self.width:
return Nothing()
return self.map[y][x]
class Wall(Immovable):
def __init__(self, maze, point):
self.place = point # Store our position
self.screen_point = maze.to_screen(point)
self.maze = maze # Keep hold of Maze
self.draw()
def draw(self):
(screen_x, screen_y) = self.screen_point
dot_size = GRID_SIZE * 0.2
Circle(self.screen_point, dot_size,
color = WALL_COLOR, filled = 1)
(x, y) = self.place
neighbors = [ (x+1, y), (x-1, y)]
for neighbor in neighbors:
self.check_neighbor(neighbor)
def check_neighbor(self,neighbor):
maze = self.maze
object = maze.object_at(neighbor)
if object.is_a_wall():
here = self.screen_point
there = maze.to_screen(neighbor)
Line(here, there, color = WALL_COLOR,thickness = 2)
def is_a_wall(self):
return True
the_maze = Maze()
while not the_maze.finished():
the_maze.play()
the_maze.done()
我收到了这个错误..
Traceback (most recent call last):
File "chomp.py", line 110, in class Wall(Immovable):
File "chomp.py", line 124, in Wall for neighbor in neighbors:
NameError: name 'neighbors' is not defined
我花了很多时间仍然找不到什么问题,需要一些帮助
答案 0 :(得分:1)
对Circle()
的未完成调用可能是因为尝试正确格式化代码时出错。请检查您是否发布了实际运行的代码,并且回溯是您实际获得的代码(其中一些缺失了!)。
(可怕的格式化)回溯中报告的错误是行neighbors
中未定义for neighbor in neighbors:
。绝对没有办法让编译器在中间路线上勉强通过
(x, y) = self.place
neighbors = [ (x+1, y), (x-1, y)]
没有其他一些错误。
注意:以上内容是对我在回答时关闭的另一个问题的回应。我将其留下来,以便您知道您对该问题的建议是错误的。
我怀疑在您的FIRST question(width
未在行for x in range( width ):
中定义)之后,您没有修复所有缩进错误,以及Q2和Q3行{{1}应该将4个空格移动到它看起来的位置右侧。
您的源文件中是否有任何标签?如果是这样,请摆脱它们。如果你不确定如何保持无标签,请问一个单独的问题,说什么编辑器和什么操作系统以及熟悉该组合的人可以帮助你。
如何在源文件中找到标签:
for neighbor in neighbors:
答案 1 :(得分:1)
我没有立即看到错误的位置。您最近是否移动了文件,导致导入不是真正运行新代码,而是实际运行.pyc文件?例如,您最近是否引入了一个与python文件同名的包?
. \- main.py Has an "import stuff" \- stuff.py This is the code you think is being run. \- stuff \- __init__.py This code is being run.