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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

262閲覧

コードを改造したらフリーズした

PythonNINJYA

総合スコア17

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/11/18 11:16

編集2023/11/18 11:40

実現したいこと

入門書にあるゲームを改造したい

  • 戦闘勝利後にスペースキーが押されるまで次の画面に移行しない動作するようにする

前提

入門書にあるゲームを改造しています。57行目以降を改造したところ、戦闘勝利後に「キーを押すまで次に進まない」というのを実現したいのですが、エラーが出てしまいます。

発生している問題・エラーメッセージ

ボタンを押しても次に進まず、フリーズしてしまう。

該当のソースコード

python3

1def battle_command(bg, fnt, key): # コマンドの入力と表示 2 global btl_cmd 3 ent = False 4 if key[K_a]: # Aキー 5 btl_cmd = 0 6 ent = True 7 if key[K_p]: # Pキー 8 btl_cmd = 1 9 ent = True 10 if key[K_b]: # Bキー 11 btl_cmd = 2 12 ent = True 13 if key[K_r]: # Rキー 14 btl_cmd = 3 15 ent = True 16 if key[K_UP] and btl_cmd > 0: #↑キー 17 btl_cmd -= 1 18 if key[K_DOWN] and btl_cmd < 3: #↓キー 19 btl_cmd += 1 20 if key[K_SPACE] or key[K_RETURN]: 21 ent = True 22 for i in range(4): 23 c = WHITE 24 if btl_cmd == i: c = BLINK[tmr%6] 25 draw_text(bg, COMMAND[i], 20, 360+i*60, fnt, c) 26 return ent 27 28#以下、問題となってる部分 29 elif idx == 16: # 勝利 30 draw_battle(screen, fontSS,fontLOG) 31 if tmr == 1: 32 set_message("You win!") 33 pygame.mixer.music.stop() 34 se[5].play() 35 if tmr == 28: 36 if random.randint(0, emy_lifemax) > random.randint(0, pl_lifemax): 37 idx = 17 38 tmr = 0 39 else: 40 while not(battle_command(screen, font, key) == True): 41 None 42 idx = 22 43 44 elif idx == 17: # レベルアップ 45 draw_battle(screen, fontSS,fontLOG) 46 if tmr == 1: 47 set_message("Level up!") 48 se[4].play() 49 lif_p = random.randint(10, 20) 50 str_p = random.randint(5, 10) 51 if tmr == 21: 52 set_message("Max life + "+str(lif_p)) 53 pl_lifemax = pl_lifemax + lif_p 54 if tmr == 26: 55 set_message("Str + "+str(str_p)) 56 pl_str = pl_str + str_p 57 if tmr == 50: 58 while not(battle_command(screen, font, key) == True): 59 None 60 idx = 22 61

補足

コードは一部載せてあります。

試したこと 調査したこと

58行目のwhile not の条件式をkey[K_SPACE]にしてもフリーズした。
while文には入れている模様。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

while でイベントループを回している中で、さらにwhileループを行い、無駄に何回もkey入力値を調べているため、重くなっていると考えられます。

以下のように、素直にイベントループ内でkeyを調べるべきでしょう。

py

1 elif idx == 16: # 勝利 2 draw_battle(screen, fontS) 3 if tmr == 1: 4 set_message("You win!") 5 pygame.mixer.music.stop() 6 se[5].play() 7 if tmr == 28: 8 idx = 22 9 if random.randint(0, emy_lifemax) > random.randint(0, pl_lifemax): 10 idx = 17 # 勝利かつレベルアップあり 11 tmr = 0 12 else: 13 idx = 18 # 勝利かつレベルアップなし 14 tmr = 0 15 16 elif idx == 17: # レベルアップ 17 draw_battle(screen, fontS) 18 if tmr == 1: 19 set_message("Level up!") 20 se[4].play() 21 lif_p = random.randint(10, 20) 22 str_p = random.randint(5, 10) 23 if tmr == 21: 24 set_message("Max life + "+str(lif_p)) 25 pl_lifemax = pl_lifemax + lif_p 26 if tmr == 26: 27 set_message("Str + "+str(str_p)) 28 pl_str = pl_str + str_p 29 if tmr >= 50: 30 if battle_command(screen, font, key) == True: 31 idx = 22 32 33 elif idx == 18: # 勝利かつレベルアップなし 34 draw_battle(screen, fontS) 35 if battle_command(screen, font, key) == True: 36 idx = 22 37以下略

投稿2023/11/18 12:17

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PythonNINJYA

2023/11/18 14:23

なるほど、ループを使わずにタイマーの値で指定すればフリーズせずに済んだのですね。 勉強になりました。ありがとうございました。 これからも日々精進してまいります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問