質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.34%

pygameでエラーは出ないが表示がされない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,323

score 9

pygameで画面に何も表示されないのですが、問題点がありますでしょうか。

import sys
from random import randint
import pygame
from pygame.locals import QUIT,KEYDOWN,KEYUP,K_LEFT,K_RIGHT,K_UP,K_DOWN

pygame.init()
SURFACE=pygame.display.set_mode((800,800))
FPSCLOCK=pygame.time.Clock()

def main():
    game_over = False
    score = 0
    speed = 25
    stars = []
    keymap = []
    ship = [0,0]
    scope_image = pygame.image.load("scope.jpg")
    star_image = pygame.image.load("star.jpg")

    scorefont = pygame.font.SysFont(None,36)
    sysfont = pygame.font.SysFont(None,72)
    message_over = sysfont.render("GAME OVER!!",True,(0,255,255))
    message_rect = message_over.get_rect()#center=(400,400))
    message_rect.center = (400,400)

    while len(stars) < 200:
        stars.append({"pos":[randint(-1600,1600),randint(-1600,1600),randint(0,4095)],"theta":randint(0,360)})

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if not event.key in keymap:
                    keymap.append(event.key)
            elif event.type == KEYUP:
                keymap.remove(event.key)

    #フレームごとの処理
    if not game_over:
        score += 1
        if score % 10 == 0:
            speed += 1


        if K_LEFT in keymap:
            ship[0] -= 30
        elif K_RIGHT in keymap:
            ship[0]+=30
        elif K_UP in keymap:
            ship[1] -= 30
        elif K_DOWN in keymap:
            ship[1] += 30

        ship[0] = max(-800,min(800,ship[0]))
        ship[1] = max(-800,min(800,ship[1]))

        for star in stars:
            star["pos"][2] -= speed
            if star["pos"][2] < 64:
                if abs(star["pos"][0]-ship[0]) <50 and abs(star["pos"][1]-ship[1]) < 50:
                    game_over = True
                star["pos"] = [randint(-1600,1600),randint(-1600,1600),4095]


        #描画
        SURFACE.fill((0,0,0))
        stars = sorted(stars,key = lambda x: x["pos"][2],reverse=True)
        for star in stars:
            zpos=star["pos"][2]
            xpos=((star["pos"][0]-ship[0])<<9)/zpos+400

            ypos=((star["pos"][1]-ship[1])<<9)/zpos+400
            size=(50<<9)/zpos
            rotated=pygame.transform.rotozoom(star_image,star["theta"],size/145)
            SURFACE.bilt(rotated,(xpos,ypos))

        SURFACE.blit(scope_image,(0,0))

        if game_over:
            SURFACE.blit(message_over,message_rect)
            pygame.mixer.music.stop()

        #スコアの描画
        score_str = str(score).zfill(6)
        score_image=scorefont.render(score_str,True,(0,255,0))
        SURFACE.blit(score_image,(700,50))

        pygame.display.update()
        FPSCLOCK.tick(20)

if __name__ == '__main__':
    main()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

このプログラムが何をするものなのか、ざっと読んだだけ且つ質問で一切触れられていないのでわかりかねますが、軽く見てみたところでは

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if not event.key in keymap:
                    keymap.append(event.key)
            elif event.type == KEYUP:
                keymap.remove(event.key)


ここで無限ループになっているようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/08 23:44

    説明不足でした。キー入力で移動し、隕石を避けるゲームです。
    これはインデントがおかしいのか、それともこのコード自体がおかしいのでしょうか。

    キャンセル

  • 2019/10/09 14:46

    「キー入力で移動し、隕石を避ける」という概要はわかりましたが、プログラムの各処理が何を意図しているのかは依然わかりません。また、「インデントがおかしい」とはどういう意味でしょうか。
    どちらにしろwhile文の中でbreakがないので、基本的にこのコードでは無限ループして次の処理まで進まないのです。それについて軽微なミスによるものなのか、根本的な考え方の間違いなのかは現段階ではあなたにしかわからないことだと思います。

    キャンセル

  • 2019/10/11 13:19

    回答ありがとうございました。
    もう一度考え直します。

    キャンセル

0

ぱっと見では

    #フレームごとの処理
    if not game_over:

# 略

                if abs(star["pos"][0]-ship[0]) <50 and abs(star["pos"][1]-ship[1]) < 50:
                    game_over = True
                star["pos"] = [randint(-1600,1600),randint(-1600,1600),4095]```  

のインデントが一段、低い気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る