2011-12-14 2 views
1

Мой вопрос довольно сложный, поскольку я запускаю его через голову, но я попытаюсь объяснить это как можно лучше. У меня есть 2 кода на Python, один из которых я создал с Python для игры Mastermind, а затем другой в Pygame для платы Mastermind, чтобы воспроизвести ее. Мой вопрос заключается в следующем: как я могу объединить оба этих кода в 1, чтобы заставить его играть с Pygame, а не окно командной строки, которое я обычно получаю?Сочетание кода из двух программ в Python

Прошу прощения, если это звучит все безжалостно, но это мой вопрос. Я просто хочу взять мой код Python и реализовать его в коде Pygame и запустить игру, как это должно быть.

Heres код для игры:

import random 

class InvalidMove(Exception):pass 

class Game: 
    def __init__(self): 
     self.colors=('r','g','b','y') 
     self.to_guess=[random.choice(self.colors) for i in range(4)] 

    def match_guess(self,guess): 
     if len(guess)!=len(self.to_guess) or [g for g in guess if g not in self.colors]: 
      raise InvalidMove() 
     ret=[0,0] 
     usedindexes=[] 
     for i,g in enumerate(guess): 
      if g==self.to_guess[i]: 
       ret[0]+=1 
       usedindexes.append(i) 
     for i,g in enumerate(guess): 
      if i in usedindexes: continue 
      for j,c in enumerate(self.to_guess): 
       if c==g and j not in usedindexes: 
        ret[1]+=1 
        usedindexes.append(j) 
     return ret    

class UI: 
    def make_move(self): 
    guess=raw_input("Guess: ") 
    return guess.split() 

def main(self): 
    print("The game begins...") 
    print("Possible colors (enter first letter): [r]ed [g]reen [b]lue [y]ellow") 
    print("Enter your guess like: r g b y") 
    g=Game() 
    while True: 
     guess=self.make_move() 
     try: 
      bp,wp=g.match_guess(guess) 
     except InvalidMove: 
      print("Invalid guess, try again") 
      continue 
     print("Black pegs %s"%bp) 
     print("White pegs %s"%wp) 
     if bp==4: 
      print("You won!") 

if __name__=="__main__": 
    u=UI() 
    u.main() 

А вот код для платы я сделал в Pygame:

import pygame 
from pygame.locals import * 


def draw_current(men, turn, spacing, corner): 
    current = len(men) - 1 
    pos = corner[0] + current * spacing[0], turn * spacing[1] + corner[1] 
    screen.blit(images[men[-1]], pos) 

images = { K_r: pygame.image.load('red.png'), K_g: pygame.image.load('green.png'), 
      K_b: pygame.image.load('blue.png'), K_y: pygame.image.load('yellow.png'), 
      K_SPACE: pygame.image.load('empty.png') } 

pygame.init() 

SCREEN_SIZE = (640, 480) 
background_image_filename = 'mastermind_board.jpg' 
screen = pygame.display.set_mode(SCREEN_SIZE, 0, 32) 
background = pygame.image.load(background_image_filename).convert() 
screen.blit(background, (0, 0)) 
pygame.display.update() 

men = [] 

margin = 5, 3 
spacing = [x + m for m, x in zip(margin, images[K_r].get_size())] 
corner = 74, 74 
turn = 0 
quit = False 

while not quit: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      quit = True 
      break 
     if event.type == KEYUP: 
      if event.key in images: 
      #print event.key 
       men.append(event.key) 
      # update 
       draw_current(men,turn, spacing, corner) 
       if len(men) == 4: 
        turn += 1 
        men = [] 
       pygame.display.update() 
      elif event.key in (K_q, K_ESCAPE): 
       quit = True 
       break 

pygame.quit() 

Любые и вся помощь/предложения будет более высокую оценку.

ответ

0

Шаг 1. Исправьте свою доску так, чтобы она соответствовала определению класса.

Шаг 2. Напишите третий файл, который import плата и игра.

Теперь они «объединены».

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

1

Как я уверен, вы знаете, вы не можете просто положить все это в один файл и запустить его. Вам нужно инкапсулировать игру Mastermind, чтобы вы могли запустить/обновить ее из цикла pygame. Было бы чище, если бы вы сохранили логику игры Mastermind в отдельном файле и просто импортировали ее, но это не требуется.

Вот некоторые полу-psuedocode:

import pygame 

class Mastermind(object): 
    def update(self, *args): 
     pass #do stuff 

pygame.init() 

while not quit: 
    if event: 
     if event == "quit": 
     quit = True 
     else: 
     #update the game 
     Mastermind.update(args) 
     #update the board 
     pygame.display.update() 

pygame.quit() 

Конечно, это не будет работать для вас точно, но я надеюсь, что идея, что я объясняю проступает.

Смежные вопросы