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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3111閲覧

pygame python ゲーム

modificationkey

総合スコア8

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/01/18 08:40

python

1import pygame 2from pygame.locals import * 3import sys 4import time 5def main(): 6 7 (w,h) = (400,400) # 画面サイズ 8 (x,y) = (w/2, h/2) 9 pygame.init() # pygame初期化 10 pygame.display.set_mode((w, h), 0, 32) # 画面設定 11 screen = pygame.display.get_surface() 12 pygame.display.set_caption("5byoudetomete") 13 # 画面設定 文字 14 sysfont = pygame.font.SysFont(None, 40) 15 # テキストを描画したSurface作成、画像の作成 16 click_start = sysfont.render("click to start", False, (0,0,0)) 17 count_during = sysfont.render("in measurement", False, (0,0,0)) 18 tokei = pygame.image.load("tokei.png").convert_alpha() 19 rect_tokei = tokei.get_rect() 20 rect_tokei.center = (200, 180) 21 screen.fill((255,255,255, )) # 画面の背景色 22 screen.blit(click_start, (20,350)) 23 pygame.display.update() # 画面更新 24 tmp = 0 25 while (1): 26 27 # 終了用のイベント処理 28 for event in pygame.event.get(): 29 if event.type == QUIT: # 閉じるボタンが押されたとき 30 pygame.quit() 31 sys.exit() 32 # マウスクリック1回目の処理(カウント中) 33 if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: 34 if tmp == 0: 35 t1 = time.time() 36 screen.fill((255,255,255, )) 37 screen.blit(count_during, (20,350)) 38 screen.blit(tokei, rect_tokei) # 画像の描画 39 pygame.display.update() # 画面更新 40 tmp = tmp+1 41 #マウスクリック2回目の処理(結果の出力) 42 elif tmp == 1: 43 t2 = time.time()-t1-5 44 screen.fill((255,255,255, )) 45 dif = sysfont.render("difference"+str(t2), False, (0,0,0)) 46 screen.blit(dif, (20,350)) 47 pygame.display.update() 48 tmp = 0 49 50if __name__ == "__main__": 51 main() 52```python初心者で課題としてゲーム作成をしています。 53 54現在反射神経ゲームを作ろうとしたところ挫折し、ストップウォッチゲームに変更したのですが、複数プレイ後スコアの入出力を行いたいのですがゲームが1回しかできないため複数回できるようにご指摘お願いいたします。マウスクリック12回目のifがループするのは気にしないでください。 55また、dif = sysfont.render("difference"+str(t2), False, (0,0,0))の文においてstr(t2)が長くなりすぎてしまうためstr型の文字列長を短くする(見た目上は小数点の切り上げ)方法でもつまづいているためアドバイスお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

クラス化及び関数化したほうがよいよ思われますが、できるだけ元ソースを残しつつ改造してみました。
0. ハイスコア対応
0. time.time()は精度があまりよくないので、time.perf_counter()に変更
0. Enum型のGameStateを追加
0. initialize(初期化処理)とon_application_exit(終了処理)を関数化

Python

