Python中的For循环函数 [英] For Loop Functions in Python
问题描述
我正在继续执行Hangman项目,并且遇到了for循环和在其中执行函数的问题.例如,如果您按名为"CANADA"的级别,然后按"B",则由于加拿大没有B,因此它应画出the子手的第一行.这是我到目前为止所做的:
I am continuing with a Hangman project, and I have encountered a problem with a for loop and performing a function inside it. For example, if you press in a level named 'CANADA', and you press 'B', since there are no Bs in Canada, it should draw the first line of the Hangman. This is what I've done so far:
def hangman1():
pygame.draw.line(screen, black, (775, 250), (775, 50), (4))
def hangman2():
pygame.draw.line(screen, black, (750, 250), (800, 250), (4))
def hangman3():
pygame.draw.line(screen, black, (775, 50), (925, 50), (4))
def hangman4():
pygame.draw.line(screen, black, (925, 50), (925, 175), (4))
def hangman5():
pygame.draw.circle(screen, black, (925, 100), 30, (0))
def hangman6():
pygame.draw.line(screen, black, (925, 125), (925, 200), (4))
def hangman7():
pygame.draw.line(screen, black, (885, 160), (965, 160), (4))
def hangman8():
pygame.draw.line(screen, black, (925, 200), (900, 225), (4))
def hangman9():
pygame.draw.line(screen, black, (925, 200), (950, 225), (4))
再输入一些代码...
After a bit more code...
letters = list('abcdefghijklmnopqrstuvwxyz')
a = font2.render(str(letters[0]), True, (black))
b = font2.render(str(letters[1]), True, (black))
c = font2.render(str(letters[2]), True, (black))
d = font2.render(str(letters[3]), True, (black))
e = font2.render(str(letters[4]), True, (black))
f = font2.render(str(letters[5]), True, (black))
g = font2.render(str(letters[6]), True, (black))
h = font2.render(str(letters[7]), True, (black))
i = font2.render(str(letters[8]), True, (black))
j = font2.render(str(letters[9]), True, (black))
k = font2.render(str(letters[10]), True, (black))
l = font2.render(str(letters[11]), True, (black))
m = font2.render(str(letters[12]), True, (black))
n = font2.render(str(letters[13]), True, (black))
o = font2.render(str(letters[14]), True, (black))
p = font2.render(str(letters[15]), True, (black))
q = font2.render(str(letters[16]), True, (black))
r = font2.render(str(letters[17]), True, (black))
s = font2.render(str(letters[18]), True, (black))
t = font2.render(str(letters[19]), True, (black))
u = font2.render(str(letters[20]), True, (black))
v = font2.render(str(letters[21]), True, (black))
w = font2.render(str(letters[22]), True, (black))
x = font2.render(str(letters[23]), True, (black))
y = font2.render(str(letters[24]), True, (black))
z = font2.render(str(letters[25]), True, (black))
然后...
hangman = [hangman1, hangman2, hangman3, hangman4, hangman5, hangman6, hangman7, hangman8, hangman9]
for linebyline in hangman:
以后...
elif b1.collidepoint(pygame.mouse.get_pos()):
letter = letters[1]
check = country.count(letter)
if check >= 1:
if letter == letters[0]:
aPosition = 325, 235
a3 = screen.blit((a), (375, 235))
a4 = screen.blit((a), (425, 235))
a1.x, a1.y = -500, -500
elif letter == letters[2]:
cPosition = 300, 235
c1.x, c1.y = -500, -500
elif letter == letters[13]:
nPosition = 450, 235
n1.x, n1.y = -500, -500
elif letter == letters[3]:
dPosition = 600, 235
d1.x, d1.y = -500, -500
else:
b2 = font.render(str(letters[1]), True, (red))
screen.blit(b2, (485, 325))
linebyline()
time.sleep(0.5)
bPosition = -500, -500
b1.x, b1.y = -500, -500
当我按B时,它变成红色,并在0.5秒内消失,但是没有画线.有帮助吗?
When I press B, it turns red, and in 0.5 seconds it disappears, but it doesn't draw the line. Any help?
编辑:我对另一个模块进行了一些测试,并且该功能在打印普通文本时效果很好.但是,当我再次使用绘图(Pygame)对其进行测试时,它可以工作,但是当结合其他东西(例如time.sleep()
)时,它会显示白屏.与print
结合使用时,绘图功能无效,但打印功能有效.另外,如果我添加了time.sleep(1)
,则它将黑屏恰好9秒钟,而无需执行其他任何操作.这是我的测试代码:
I did some testing with another module, and the function thing works perfectly fine with printing normal text. But when I tested it again with drawing (Pygame), it worked, but when combined other things (like time.sleep()
), it shows a white screen. When combined with a print
the drawing thing doesn't work but the printing does. Also, if I added a time.sleep(1)
, it would have a black screen for exactly nine seconds, without doing anything else. This is my test code:
import pygame, sys, random, time
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((1000, 700))
pygame.display.set_caption("Hangman: Countries")
black = 0, 0, 0
def hangman1():
pygame.draw.line(screen, black, (775, 250), (775, 50), (4))
print 'test'
def hangman2():
pygame.draw.line(screen, black, (750, 250), (800, 250), (4))
print 'test somethin'
def hangman3():
pygame.draw.line(screen, black, (775, 50), (925, 50), (4))
print 'test something else'
def hangman4():
pygame.draw.line(screen, black, (925, 50), (925, 175), (4))
print 'eggs'
def hangman5():
pygame.draw.circle(screen, black, (925, 100), 30, (0))
print 'hangman'
def hangman6():
pygame.draw.line(screen, black, (925, 125), (925, 200), (4))
print 'facebook'
def hangman7():
pygame.draw.line(screen, black, (885, 160), (965, 160), (4))
print 'internet'
def hangman8():
pygame.draw.line(screen, black, (925, 200), (900, 225), (4))
print 'more tests'
def hangman9():
pygame.draw.line(screen, black, (925, 200), (950, 225), (4))
print 'cheese'
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
screen.fill((255, 255, 255))
list1 = [hangman1(), hangman2(), hangman3(), hangman4(), hangman5(), hangman6(), hangman7(), hangman8(), hangman9()]
for greet in list1:
greet
time.sleep(1)
pygame.display.flip()
它同时在外壳中打印一堆单词,然后在九秒钟后,屏幕变为完全绘制的the子手,然后再次出现相同的单词集.有什么想法,有谁在Pygame有经验吗?
It prints a bunch of words at the same time in the shell, and then after nine seconds the screen changes into the hangman fully drawn, and the same set of words come back on. Any ideas, anyone of you with experience at Pygame?
推荐答案
我刚刚制作了一个可运行的hangman程序.也许看一下这种逻辑会有所帮助:
I made a functioning hangman program just now. Perhaps looking at this logic will help:
忽略此:
#!/usr/bin/python
import string
alphabet = string.ascii_lowercase
# represents drawing routines
def hangman1():
print(1)
def hangman2():
print(2)
def hangman3():
print(3)
# ignore this, never do this:
def myprint(x): #python2 hack, unnecessary in python3
print(x)
for i in range(1,10):
globals()['hangman{}'.format(i)] = lambda i=i: myprint('bodypart#{}'.format(i))
# ignore this
class EnumItem(object):
def __init__(self, namespace, namespace_name, value):
self.namespace = namespace
self.namespace_name = namespace_name
self.value = value
def __repr__(self):
return '{}.{}'.format(self.namespace_name, self.value)
class Enumeration(object):
def __init__(self, prefix, names):
prefix = prefix.upper().replace(' ','_')
globals()[prefix] = self #don't do this with locals()
self.items = names
for i,name in enumerate(names.strip().splitlines()):
name = name.strip().upper().replace(' ','_')
value = EnumItem(self, prefix, name)
setattr(self, name, value)
#globals()[name] = value #optional, also don't do this with locals()
一些枚举:
Enumeration('GAME_STATE', '''
active
lost
won
''')
Enumeration('GUESS', '''
invalid not a letter
invalid already guessed
correct
correct win
incorrect
incorrect loss
''')
游戏逻辑-如果您在思考子手的规则时遇到困难(请注意一些事项,以使其完全正确地在空格中运行,以便于理解) :
Game logic - look at this part if you have trouble thinking through the rules of hangman (I left out a few things to make it run entirely correctly with spaces, to make it easier to understand):
class HangmanGame(object):
MAX_INCORRECT_GUESSES = 10
_bodyparts = [
hangman1, hangman2, hangman3 #...
]
def __init__(self, hidden_goal_phrase):
self.phrase = hidden_goal_phrase.lower() # e.g. batman
self.revealed = '?'*len(hidden_goal_phrase) # e.g. ??????
self.guessed = set() # e.g. {'b', 't'}
self.num_incorrect_guesses = 0
self.game_state = GAME_STATE.ACTIVE
def guess(self, letter):
"""
Interact with game by calling this function repeatedly with user's guesses
letter - the letter the player has guessed
"""
if not letter in alphabet or not len(letter)==1:
return GUESS.INVALID_NOT_A_LETTER
if letter in self.guessed:
return GUESS.INVALID_ALREADY_GUESSED # or throw a custom exception class HangmanIncorrectGuessException(Exception): pass
# else guess is legitimate
self.guessed.add(letter)
if letter in self.phrase: # if guess was correct
# update internal state
self.revealed = ''.join((c if c in self.guessed else (' ' if c==' ' else '?')) for c in self.phrase)
# check for win
print(set(self.guessed), set(self.phrase))
if self.guessed>=set(self.phrase): # non-strict superset, see set.__ge__ etc.
self.game_state = GAME_STATE.WON
self.redraw
return GUESS.CORRECT_WIN
else:
return GUESS.CORRECT
else: # if guess was incorrect
self.num_incorrect_guesses += 1
# check for loss
if self.num_incorrect_guesses==HangmanGame.MAX_INCORRECT_GUESSES:
self.game_state = GAME_STATE.LOST
self.redraw()
return GUESS.INCORRECT_LOSS
else:
self.redraw()
return GUESS.INCORRECT
def redraw(self):
'''
updates canvas to reflect current game state
'''
# pygame.clearcanvasorsomething()
for bodypart in HangmanGame._bodyparts[:self.num_incorrect_guesses]:
bodypart()
if self.game_state==GAME_STATE.LOST:
pass #draw appropriate GAME OVER
elif self.game_state==GAME_STATE.WON:
pass #draw appropriate CONGRATULATIONS
互动循环:
while True:
print('NEW GAME')
game = HangmanGame('penguin')
while game.game_state==GAME_STATE.ACTIVE:
result = game.guess(raw_input('Guess a letter: '))
print(game.revealed, result)
print('')
演示游戏:
NEW GAME
Guess a letter: p
(set(['p']), set(['e', 'g', 'i', 'n', 'p', 'u']))
('p??????', GUESS.CORRECT)
Guess a letter: e
(set(['p', 'e']), set(['e', 'g', 'i', 'n', 'p', 'u']))
('pe?????', GUESS.CORRECT)
Guess a letter: n
(set(['p', 'e', 'n']), set(['e', 'g', 'i', 'n', 'p', 'u']))
('pen???n', GUESS.CORRECT)
Guess a letter: guin
('pen???n', GUESS.INVALID_NOT_A_LETTER)
Guess a letter: 7
('pen???n', GUESS.INVALID_NOT_A_LETTER)
Guess a letter:
('pen???n', GUESS.INVALID_NOT_A_LETTER)
Guess a letter: z
bodypart#1
('pen???n', GUESS.INCORRECT)
Guess a letter: x
bodypart#1
bodypart#2
('pen???n', GUESS.INCORRECT)
Guess a letter: c
bodypart#1
bodypart#2
bodypart#3
('pen???n', GUESS.INCORRECT)
Guess a letter: i
(set(['p', 'c', 'e', 'i', 'x', 'z', 'n']), set(['e', 'g', 'i', 'n', 'p', 'u']))
('pen??in', GUESS.CORRECT)
Guess a letter: u
(set(['c', 'e', 'i', 'n', 'p', 'u', 'x', 'z']), set(['e', 'g', 'i', 'n', 'p', 'u']))
('pen?uin', GUESS.CORRECT)
Guess a letter: g
(set(['c', 'e', 'g', 'i', 'n', 'p', 'u', 'x', 'z']), set(['e', 'g', 'i', 'n', 'p', 'u']))
('penguin', GUESS.CORRECT_WIN)
NEW GAME
Guess a letter: q
bodypart#1
('???????', GUESS.INCORRECT)
Guess a letter: w
bodypart#1
bodypart#2
('???????', GUESS.INCORRECT)
Guess a letter: r
bodypart#1
bodypart#2
bodypart#3
('???????', GUESS.INCORRECT)
...more incorrect guesses...
('???????', GUESS.INCORRECT_LOSS)
这篇关于Python中的For循环函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!