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

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

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

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

Q&A

1回答

1068閲覧

ブロック崩しの難易度選択について

Rena_StarPrince

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/10/15 15:49

先ほども質問させていただきましたが、やり方を間違えしまい連投させていただきました。すみません。
↓のコードの☆の個所の数値を変えたら、フレームレートが変わりブロック崩しの玉の速度が速くなるはずなのですが、
難易度選択のためにシーン切り替えのプログラムを追加したら遅くなってしまいました。玉の速度をもっと早くするにはどうすばよいでしょうか。

Python

1#ブロック崩し 2 3import tkinter as tk 4from tkinter import messagebox 5 6#変数(追加) 7score=0 8time=0 9index=0 10 11#キー 12key="" 13def key(e): 14 global key 15 key=e.keysym 16 17#ウィンドウ 18win=tk.Tk() 19win.title("ブロック崩し") 20win.geometry("425x625") 21win.resizable 22win.bind("<KeyPress>", key) 23 24#キャンバス 25can=tk.Canvas(bg="black",width=400,height=600) 26can.place(x=10,y=10) 27 28 29#ゲームオーバー 30def gameOver(): 31 if index==1: 32 messagebox.showinfo("Information","GAME OVER") 33 exit() 34 35#ゲームクリア 36def gameClear(): 37 if index==1: 38 messagebox.showinfo("Information","CONGRATURATIONS") 39 exit() 40 41#ボール 42ball_x=50 43ball_y=500 44bx=5 45by=-5 46def drawBall(): 47 global ball_x 48 global ball_y 49 global bx 50 global by 51 can.create_oval(ball_x,ball_y,ball_x+20,ball_y+20,fill="white") 52 if ball_x<=0 or ball_x>=385: 53 bx *=-1 54 if ball_y<=0: 55 by *= -1 56 if ball_y>=600: 57 gameOver() 58 if ball_y>=560 and ball_x>=rack_x-10 and ball_x<=rack_x+70: 59 by *=-1 60 61 ball_x += bx;ball_y += by 62 63#ラケット 64rack_x=170 65keyPress_R=False 66keyPress_L=False 67def rightKeyPress(event): 68 global keyPress_R 69 keyPress_R=True 70def rightKeyRelease(event): 71 global keyPress_R 72 keyPress_R=False 73def leftKeyPress(event): 74 global keyPress_L 75 keyPress_L=True 76def leftKeyRelease(event): 77 global keyPress_L 78 keyPress_L=False 79win.bind("<KeyPress-Right>",rightKeyPress) 80win.bind("<KeyRelease-Right>",rightKeyRelease) 81win.bind("<KeyPress-Left>",leftKeyPress) 82win.bind("<KeyRelease-Left>",leftKeyRelease) 83 84 85def drawRacket(): 86 global rack_x 87 can.create_rectangle(rack_x,580,rack_x+60,595,fill="white") 88 if keyPress_R==True and rack_x<=350: 89 rack_x +=5 90 if keyPress_L==True and rack_x>=-10: 91 rack_x-=5 92 93#ブロック 94block=[] 95for x in range(5): 96 for y in range(4): 97 block.append({"x":x*80+5,"y":y*40+10,"st":1}) 98def drawBlock(): 99 global ball_x 100 global ball_y 101 global by 102 global score#(追加) 103 block_count=0 104 for i in range(len(block)): 105 x=block[i]["x"] 106 y=block[i]["y"] 107 st=block[i]["st"] 108 if ball_y<=y+30 and ball_x>=x-10 and ball_x<=x+60 and st==1: 109 by*=-1 110 block[i]["st"]=0 111 score=score+10#(追加) 112 if st==1: 113 can.create_rectangle(x,y,x+70,y+30,fill="white") 114 block_count+=1 115 if block_count==0: 116 gameClear() 117 118#スコア(追加) 119def drawScore(): 120 can.create_text(25,550,text="SCORE:"+str(score),fill="white") 121 122#時間 123def drawTime(): 124 can.create_text(25,570,text="Time:"+str(time),fill="white") 125 126#画面推移(追加) 127def gamemain(): 128 global index 129 if index==0: 130 can.create_text(200,100,text="ブロック崩し",anchor="center",font=("HG丸ゴシックM-PRO",24),fill="white") 131 can.create_text(200,500,text="Press [E]easy",anchor="center",font=("HG丸ゴシックM-PRO",24),fill="white") 132 can.create_text(200,535,text="[N]Normal",anchor="center",font=("HG丸ゴシックM-PRO",24),fill="white") 133 can.create_text(200,570,text="[H]Hard",anchor="center",font=("HG丸ゴシックM-PRO",24),fill="white") 134 if key=="e": 135 index=1 136 elif key=="n": 137 index=2 138 elif key=="h": 139 index=3 140 can.after(15,gamemain) 141 142 elif index==1: 143 def gameLoop1(): 144 can.delete("all") 145 drawBall() 146 drawRacket() 147 drawBlock() 148 drawScore()#(追加) 149 drawTime()#追加 150 win.after(30,gameLoop1)#☆☆☆☆☆☆☆☆☆☆ 151 gameLoop1() 152 153 elif index==2: 154 def gameLoop2(): 155 can.delete("all") 156 drawBall() 157 drawRacket() 158 drawBlock() 159 drawScore()#(追加) 160 drawTime()#追加 161 win.after(15,gameLoop2)#☆☆☆☆☆☆☆☆☆☆ 162 gameLoop2() 163 164 elif index==3: 165 def gameLoop3(): 166 can.delete("all") 167 drawBall() 168 drawRacket() 169 drawBlock() 170 drawScore()#(追加) 171 drawTime()#追加 172 win.after(5,gameLoop3)#☆☆☆☆☆☆☆☆☆☆ 173 gameLoop3() 174 175#表示ループ 176gamemain() 177 178 179#ウィンドウループ 180win.mainloop 181

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

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

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

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

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

