我试图分别拉动 1 和 2 的每个值的键,并在屏幕上绘制一个块。所以我构建了一个函数来查找给定列表中的破折号,以便我可以提取键中的第一个和第二个数字,然后计算它应该在哪里绘制块,但是当我运行它时,它给出了一条错误消息。>
import pygame
import time
import os
import random
pygame.init()
screen = pygame.display.set_mode((1350, 700))
pygame.display.set_caption("Tetris")
ticks = 0
seconds = 1
block_states = {}
for a in range(1, 11):
for b in range(1, 25):
block_states[str(a)+"-"+str(b)] = 0
block_states['1-1'] = 2
block_states['7-9'] = 2
block_states['8-2'] = 1
# 0 is empty, 1 is locked block, 2 is falling block
block_types = ["Line-block", "T-block", "S-block", "Z-block", "Square-block"]
up_next = []
def find_character_position(character_list, desired_character):
count = 0
for character in character_list():
if character == desired_character:
return character
count += 1
def find_key(dictionary, val):
count = 0
key_list = list(dictionary.keys())
results = []
for value in dictionary.values():
if value == val:
results.append(key_list[count])
count += 1
return results
def write_to_screen(text, red, green, blue, location_x, location_y):
font = pygame.font.SysFont(None, 24)
img = font.render(text, True, (red, green, blue))
screen.blit(img, (location_x, location_y))
def find_abs_path(file_name):
return str(os.getcwd()) + '/' + file_name
def write_instructions():
write_to_screen("A and D to move left and right.", 255, 255, 255, 20, 20)
write_to_screen("S for soft drop and W for hard drop.", 255, 255, 255, 20, 40)
write_to_screen("Q and E for counter-clockwise and clockwise rotation.", 255, 255, 255, 20, 60)
write_to_screen("Press C to hold.", 255, 255, 255, 20, 80)
write_to_screen("I to show instructions again.", 255, 255, 255, 20, 100)
write_to_screen("Esc to close the program", 255, 255, 255, 20, 120)
pygame.display.update()
time.sleep(10)
# Grid is 10 x 20 blocks
grid = pygame.image.load('tetris_grid.png')
block = pygame.image.load('block.png')
block = pygame.transform.scale(block, (32, 32))
square = pygame.image.load('square.png')
square = pygame.transform.scale(square, (32, 32))
screen.blit(grid, (525, 30))
origin_point = (x, y) = (527, 663.505984)
pygame.display.update()
write_instructions()
for i in range(0, 6):
up_next.append(block_types[random.randint(0, 4)])
while True:
new_keys = []
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
screen.fill((0, 0, 0))
screen.blit(grid, (525, 30))
keys = find_key(block_states, 2)
other_keys = find_key(block_states, 1)
if not keys == []:
locked_blocks_below = 0
for a in range(0, len(keys)):
current_key = list(keys[a])
key_position = find_character_position(current_key, "-")
if len(str(keys[a])) == 3:
second_number = int(current_key[2])
first_number = int(current_key[0])
elif len(str(keys[a])) == 4 and key_position == 1:
second_number = int(str(current_key[2]) + str(current_key[3]))
first_number = int(current_key[0])
elif len(str(keys[a])) == 4 and key_position == 2:
second_number = int(current_key[3])
first_number = int(str(current_key[0]) + str(current_key[1]))
else:
second_number = int(str(current_key[3]) + str(current_key[4]))
first_number = int(str(current_key[0]) + str(current_key[1]))
x_coordinate = x - ((first_number - 1) * 33.5)
y_coordinate = y - ((second_number - 1) * 33.5)
screen.blit(block, (x_coordinate, y_coordinate))
if not other_keys == []:
locked_blocks_below = 0
for a in range(0, len(other_keys)):
current_key = list(other_keys[a])
key_position = find_character_position(current_key, "-")
if len(str(other_keys[a])) == 3:
second_number = int(current_key[2])
first_number = int(current_key[0])
elif len(str(other_keys[a])) == 4 and key_position == 1:
second_number = int(str(current_key[2]) + str(current_key[3]))
first_number = int(current_key[0])
elif len(str(other_keys[a])) == 4 and key_position == 2:
second_number = int(current_key[3])
first_number = int(str(current_key[0]) + str(current_key[1]))
else:
second_number = int(str(current_key[3]) + str(current_key[4]))
first_number = int(str(current_key[0]) + str(current_key[1]))
x_coordinate = x - ((first_number - 1) * 33.5)
y_coordinate = y - ((second_number - 1) * 33.5)
screen.blit(square, (x_coordinate, y_coordinate))
pygame.display.update()
time.sleep(seconds)
ticks += 1
这是错误信息:
File "/home/jon/PycharmProjects/pythonProject2/Projects/Games/PseudoTetris/tetris_graphics.py", line 92, in <module>
key_position = find_character_position(current_key, "-")
File "/home/jon/PycharmProjects/pythonProject2/Projects/Games/PseudoTetris/tetris_graphics.py", line 25, in find_character_position
for character in character_list():
TypeError: 'list' object is not callable
Process finished with exit code 1
那为什么不能调用列表呢?
答案 0 :(得分:1)
鉴于 character_list
已经是可迭代的,你应该直接使用:
for character in character_list:
...
您不能调用该列表,因为该列表没有 __call__
方法。
答案 1 :(得分:0)
只需更改此行 for character in character_list():
。到for character in character_list:
():定义元组、操作顺序、生成器表达式、函数调用和其他语法。
示例:
character_list = [1,2,3] #list
for i in character_list:
print(i)