7

「ゲーム」を作りました。私はそれをプレイするのが大好きで、コンピューターに Python と Pygame をインストールすることなく、友人に配布したいと考えています。

Py2Exe と Pyinstaller について多くの調査を行いました。多くのチュートリアル、修正、エラーに目を通しましたが、どれも役に立たないようです。

Pygameのフォントが好きではなく、Py2exeは組み込みモジュールをコンパイルしないため、Pyinstallerは役に立たないため、pygameとフォントを含むpy2exeで使用するための既製のセットアップスクリプトであるPygame2exeを見つけました。正常にビルドされると思われますが、exe は使用できません... エラーが発生します。

「Microsoft Visual C++ ランタイム ライブラリ

ランタイムエラー!

プログラム C:...\dist\Worm Game.exe

このアプリケーションは、異常な方法で終了するようにランタイムを要求しました。詳細については、アプリケーションのサポート チームにお問い合わせください。」

よくわかりません... このゲームをコンパイルできないのはなぜですか!!!

以下は、Python 2.7 で作成されたゲーム コードです。

import pygame
import random
import os

pygame.init()

class Worm:
    def __init__(self, surface):
        self.surface = surface
        self.x = surface.get_width() / 2
        self.y = surface.get_height() / 2
        self.length = 1
        self.grow_to = 50
        self.vx = 0
        self.vy = -1
        self.body = []
        self.crashed = False
        self.color = 255, 255, 0

    def event(self, event):
        if event.key == pygame.K_UP:
            if self.vy != 1:
                self.vx = 0
                self.vy = -1
            else:
                a = 1
        elif event.key == pygame.K_DOWN:
            if self.vy != -1:
                self.vx = 0
                self.vy = 1
            else:
                a = 1
        elif event.key == pygame.K_LEFT:
            if self.vx != 1:
                self.vx = -1
                self.vy = 0
            else:
                a = 1
        elif event.key == pygame.K_RIGHT:
            if self.vx != -1:
                self.vx = 1
                self.vy = 0
            else:
                a = 1

    def move(self):
        self.x += self.vx
        self.y += self.vy
        if (self.x, self.y) in self.body:
            self.crashed = True
        self.body.insert(0, (self.x, self.y))
        if (self.grow_to > self.length):
            self.length += 1
        if len(self.body) > self.length:
            self.body.pop()

    def draw(self):
        x, y = self.body[0]
        self.surface.set_at((x, y), self.color)
        x, y = self.body[-1]
        self.surface.set_at((x, y), (0, 0, 0))

    def position(self):
        return self.x, self.y

    def eat(self):
        self.grow_to += 25

class Food:
    def __init__(self, surface):
        self.surface = surface
        self.x = random.randint(10, surface.get_width()-10)
        self.y = random.randint(10, surface.get_height()-10)
        self.color = 255, 255, 255

    def draw(self):
        pygame.draw.rect(self.surface, self.color, (self.x, self.y, 3, 3), 0)

    def erase(self):
        pygame.draw.rect(self.surface, (0, 0, 0), (self.x, self.y, 3, 3), 0)

    def check(self, x, y):
        if x < self.x or x > self.x +3:
            return False
        elif y < self.y or y > self.y +3:
            return False
        else:
            return True

    def position(self):
        return self.x, self.y

font = pygame.font.Font(None, 25)
GameName = font.render("Worm Eats Dots", True, (255, 255, 0))
GameStart = font.render("Press Any Key to Play", True, (255, 255, 0))

w = 500
h = 500
screen = pygame.display.set_mode((w, h))


GameLoop = True
while GameLoop:
    MenuLoop = True
    while MenuLoop:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            elif event.type == pygame.KEYDOWN:
                MenuLoop = False
        screen.blit(GameName, (180, 100))
        screen.blit(GameStart, (155, 225))
        pygame.display.flip()

    screen.fill((0, 0, 0))
    clock = pygame.time.Clock()
    score = 0
    worm = Worm(screen)
    food = Food(screen)
    running = True

    while running:
        worm.move()
        worm.draw()
        food.draw()

        if worm.crashed:
            running = False
        elif worm.x <= 0 or worm.x >= w-1:
            running = False
        elif worm.y <= 0 or worm.y >= h-1:
            running = False
        elif food.check(worm.x, worm.y):
            score += 1
            worm.eat()
            print "Score %d" % score
            food.erase()
            food = Food(screen)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            elif event.type == pygame.KEYDOWN:
                worm.event(event)

        pygame.display.flip()
        clock.tick(200)

    if not os.path.exists("High Score.txt"):
        fileObject = open("High Score.txt", "w+", 0)
        highscore = 0
    else:
        fileObject = open("High Score.txt", "r+", 0)
        fileObject.seek(0, 0)
        highscore = int(fileObject.read(2))
    if highscore > score:
        a = 1
    else:
        fileObject.seek(0, 0)
        if score < 10:
            fileObject.write("0"+str(score))
        else:
            fileObject.write(str(score))
        highscore = score
    fileObject.close()
    screen.fill((0, 0, 0))
    ScoreBoarda = font.render(("You Scored: "+str(score)), True, (255, 255, 0))
    if highscore == score:
        ScoreBoardb = font.render("NEW HIGHSCORE!", True, (255, 255, 0))
        newscore = 1
    else:
        ScoreBoardb = font.render(("High Score: "+str(highscore)), True, (255, 255, 0))
        newscore = 0
    Again = font.render("Again?", True, (255, 255, 0))
    GameOver = font.render("Game Over!", True, (255, 255, 0))
    screen.blit(GameName, (180, 100))
    screen.blit(GameOver, (200, 137))
    screen.blit(ScoreBoarda, (190, 205))
    if newscore == 0:
        screen.blit(ScoreBoardb, (190, 235))
    elif newscore == 1:
        screen.blit(ScoreBoardb, (175, 235))
    screen.blit(Again, (220, 365))
    pygame.draw.rect(screen, (0, 255, 0), (200, 400, 40, 40), 0)
    pygame.draw.rect(screen, (255, 0, 0), (260, 400, 40, 40), 0)
    LEFT = font.render("L", True, (0, 0, 0))
    RIGHT = font.render("R", True, (0, 0, 0))
    screen.blit(LEFT, (215, 415))
    screen.blit(RIGHT, (275, 415))
    pygame.display.flip()
    loop = True
    while loop:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                x, y = event.pos
                if x > 200 and x < 240 and y > 400 and y < 440:
                    loop = False
                elif x > 260 and x < 300 and y > 400 and y < 440:
                    GameLoop = False
                    loop = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    loop = False
                elif event.key == pygame.K_RIGHT:
                    GameLoop = False
                    loop = False

    screen.fill((0, 0, 0))
