Tetris - AttributeError: 'list' object has no attribute 'y' - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Game Development (https://python-forum.io/forum-11.html) +--- Thread: Tetris - AttributeError: 'list' object has no attribute 'y' (/thread-16376.html) |
Tetris - AttributeError: 'list' object has no attribute 'y' - abscorpy - Feb-25-2019 Hi, im making a Tetris game and I got stucked the error showing on screen is the following:
import pygame import random pygame.font.init() #GLOBAL VARS s_width = 800 s_height = 700 play_width = 300 play_height = 600 block_size = 30 top_left_x = (s_width - play_width) top_left_y = s_height - play_height #SHAPE FORMATS S= [['.....', '.....', '..00.', '.00..', '.....', '.....'], ['.....', '..0..', '..00.', '...0.', '.....', '.....']] Z= [['.....', '.....' '.00..' '..00.' '.....' '.....']] I = [['..0..', '..0..', '..0..', '..0..', '..0..',], ['.....', '0000.', '.....', '.....', '.....',]] O = [['.....', '.....', '.00..', '.00..', '.....']] J = [['.....', '.0...', '.000.', '.....', '.....'], ['.....', '..00.', '..0..' '..0..', '.....'], ['.....', '.....', '.000.', '...0.', '.....'], ['.....', '..0..', '..0..' '.00..', '.....']] L = [['.....', '...0.', '.000.', '.....', '.....'], ['.....', '..0..', '..0..', '..00.', '.....'], ['.....', '.000.', '.0...', '.....', '.....'], ['.....', '.00..', '..0..', '..0..', '.....']] T = [['.....', '..0..', '.000.', '.....', '.....'], ['.....', '..0..', '..00.', '..0..', '.....'], ['.....', '.....', '.000.', '..0..', '.....'], ['.....', '..0..', '.00..', '..0..', '.....']] shapes = [S, Z, I, 0, J, L, T] shape_colors = [(0, 255, 0), (255, 0, 0), (0, 255, 255), (255, 255, 0), (255, 165, 0), (0, 0, 255), (120, 0, 120)] #index 0- 6 represent shape class piece (object): #* def __init__(self, x, y, shape): self.x = x self.y = y self.shape = shape self.color = shape_colors[shapes.index[shape]] self.rotation = 0 pass def create_grid(locked_pos = []): #* grid = [[(0, 0, 0) for _ in range(10)] for _ in range(20)] for i in range(len(grid)): for j in range(len(grid[i])): if (j, i) in locked_pos: c = locked_pos[(j, i)] grid[i][j] = c return grid def convert_shape_format(shape): positions = [] format = shape.shape[shape.rotation % len(shape.shape)] for i, line in enumerate (format): row = list(line) for j, column in enumerate(row): if column == '0': positions.append((shape.x + j, shape.y + i)) for i, pos in enumerate(positions): positions[i] = (pos[0] - 2, pos[1] - 4) return positions def valid_space(shape, grid): accepted_pos = [[(j , i) for j in range(10) if grid[i][j] == (0, 0, 0)] for i in range(20)] accepted_pos = [j for sub in accepted_pos for j in sub] formatted = convert_shape_format(shape) for pos in formatted: if pos not in accepted_pos: if pos [l] > - 1: return False return True def check_lost(): pass def get_shape(): return random.choice(shapes) def draw_text_middle(): pass def draw_grid(surface, grid): sx = top_left_x sy = top_left_y for i in range(len(grid)): pygame.draw.line(surface, (120, 120, 120), (sx, sy, + i*block_size), (sx+play_width, sy+ i*block_size)) for j in range(len(grid[i])): pygame.draw.line(surface, (120, 120, 120), (sx + j*block_size, sy), (sx+ j*block_size, sy + play_height)) def clear_rows(): inc = 0 for i in range(len(grid)-1, -1, -1): row = grid[i] if (0,0,0) not in row: inc += 1 ind = 1 for j in range (len(row)): try: del locked[(j, i)] except: continue def draw_next_shape(shape, surface): font = pygame.font.SysFont('comicsans', 30) label = font.render('Next Shape',1, (255, 255, 255)) sx = top_left_x + play_width + 50 sy = top_left_y + play_height/2 - 100 format = shape.shape[shape.rotation% len(shape.shape)] for i, line in enumerate(format): row = list(line) for j, column, in enumerate(row): if column == '0': pygame.draw.rect(surface, shape.color, (sx + j*10, sy + i*block_size, block_size), 0) surface.blit(label, (sx + 10, sy - 10)) def draw_window(surface, grid): #* surface.fill((0, 0, 0)) pygame.font.init() font = pygame.font.SysFont('comicsans', 60) label = font.render('Tetris', 1, (255, 255, 255)) surface.blit(label, (top_left_x + play_width / 2 - (label.get.width) / 2), 30) draw_grid(surface, grid) pygame.display.update() def main(win): #* locked_positions = [] grid = create_grid(locked_positions) change_piece = False run = True current_piece = get_shape() next_piece = get_shape() clock = pygame.time.Clock() fall_time = 0 fall_speed = 0.27 while run: grid = create_grid(locked_positions) fall_time += clock.get_rawtime() clock.tick() if fall_time/1000 > fall_speed: fall_time = 0 current_piece.y += 1 if not(valid_space(current_piece. grid)) and current_piece.y > 0: current_piece.y -= 1 change_piece = True for event in pygame.event.get(): if event.type == pygame.QUIT: run = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: current_piece.x -= 1 if not[valid_space(current_piece.grid)]: current_piece += 1 if event.key == pygame.K_RIGHT: current_piece.x += 1 if not[valid_space(current_piece.grid)]: current_piece -= 1 if event.key == pygame.K_DOWN: current_piece.y += 1 if not[valid_space(current_piece.grid)]: current_piece.y -= 1 if event.key == pygame.K_UP: current_piece.rotation += 1 if not[valid_space(current_piece.grid)]: current_piece -= 1 shape_pos = convert_shape_format(current_piece) for i in range(len(shape_pos)): x, y = shape_pos =[i] if y > -1: grid[y][x] = current_piece.color if change_piece: for pos in shape_pos: p = (pos[0], pos[1]) locked_positions[p] = current_piece.color current_piece = next_piece next_piece = get_shape() cange_piece = False draw_next_shape(next_piece, win) draw_window(win.grid) if check_lost(locked_positions): run = False pygame.display.quit() def main_menu(win): #* main(win) win = pygame.display.set_mode((s_width, s_height)) pygame.display.set_caption('Tetris') main_menu(win)If anyone can help i would really appreciate it, thanks a lot see u! RE: Tetris - Larz60+ - Feb-25-2019 shapes: shapes = [S, Z, I, 0, J, L, T] ... def get_shape(): return random.choice(shapes) ... current_piece = get_shape() ... # line 253 current_piece.y += 1current_piece is a simple list, you cannot add 1 to a list! you can however add 1 to current_piece[3] current_piece[3] += 1 # Or if y == index == 3 current_piece[y] += 1 RE: Tetris - Windspar - Feb-25-2019 Also you want change that zero to an O. shapes = [S, Z, I, 0, J, L, T]to shapes = [S, Z, I, O, J, L, T] RE: Tetris - Larz60+ - Feb-25-2019 But ... if you change the zero to an O, you will no longer be able to increment it. RE: Tetris - Windspar - Feb-26-2019 It looks like he was building a shape list and hit zero by mistake. He made a class that I don't see use on line 121. That what I think he trying to do. RE: Tetris - abscorpy - Feb-28-2019 Now i have the following error message with the same code:
RE: Tetris - Larz60+ - Feb-28-2019 you don't understand basic indexing of dictionaries and lists. Please read the following: Dictionaries: https://en.wikibooks.org/wiki/How_to_Think_Like_a_Computer_Scientist:_Learning_with_Python_2nd_Edition/Dictionaries Lists: https://en.wikibooks.org/wiki/How_to_Think_Like_a_Computer_Scientist:_Learning_with_Python_2nd_Edition/Lists#Lists |