guest

回答1

0

フレームレートが変わりブロック崩しの玉の速度が速くなるはずなのですが、

フレームレートは変更せずに、1フレーム毎の玉の移動距離を変更しましょう。


遅くなる原因は、
描画更新の方法が、1フレーム単位で毎回、生成・削除となっている為、
フレームレートを上げるとその分処理が増え、
タイマーの間隔以内に処理が終わらない場合、遅延が発生します。

改善方法
生成は最初のみにし、戻り値を控えて、キャンバスの coords メソッドで、
描画されているオブジェクトの座標を移動させるようにすれば、
幾分か改善するはずです。

python

1## 生成・削除 ... 現在の実装方法 2 3# 初期化: キャンバスをクリア 4canvas.delete("all") 5 6# 移動: 毎回新しい座標に生成することで移動しているように見せかける 7canvas.create_oval(ball_x,ball_y,ball_x+20,ball_y+20,fill="white") 8 9 10 11## 生成済のオブジェクトの座標を移動 12 13# 初期化時に生成(1度のみ) 14ball_id = canvas.create_oval(0, 0, 20, 20, fill="white") 15 16# 移動は生成済オブジェクトの座標変更で行う 17canvas.coords(ball_id, ball_x, ball_y, ball_x+20, ball_y+20) 18

投稿2021/10/15 20:50

teamikl

総合スコア8664

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

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

Rena_StarPrince

2021/10/16 17:07

回答ありがとうございます。 問題点とコードの内容については理解することができたのですが、このコードを実際どこに記載すればよいかがわかりません。 お尋ねしてもよろしいでしょうか。
Rena_StarPrince

2021/10/16 17:25

すみません。上の問題は解決しました。難易度選択にしたい場合は、このボールの関数を3つ作り、それを難易度ごとに割り当てるということでよろしいでしょうか。何分初心者なもので申し訳ございません。
Rena_StarPrince

2021/10/16 18:12

連投すみません。すべて解決いたしました!!本当にありがとうございました。これからも頑張ってPython勉強します!!
teamikl

2021/10/17 01:59

解決したようですが、気になった点 > このボールの関数を3つ作り、それを難易度ごとに割り当てる ここは、関数を3つ作るのではなく、移動距離を変数にして、 難易度選択では変数の値を変えるだけにした方が良いです。 同じような関数をコピーでたくさん作ると、コードの保守性が悪くなります。 例えば、delete("all")/create_ ~ の修正は 一つの関数で処理していれば、1箇所のみの変更で済みますが 難易度毎に関数を作っていると変更箇所も複数に渡り、 特定の難易度でのみ発生するバグを生み出す要因にもなりえます。 別関数に別けた方が良いケースも勿論ありますが、 コピーするような場合は殆ど、一つの関数で処理できるはずなので、 検討してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問