Объединение кода из двух программ на Python - PullRequest
1 голос
/ 15 декабря 2011

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

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

Вот код для игры:

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

Любая помощь и предложения будут более чем признательны.

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

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

Вот несколько полупсевдокодов:

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

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

0 голосов
/ 15 декабря 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...