вспомогательная функция или инкапсуляция работает лучше? - PullRequest
0 голосов
/ 30 сентября 2018

этот код повторяется, поэтому я должен использовать вспомогательную функцию для вызова этой функции или инкапсулировать ее?

if exitcode==0:
   pygame.font.init()
   font = pygame.font.Font(None, 24)
   text = font.render("Accuracy: "+str(accuracy)+"%", True, (255,0,0))
   textRect = text.get_rect()
   textRect.centerx = screen.get_rect().centerx
   textRect.centery = screen.get_rect().centery+24
   screen.blit(gameover, (0,0))
   screen.blit(text, textRect)
else:
   pygame.font.init()
   font = pygame.font.Font(None, 24)
   text = font.render("Accuracy: "+str(accuracy)+"%", True, (0,255,0))
   textRect = text.get_rect()
   textRect.centerx = screen.get_rect().centerx
   textRect.centery = screen.get_rect().centery+24
   screen.blit(youwin, (0,0))
   screen.blit(text, textRect)

Единственное отличие - вторая последняя строка оператора if-else, screen.blit(youwin / youlose, (0,0))text = font.render("Accuracy: "+str(accuracy)+"%", True, (0,255,0) / (255,0,0))

Это то, что я сделал с помощью вспомогательной функции, но она не запустится:

if exitcode==0:
   initialize_game()
   text = font.render("Accuracy: "+str(accuracy)+"%", True, (255,0,0))
   produce_text_on_screen()
else:
   initialize_game()
   text = font.render("Accuracy: "+str(accuracy)+"%", True, (0,255,0))
   produce_text_on_screen()

def initialize_game():
    pygame.font.init()
    font = pygame.font.Font(None, 24)

def produce_text_on_screen():
   textRect = text.get_rect()
   textRect.centerx = screen.get_rect().centerx
   textRect.centery = screen.get_rect().centery+24
   screen.blit(gameover, (0,0))
   screen.blit(text, textRect)

NameError: имя 'initialize_game' не определено.Некоторая помощь была бы великолепна, спасибо !!

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Вы можете использовать троичный оператор (value1 if condition else value2):

result = gameover if exitcode == 0 else youwin
color = (255, 0, 0) if exitcode == 0 else (0, 255, 0)

pygame.font.init()
font = pygame.font.Font(None,  24)
text = font.render("Accuracy: " + str(accuracy) + "%",  True,  color)
textRect = text.get_rect()
textRect.centerx = screen.get_rect().centerx
textRect.centery = screen.get_rect().centery + 24
screen.blit(result,  (0, 0))
screen.blit(text,  textRect)

Конечно, создание функции никогда не является плохой идеей.

def show_final_screen(result, color, accuracy):
    # ...

if exitcode == 0:
    show_final_screen(gameover, (255, 0, 0), accuracy)
else
    show_final_screen(youwin, (0, 255, 0), accuracy)
0 голосов
/ 30 сентября 2018

В Python порядок определений функций имеет значение.Под капотом def - это просто назначение, которое присваивается имени функции при выполнении.Это означает, что определения функций должны предшествовать их использованию:

def initialize_game():
   pygame.font.init()
   font = pygame.font.Font(None, 24)

def produce_text_on_screen():
   textRect = text.get_rect()
   textRect.centerx = screen.get_rect().centerx
   textRect.centery = screen.get_rect().centery+24
   screen.blit(gameover, (0,0))
   screen.blit(text, textRect)

if exitcode==0:
   initialize_game()
   text = font.render("Accuracy: "+str(accuracy)+"%", True, (255,0,0))
   produce_text_on_screen()
else:
   initialize_game()
   text = font.render("Accuracy: "+str(accuracy)+"%", True, (0,255,0))
   produce_text_on_screen()

Или, точнее, определения не всегда должны стоять на первом месте в исходном коде, они просто должны выполняться сначала, чтобы имя определялось при его использовании.

...