Builtins.AttributeError:'模块'对象没有属性'one_tile'

时间:2019-11-26 22:42:14

标签: python pygame attributeerror

嗨,我不断从下面的行中收到该错误消息

pygame.one_tile.blit(self.i_list[img_index], pos)

这是来自下面的功能

   def create_grid(self, grid_size):
      self.grid = [ ]

      tile_width = self.surface.get_width() / grid_size
      tile_height = self.surface.get_height() / grid_size

      # this for loop creates each row in our grid     
      for i in range(grid_size):
         one_row = [ ]
         img_index = 0
         for j in range(grid_size):
            y = i * tile_height
            x = j * tile_width
            pos = (x,y)
            one_tile = Tile(pos, tile_width, tile_height, self.surface) 
            pygame.one_tile.blit(self.i_list[img_index], pos)
            img_index += 1
            one_row.append(one_tile)
         self.grid.append(one_row)

我正在为内存游戏版本1(该游戏具有8对图像,并且您需要记住哪个图像在哪张卡上并匹配一对)编写代码,但我一直收到该错误消息,但是我没有; t真的不知道该怎么办。任何帮助将不胜感激。谢谢!! 我的完整代码是

import pygame, random


# User-defined functions

def main():
   # initialize all pygame modules (some need initialization)
   pygame.init()
   # create a pygame display window
   pygame.display.set_mode((500, 400))
   # set the title of the display window
   pygame.display.set_caption('A template for graphical games with two moving dots')   
   # get the display surface
   w_surface = pygame.display.get_surface() 
   # create a game object
   game = Game(w_surface)
   # start the main game loop by calling the play method on the game object
   game.play() 
   # quit pygame and clean up the pygame window
   pygame.quit() 


# User-defined classes

class Game:
   # An object in this class represents a complete game.

   def __init__(self, surface):
      # Initialize a Game.
      # - self is the Game to initialize
      # - surface is the display window surface object

      # === objects that are part of every game that we will discuss
      self.surface = surface
      self.bg_color = pygame.Color('black')

      self.FPS = 60
      self.game_Clock = pygame.time.Clock()
      self.close_clicked = False
      self.continue_game = True

      # === game specific objects
      self.max_frames = 150
      self.frame_counter = 0

      self.i_list = []
      self.images = ["image1.bmp", "image2.bmp", "image3.bmp", "image4.bmp", "image5.bmp", "image6.bmp", "image7.bmp", "image8.bmp"]
      for i in self.images:
         pygame.image.load(i)
         self.i_list.append(i)
         self.i_list.append(i)
      random.shuffle(self.i_list)

      self.create_grid(4)

   def create_grid(self, grid_size):
      self.grid = [ ]

      tile_width = self.surface.get_width() / grid_size
      tile_height = self.surface.get_height() / grid_size

      # this for loop creates each row in our grid     
      for i in range(grid_size):
         one_row = [ ]
         img_index = 0
         for j in range(grid_size):
            y = i * tile_height
            x = j * tile_width
            pos = (x,y)
            one_tile = Tile(pos, tile_width, tile_height, self.surface) 
            pygame.one_tile.blit(self.i_list[img_index], pos)
            img_index += 1
            one_row.append(one_tile)
         self.grid.append(one_row)

   def play(self):
      # Play the game until the player presses the close box.
      # - self is the Game that should be continued or not.

      while not self.close_clicked:  # until player clicks close box
         # play frame
         self.handle_events()
         self.draw()            
         if self.continue_game:
            self.update()
            self.decide_continue()
         self.game_Clock.tick(self.FPS) # run at most with FPS Frames Per Second 

   def handle_events(self):
      # Handle each user event by changing the game state appropriately.
      # - self is the Game whose events will be handled

      events = pygame.event.get()
      for event in events:
         if event.type == pygame.QUIT:
            self.close_clicked = True

   def draw(self):
      # Draw all game objects.
      # - self is the Game to draw

      self.surface.fill(self.bg_color) # clear the display surface first
      for row in self.grid:
         for tile in row:
            tile.draw()
      pygame.display.update() 

   def update(self):
      # Update the game objects for the next frame.
      # - self is the Game to update

      pass

   def decide_continue(self):
      # Check and remember if the game should continue
      # - self is the Game to check

      return True


class Tile:
       # A tile represents one location on a grid. Tiles hold content
   # (in this case, an X or an O).

   def __init__(self, screen_position, width, height, surface):
      # initialize one instance of our Tile class. Tiles represent
      # one 'position' in our tic-tac-toe board.
      #  - self: the tile being initialized
      #  - screen_position: the [x, y] coordinates to draw the tile at
      #  - surface: the surface on which to draw the tile
      #  - height: the height of the tile when it is drawn
      #  - width: the width of the tile when it is drawn
      self.screen_position = screen_position
      self.surface = surface
      self.content = ''
      self.height = height
      self.width = width



   def draw(self):
      # draw the contents of a tile to its surface. 
      tile_boundary = pygame.Rect(self.screen_position[0], 
                                  self.screen_position[1],
                                  self.width,
                                  self.height)
      pygame.draw.rect(self.surface, pygame.Color("white"), tile_boundary, 2)  



main()

1 个答案:

答案 0 :(得分:1)

我建议向类.image中添加一个.visible属性和一个Tile属性。每个图块都知道关联的图像,并具有一个状态(如果图块中的图像可见)

class Tile:
    # A tile represents one location on a grid. Tiles hold content
    # (in this case, an X or an O).

    def __init__(self, screen_position, width, height, surface, image):
        # initialize one instance of our Tile class. Tiles represent
        # one 'position' in our tic-tac-toe board.
        #  - self: the tile being initialized
        #  - screen_position: the [x, y] coordinates to draw the tile at
        #  - surface: the surface on which to draw the tile
        #  - height: the height of the tile when it is drawn
        #  - width: the width of the tile when it is drawn
        self.screen_position = screen_position
        self.surface = surface
        self.content = ''
        self.height = height
        self.width = width
        self.image = image
        self.visible = False

    def show(self, visible):
        self.visible = visible

    def draw(self):
        # draw the contents of a tile to its surface. 
        tile_boundary = pygame.Rect(self.screen_position[0], 
                                    self.screen_position[1],
                                    self.width,
                                    self.height)
        pygame.draw.rect(self.surface, pygame.Color("white"), tile_boundary, 2)  
        if self.visible:
            img_rect = self.image.get_rect(center = tile_boundary.center)
            self.surface.blit(self.image, img_rect.topleft)

要创建图像列表,您必须加载图像。 pygame.image.load的返回值是一个pygame.Surface对象,可以附加到i_list

self.i_list = []
self.images = ["image1.bmp", "image2.bmp", "image3.bmp", "image4.bmp", "image5.bmp", "image6.bmp", "image7.bmp", "image8.bmp"]
for imgname in self.images:
    img = pygame.image.load(imgname)
    self.i_list.append(img)
random.shuffle(self.i_list)

将图像传递给Tile的构造函数:

for i in range(grid_size):
    one_row = [ ]
    img_index = 0
    for j in range(grid_size):
        pos = (j * tile_width, i * tile_height)
        one_tile = Tile(pos, tile_width, tile_height, self.surface, self.i_list[img_index]) 
        img_index += 1
        one_row.append(one_tile)
    self.grid.append(one_row)

请注意,出于调试原因,您可以将所有图像的所有状态视为“可见”(self.visible = True的构造函数中的Tiles)。