pygame.quit()
4

3 に答える 3

5

私もこの問題に遭遇しました。調査の結果、実行時エラーはフォントが原因であることがわかりました。フォント名としても None を使用していることに気付きました。pygame2exe ページの"Changes by arit:" のすぐ下に、フォントに関する pygame2exe を使用するための通知があることを覚えておいてください。 exeは見つけることができます。たとえば、フォントを作成するときに「freesansbold.ttf」を使用してNoneを置き換え、exeファイルが存在するフォルダーの下にfreesansbold.ttfを配置できます。それが役立つことを願っています。

于 2012-12-29T10:19:08.430 に答える
1

私の答え:

数週間後(以前にもこの問題がありました)、この問題を解決したと言ってうれしいです!:)

私の問題の最初の部分( http://i.stack.imgur.com/WpkjR.png ): setup.py スクリプトを編集して「除外」部分を追加して解決しました。その結果、実行ファイルの作成に成功しました!

変更された setup.py スクリプト:

from distutils.core import setup
import py2exe
setup(windows=['source_static.py'], options={
          "py2exe": {
              "excludes": ["OpenGL.GL", "Numeric", "copyreg", "itertools.imap", "numpy", "pkg_resources", "queue", "winreg", "pygame.SRCALPHA", "pygame.sdlmain_osx"],
              }
          }
      )

したがって、同様の問題がある場合は、「不足している」モジュールをこの「除外」行に入れます。

第2部:

実行ファイルの作成に成功した後、次の問題が発生しました。この別の問題を解決する方法を何日も検索して考えた後、私はそれを行う方法を見つけました. その問題がそれほどばかげているとは信じられませんでした。問題は私のコードにあり、フォント定義は次のとおりです。

font1 = pygame.font.SysFont(None, 13)

None」を何らかのシステム フォント名 (たとえば「Arial」(文字列である必要があります)) に変更してコンパイルした後、.exe ファイルが機能したとは信じられませんでした。

font1 = pygame.font.SysFont("Arial", 13)

もちろん、独自のフォントを使用することもできますが、そのパスを指定してプログラムで定義する必要があります。

この問題を経験しているすべての人は、この手順を試してみてください。成功することを願っています。これらの問題を解決しようとして何日も何週間も無駄にしてしまったので、これがお役に立てば幸いです。Python と pygame のすべてのバージョン、他の多くの .exe ビルダーとセットアップ スクリプトを使用して .exe ファイルを作成しようとしましたが、うまくいきませんでした。これらの問題以外にも、以前は他にも多くの問題がありましたが、stackoverflow.com でそれらに対する回答を見つけました。

この問題を解決し、同じ問題に直面している場合に役立つ方法を見つけられたことをうれしく思います.

小さなヒント(私もやったこと):

1 つ目: Microsoft Visual C++ ライブラリを最新のものに更新します。

2番目: 実行可能プログラムが必要とする画像やフォントが似ている場合は、それらをdistフォルダー (.exe ファイルが作成された場所) に含めます。

3 番目: .exe ファイルを作成するときは、必要なすべてのファイルを setup.py スクリプトがあるフォルダー (メイン スクリプトが使用するすべてのファイルとディレクトリ) に含めます。

Python 2.7 x64pygame、およびpy2exeを使用しました。

于 2013-03-05T04:31:20.133 に答える
1

あなたのコードに何か問題があるとは思いません。実際、それはうまくコンパイルされ、私もプレイしました。ナイスゲーム。

お使いのコンピュータで次のことを調べることをお勧めします。

  1. すべての Microsoft Update をインストールしましたか
  2. プログラム ([コントロール パネル] - [プログラムと機能]) に目を通し、最新の Microsoft Visual C++ ライブラリが存在するかどうかを確認します。

上記の2つがきちんと整っていれば、うまくいくはずだと思います。

次の構成のマシンでこれをテストしました。 1. すべてのセキュリティ パッチが更新された Windows 7。

于 2012-10-30T20:42:06.173 に答える