在Python中合并两个程序的代码

1 投票
2 回答
1928 浏览
提问于 2025-04-17 08:23

我的问题有点复杂,我在脑海中反复思考,但我会尽量解释清楚。我有两个Python代码,一个是我用Python写的Mastermind游戏,另一个是用Pygame做的Mastermind游戏板。我想问的是:我该如何把这两个代码合并成一个,让游戏在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 个回答

0

第一步:把你的棋盘代码整理好,确保它是一个正确的类定义。

第二步:再写一个文件,把棋盘和游戏的代码引入进来。

这样它们就“结合”在一起了。

接下来,你需要花时间把游戏的代码修正一下,让它能使用你新建的、很酷的棋盘。

1

正如你所知道的,你不能把所有东西都放在一个文件里然后就能运行。你需要把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()

当然,这个代码不会完全适合你,但我希望我解释的这个思路能够传达给你。

撰写回答