2013-08-11 3 views
0

Hangman 프로젝트를 계속하고 있으며 for 루프에 문제가있어서 그 안에 함수를 수행하고 있습니다. 예를 들어 'CANADA'라는 이름의 레벨을 누르고 'B'를 누르면 캐나다에 Bs가 없으므로 행맨의 첫 번째 줄을 그려야합니다. ... 좀 더 코드 후Python의 루프 함수 For

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)) 

그런

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 초 후에 사라집니다. bu 그것은 선을 그리지 않습니다. 어떤 도움이 필요합니까?

EDIT : 다른 모듈을 사용하여 일부 테스트를 수행했는데 기능 문자는 정상적인 텍스트 인쇄로 완벽하게 작동합니다. 그러나 드로잉 (Pygame)으로 다시 테스트했을 때 효과적 이었지만 다른 것들 (예 : time.sleep())을 결합하면 흰색 화면이 나타납니다. print와 결합하면 그림이 작동하지 않지만 인쇄는 수행됩니다. 또한 time.sleep(1)을 추가하면 다른 작업을 수행하지 않고 정확히 9 초 동안 검은 색 화면이 나타납니다. 이건 내 테스트 코드입니다 : 그것은 셸에서 동시에 단어의 무리를 인쇄

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() 

다음 구초 후 교수형 집행에 화면 변경이 완벽하게 그려, 단어의 동일한 세트는 다시 올 . 어떤 아이디어라도, 파이 게임에서 경험이있는 사람은 누구입니까?

+0

는 다른 또 다른 들여 쓰기를 필요합니까? – scohe001

+0

또한 letter_number = ord (my_letter) - 96'을 사용하여 문자 코드를 단순화 할 수 있습니다 – scohe001

+1

일반적인 의견 - Python의 근본적인 교리 중 하나는 DRY입니다 ** ** Reapeat Yourself **. 코드를 잘 살펴보고 변경 될 수있는 항목에 대해 생각해보십시오. 아마도 단일 함수 또는 단일 행으로 축소되었을 것입니다. – MattDMo

답변

1

지금 막 작동중인 행맨 프로그램을 만들었습니다. 아마도이 논리보고 도움이 될 것입니다 :

#!/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 
''') 

게임 로직 - 당신이 문제의 규칙을 통해 생각이 있다면이 부분을보고 교수형 집행 인 (나는 그것을 이해하기 쉽게, 공백으로 완전히 정확하게 움직이게하기 위해 몇 가지를 생략했다) :

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 
012 3,516,

대화 형 루프 :

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) 
+0

안녕하십니까, 고맙겠 습니다만,'linebyline()'이 왜 작동하지 않는지 이해해야합니다. 이것은 아주 좋은 교수형 집행관 게임처럼 보이지만 저는 그래픽을 추가하기 위해 파이 게임을 사용하고 있습니다. – JaredCubilla