2013-03-25 54 views
1

我正在实施一个简单版本的Hangman作为初学者。PyGame - 无法使用blit()调用屏幕上提供的文本

在我的代码中,在for循环(for event in pygame.event.get():)中创建的所有文本消息都不显示在屏幕上。然而,人们可以看到,他们眨了一下,他们应该在那里,但他们从来没有完全出现。

bif = "bg.jpg" 

import pygame, sys, time 
from pygame.locals import * 

pygame.init() 

screen_widht = 600 
screen_height = 300 
user_guess = '' 
word = "fuzzy" 
guesses = 3 
hidden_word = '-'*(len(word)) 
list_of_indexes = [] 
valid_letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',  'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 

screen = pygame.display.set_mode((screen_widht, screen_height), 0, 32) 
background = pygame.image.load(bif).convert() 
font = pygame.font.Font(None, 20) 
text_color = (10, 10, 10) 


def find_indexes(s, ch): 
    global list_of_indexes 
    list_of_indexes = [i for i, ltr in enumerate(s) if ltr == ch] 



while True: 

    screen.blit(background, (0, 0)) 

    y = 10 
    msg1 = font.render("Welcome to Hangman!", 1, text_color) 
    screen.blit(msg1, (10, y)) 
    y += 20 
    msg2 = font.render("The word now looks like this: " + hidden_word, 1, text_color) 
    screen.blit(msg2, (10, y)) 
    y += 20 
    msg3 = font.render("You have " + str(guesses) + " guesses left", 1, text_color) 
    screen.blit(msg3, (10, y)) 
    y += 20 
    if guesses > 0 and '-' in hidden_word: 
     msg4 = font.render("Input your guess", 1, text_color) 
     screen.blit(msg4, (10, y)) 


    for event in pygame.event.get(): #there is the loop which does not blit messages on the screen 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
     if event.type == KEYUP: 
      key = event.key 
      user_guess = chr(key)  
      if user_guess not in valid_letters: 
       msg5 = font.render("Input valid guess", 1, text_color) 
       screen.blit(msg5, (10, 90)) 
      else: 
       msg7 = font.render("Your guess is " + user_guess, 1, text_color) 
       screen.blit(msg7, (10, 90)) 
     if event.type == KEYUP and user_guess not in word and guesses > 0: 
      guesses -= 1 
     if user_guess not in word: 
      msg8 = font.render("There are no " + user_guess + "`s in this word", 1, text_color) 
      screen.blit(msg8, (10, 110))  
     else: 
      msg6 = font.render("Your guess is correct", 1, text_color) 
      screen.blit(msg6, (10, 110)) 
      find_indexes(word, user_guess) 
      while len(list_of_indexes) > 0: 
       for ind in list_of_indexes: 
        hidden_word = hidden_word[:ind] + user_guess + hidden_word[ind+1:] 
        list_of_indexes.remove(ind) 


    if guesses == 0 and '-' in hidden_word: 
     msg9 = font.render("You are completely hung", 1, text_color) 
     screen.blit(msg9, (10, 130)) 

    if not '-' in hidden_word: 
     msg10 = font.render("You guessed the word", 1, text_color) 
     screen.blit(msg10, (10, 130)) 



    pygame.display.update() 

time.sleep(0.03) 
+0

正如一个侧面说明,它看起来好像你的睡眠声明是在while语句之外。我也建议改变睡眠命令到你的未来游戏pygame时钟模块:http://www.pygame.org/docs/ref/time.html – jakebird451 2013-03-28 00:50:34

回答

1

if - 阻塞

if user_guess not in word: 
    msg8 = font.render("There are no " + user_guess + "`s in this word", 1, text_color) 
    screen.blit(msg8, (10, 110))  
else: 
    msg6 = font.render("Your guess is correct", 1, text_color) 
    screen.blit(msg6, (10, 110)) 
    find_indexes(word, user_guess) 
    while len(list_of_indexes) > 0: 
     for ind in list_of_indexes: 
      hidden_word = hidden_word[:ind] + user_guess + hidden_word[ind+1:] 
      list_of_indexes.remove(ind) 

是你的事件处理循环(for event in pygame.event.get():),这是不对的一部分。

这是缩进一个TAB远。否则,如果事件队列中有事件,则只绘制文本

+0

谢谢,给了我一个正确的方向看好。我仍然不明白的是,为什么这些文本行是闪烁的,并且正在消失......我想这与一分钟画几次画面有关,但是有没有关于那个地方的更深刻的信息? – Nadia 2013-03-25 12:04:15

+0

你在找什么信息?您只需在事件队列中存在事件的情况下绘制文本。然后,在循环的下一次迭代中,屏幕完全重新绘制,并且当没有事件时,您不需要绘制文本。 – sloth 2013-03-25 12:09:09

+0

谢谢,刚开始有点困惑 – Nadia 2013-03-25 13:18:16

0

你的问题是你在for循环中blit消息图像。循环的事件是一个循环,它处理pygame中的所有事件,如单击屏幕或移动光标。因此,当pygame事件发生时,您的消息只会传送到屏幕上。你可以通过在里面创建带有金币的变量来解决这个问题。例如:

A=False 
if user_guess not in valid_letters: 
    A=True 

的代码中的循环低了下去,你可以写之外:

if A == True: 
    msg5 = font.render("Input valid guess", 1, text_color) 
    screen.blit(msg5, (10, 90)) 

这是做它的一种方式。这可能是一种更有效的方法,但如果您希望它保留在屏幕上,则无法在事件循环中提取某些内容。