我使用2个python文件和pygame
制作了一个游戏,我尝试使用cx_freeze
将其变成.exe
。
以下是2个脚本:
Move.py:
import pygame
from Enemy import *
pygame.init()
gameDisplay = pygame.display.set_mode((800,600))
white = [255,255,255]
black = [0,0,0]
red = [200,0,0]
green = [0,200,0]
gamex = 800
gamey = 600
enemynumber = [5,7,10]
level = 0
blocksize = 10
clock = pygame.time.Clock()
smallfont = pygame.font.SysFont("impactregular", 25)
medfont = pygame.font.SysFont("impactregular", 50)
largefont = pygame.font.SysFont("impactregular", 75)
pygame.display.update()
FPS = 30
EnemyList = []
def makeEnemy(enemyCount):
for i in range(0,enemyCount):
EnemyList.append( Enemy())
EnemyList[i].setup(i*100,200,False,0)
def enemyCalc(blockx,blocky,enemyCount):
for i in range(0,enemyCount):
pygame.draw.rect(gameDisplay, red, EnemyList[i].calc(blockx,blocky))
def GameOver():
gameover = True
while gameover:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r:
level = 0
gameLoop()
if event.key == pygame.K_q:
pygame.quit()
quit()
gameDisplay.fill(white)
message_to_screen("GAME OVER", red, -100, "large")
message_to_screen("Press R to try again, or Q to quit", black, 100, "medium")
pygame.display.update()
def Win():
win = True
while win:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r:
level = 0
gameLoop()
if event.key == pygame.K_q:
pygame.quit()
quit()
gameDisplay.fill(white)
message_to_screen("YOU WIN!", green, -100, "large")
message_to_screen("Press R to play again, or Q to quit", black, 100, "medium")
pygame.display.update()
def Intro():
intro = True
while intro:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r:
level = 0
gameLoop()
if event.key == pygame.K_q:
pygame.quit()
quit()
gameDisplay.fill(white)
message_to_screen("GO UP: The Game", red, -100, "large")
message_to_screen("Get to the top of the screen,",
black, 100, "medium")
message_to_screen("but avoid the red squares!",
black, 150, "medium")
message_to_screen("Press R to play, or Q to quit", black, 250, "medium")
pygame.display.update()
def text_objects(text,color,size):
if size == "small":
textSurface = smallfont.render(text, True, color)
elif size == "medium":
textSurface = medfont.render(text, True, color)
elif size == "large":
textSurface = largefont.render(text, True, color)
return textSurface, textSurface.get_rect()
def message_to_screen(msg,color,offset=0, size="small"):
textSurf, textRect = text_objects(msg,color,size)
textRect.center = (gamex / 2), ((gamey / 2) + offset)
gameDisplay.blit(textSurf, textRect)
def collision(playerx, playery, enemyCount):
for i in range(0,enemyCount):
enemyx = EnemyList[i].x
enemyy = EnemyList[i].y
if playerx == enemyx and playery == enemyy:
GameOver()
def gameLoop():
global EnemyList
global level
blockx = gamex/2
blocky = gamey/2
xchange = 0
ychange = 0
gameExit = False
makeEnemy(enemynumber[level])
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
xchange = 10
if event.key == pygame.K_LEFT:
xchange = -10
if event.key == pygame.K_DOWN:
ychange = 10
if event.key == pygame.K_UP:
ychange = -10
if event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
xchange = 0
elif event.key == pygame.K_LEFT:
xchange = 0
elif event.key == pygame.K_DOWN:
ychange = 0
elif event.key == pygame.K_UP:
ychange = 0
collision(blockx,blocky,enemynumber[level])
if xchange == -10 and blockx == 0 or xchange == 10 and blockx == gamex-10:
xchange = 0
if ychange == 10 and blocky == gamey-10:
ychange = 0
if ychange == -10 and blocky == 0:
if level < 2:
level += 1
gameLoop()
else:
Win()
blockx += xchange
blocky += ychange
gameDisplay.fill(white)
message_to_screen("Level: "+str(level+1),black,-275)
enemyCalc(blockx,blocky,enemynumber[level])
pygame.draw.rect(gameDisplay, black, [blockx,blocky,10,10])
pygame.display.update()
clock.tick(FPS)
Intro()
和Enemy.py:
import pygame
class Enemy:
def setup(self,x,y,dead,subclass):
if not dead:
self.x = x
self.y = y
self.count = 0
self.reverse = False
self.subclass = subclass
def calc(self, playerx, playery):
if self.count < 10 and self.reverse == False:
self.count += 1
self.x += 10
elif self.count == 10:
self.reverse = True
self.x += -10
self.count += -1
if self.count > 0 and self.reverse == True:
self.count += -1
self.x += -10
elif self.count == 0:
self.reverse = False
self.x += 10
self.count += 1
return [self.x,self.y,10,10]
我输入了setup.py
来编译脚本:
import cx_Freeze
cx_Freeze.setup(
name="Go Up: The Game",
options = {"build_exe": {"packages":["pygame","Enemy"]}},
executables = [cx_Freeze.Executable("Move.py")]
)
我输入了正确的Python控制台命令,但是我收到了一个错误:
C:\Users\Sean\Documents\Python\Object Test>c:/python32/python setup.py build
running build
running build_exe
Traceback (most recent call last):
File "setup.py", line 6, in <module>
executables = [cx_Freeze.Executable("Move.py")]
File "c:\python32\lib\site-packages\cx_Freeze\dist.py", line 365, in setup
distutils.core.setup(**attrs)
File "c:\python32\lib\distutils\core.py", line 148, in setup
dist.run_commands()
File "c:\python32\lib\distutils\dist.py", line 917, in run_commands
self.run_command(cmd)
File "c:\python32\lib\distutils\dist.py", line 936, in run_command
cmd_obj.run()
File "c:\python32\lib\distutils\command\build.py", line 126, in run
self.run_command(cmd_name)
File "c:\python32\lib\distutils\cmd.py", line 313, in run_command
self.distribution.run_command(command)
File "c:\python32\lib\distutils\dist.py", line 936, in run_command
cmd_obj.run()
File "c:\python32\lib\site-packages\cx_Freeze\dist.py", line 235, in run
freezer.Freeze()
File "c:\python32\lib\site-packages\cx_Freeze\freezer.py", line 575, in Freeze
self.finder = self._GetModuleFinder()
File "c:\python32\lib\site-packages\cx_Freeze\freezer.py", line 330, in _GetMo
duleFinder
finder.IncludePackage(name)
File "c:\python32\lib\site-packages\cx_Freeze\finder.py", line 581, in Include
Package
self._ImportAllSubModules(module, deferredImports)
File "c:\python32\lib\site-packages\cx_Freeze\finder.py", line 220, in _Import
AllSubModules
deferredImports)
File "c:\python32\lib\site-packages\cx_Freeze\finder.py", line 338, in _Intern
alImportModule
parentModule, namespace)
File "c:\python32\lib\site-packages\cx_Freeze\finder.py", line 366, in _LoadMo
dule
module.code = compile(codeString, path, "exec")
File "c:\python32\lib\site-packages\pygame\nmovie.py", line 15
print "Unable to find a working movie backend. Loading the dummy movie class
..."
^
SyntaxError: invalid syntax
C:\Users\Sean\Documents\Python\Object Test>
有人能告诉我文件有什么问题吗?
答案 0 :(得分:1)
您正在使用Python 3.2:
C:\Users\Sean\Documents\Python\Object Test>c:/python32/python setup.py build
^^^^^^^^
然而nmovie.py
包中的pygame
文件具有print
的Python 2.x语法:
print "Unable to find a working movie backend. Loading the dummy movie class..."
^^^^^^
print
is a function in Python 3.x并且需要用括号调用:
print("Unable to find a working movie backend. Loading the dummy movie class...")
^ ^
这意味着您使用的pygame
版本适用于Python 2.x,因此与Python 3.x不兼容。你需要做以下两件事之一:
在Python 2.x中重写代码,然后使用Python 2.x可执行文件运行setup.py
。
使用{3.}}的Python 3.x版本。您可以在website上下载它。