1# -*- coding: UTF-8 -* 2import sys 3import time 4import math 5from enum import Enum, unique 6import pygame 7from pygame.locals import * 8 9 10@unique 11class GameState(Enum): 12 START = 1 13 COUNT_UP = 2 14 RESULT = 3 15 16 17def initialize(): 18 (w,h) = (400,400) # 画面サイズ 19 (x,y) = (w/2, h/2) 20 pygame.init() # pygame初期化 21 pygame.display.set_mode((w, h), 0, 32) # 画面設定 22 screen = pygame.display.get_surface() 23 pygame.display.set_caption("5byoudetomete") 24 return screen 25 26 27def on_application_exit(): 28 pygame.quit() 29 sys.exit() 30 31 32def display_high_score(screen, sysfont, high_scores, score=None): 33 # ヘッダー行 34 text = sysfont.render("### High Score ####", False, (0, 0, 0)) 35 screen.blit(text, (20, 0)) 36 # 各scoreの表示 37 for i, scores in enumerate(high_scores): 38 index = i + 1 39 marker = ' ' * 3 40 if scores == score: 41 marker = '->' 42 text = "{0}{1}:{2}".format(marker, index, scores) 43 text_render = sysfont.render(text, False, (0, 0, 0)) 44 screen.blit(text_render, (20, 30 * index)) 45 46 47def main(): 48 BACKGROUND_COLOR = (255, 255, 255,)# 画面の背景色 49 STATUS_BAR = (20, 350) 50 screen = initialize() 51 # 画面設定 文字 52 sysfont = pygame.font.SysFont(None, 40) 53 # テキストを描画したSurface作成、画像の作成 54 click_start = sysfont.render("click to start", False, (0,0,0)) 55 count_during = sysfont.render("in measurement", False, (0,0,0)) 56 tokei = pygame.image.load("tokei.png").convert_alpha() 57 rect_tokei = tokei.get_rect() 58 rect_tokei.center = (200, 180) 59 screen.fill(BACKGROUND_COLOR) 60 screen.blit(click_start, STATUS_BAR) 61 pygame.display.update() # 画面更新 62 game_state = GameState.START 63 high_scores = [] 64 while True: 65 for event in pygame.event.get(): 66 # 終了用のイベント処理 67 if event.type == QUIT: # 閉じるボタンが押されたとき 68 on_application_exit() 69 continue 70 # マウスクリック1回目の処理(カウント中) 71 if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: 72 screen.fill(BACKGROUND_COLOR) # 画面の背景色 73 if game_state == GameState.START: 74 t1 = time.perf_counter() 75 screen.blit(count_during, STATUS_BAR) 76 screen.blit(tokei, rect_tokei) # 画像の描画 77 game_state = GameState.COUNT_UP #ゲームの状態を「カウントアップ」に変更 78 #マウスクリック2回目の処理(結果の出力) 79 elif game_state == GameState.COUNT_UP: 80 # 5sec 81 t2 = time.perf_counter()-t1-5 82 score = round(t2, 4) 83 dif = sysfont.render("difference:{0}".format(score), False, (0,0,0)) 84 screen.blit(dif, STATUS_BAR) 85 high_scores.append(score) 86 # math.fabsを使って0からの相対的なソートを行う 87 high_scores.sort(key=math.fabs) 88 if len(high_scores) > 5: 89 high_scores.pop() #最大5件に。 90 #ハイスコアの表示 91 display_high_score(screen, sysfont, high_scores, score) 92 93 game_state = GameState.RESULT #ゲームの状態を「リザルト」に変更 94 elif game_state == GameState.RESULT: 95 screen.blit(click_start, STATUS_BAR) 96 game_state = GameState.START #ゲームの状態を「スタート」に変更 97 else: 98 assert False, game_state 99 pygame.display.update() # 画面更新 100 continue 101 102 103if __name__ == "__main__": 104 main() 105

投稿2018/01/18 15:35

編集2018/01/18 16:43
umyu

総合スコア5846

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

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

namnium1125

2018/01/18 16:22 編集

Enum型便利そうですね。勉強になりました。m(_ _)m
umyu

2018/01/18 16:43

Enum型は使える環境(3.4以降)だと使うと便利ですー。。
modificationkey

2018/01/18 18:27

関数化によってコードを綺麗にして頂きありがとうございます。 Enum型に関して再度質問投稿、もしくはここで尋ねさせていただくかもしれません。 解答ありがとうございました!
guest

0

tmpでの場合分けを0 1ではなく、0 1 2の三段階にすればいいのではないでしょうか?

試してませんけど以下のようなコードでいけると思います。

python

1import pygame 2from pygame.locals import * 3import sys 4import time 5def main(): 6 7 (w,h) = (400,400) # 画面サイズ 8 (x,y) = (w/2, h/2) 9 pygame.init() # pygame初期化 10 11〜〜〜〜省略〜〜〜〜 12 13 if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: 14 if tmp == 0: 15 t1 = time.time() 16 screen.fill((255,255,255, )) 17 screen.blit(count_during, (20,350)) 18 screen.blit(tokei, rect_tokei) # 画像の描画 19 pygame.display.update() # 画面更新 20 #tmp = tmp+1 21 tmp += 1 22 #マウスクリック2回目の処理(結果の出力) 23 elif tmp == 1: 24 t2 = time.time()-t1-5 25 screen.fill((255,255,255, )) 26 dif = sysfont.render("difference"+str(t2), False, (0,0,0)) 27 screen.blit(dif, (20,350)) 28 pygame.display.update() 29 #tmp = 0 30 tmp += 1 31 # ここから追加 32 elif tmp == 2: 33 screen.fill((255,255,255, )) # 画面の背景色 34 screen.blit(click_start, (20,350)) 35 pygame.display.update() # 画面更新 36 tmp = 0 37 38if __name__ == "__main__": 39 main()

またt2の長さの件ですが、
例えば小数第三位で四捨五入したいなら、

python

1str(round(t2,2))

とすれば丸められます。

他にも切り捨てで良く、単純に長さだけで考えるなら、

python

1str(t2)[:4]

みたいな感じでスライス機能を使うという手もあります。ちなみに上記コードの場合ドットを含めた4文字分(例えば0.114514なら0.11)になります。

投稿2018/01/18 10:09

編集2018/01/18 10:10
namnium1125

総合スコア2043

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

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

modificationkey

2018/01/18 18:14

解答ありがとうございます round関数参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問