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

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

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

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

解決済

1回答

2450閲覧

python ブロック崩しで、ブロックを一つ崩す度ボールの色を変えたいです。

gabriel.r.n

総合スコア8

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

0クリップ

投稿2020/10/04 11:24

調べても他にやっている方がおらず分かりませんでした。
やり方としては、if文の中に含めれば良いのでしょうか?

python

1コード 2```import tkinter as tk 3import sys 4 5 #基本設定 6 7win_width = 600 #ウインドウサイズ(x) 8win_height = 480 #ウインドウサイズ(y) 9win_center_x = win_width/2 #画面のセンター(x座標) 10win_center_y = win_height/2 11tick = 40 #ティック数(ミリ秒) 12 13root = tk.Tk() 14root.title(u"ブロック崩し") 15root.geometry("600x480") 16cv = tk.Canvas(root, width = win_width, height = win_height) #キャンバスの作成 17cv.pack() #パック 18 #基本設定 19 20 #ボールのクラス 21class Ball: 22 x = 500 #ボールの中心のX座標(初期値) 23 y = 150 #ボールの中心のY座標(初期値)                               24 w = 20 #ボールの幅 25 26 dx = dy = 4 #移動量(X),移動量(Y) 27 color = "pink", # ボールの色 28 def draw(self): #図形描画、 (cv.create_oval) 円を描く関数  (fill) 内部を塗りつぶす色 (tag) 一描画ごとに図形を消す 29 cv.create_oval(self.x-self.w, self.y-self.w, self.x+self.w, self.y+self.w, fill = self.color, tag = "ball") 30 cv.pack() 31 def move(self): 32 #移動 33 self.x += self.dx 34 self.y += self.dy 35 #ボールVS壁 36 if self.x - self.w < 0 or self.x + self.w > win_width: 37 self.dx *= -1 38 if self.y - self.w < 0 or self.y + self.w > win_height: 39 self.dy *= -1 40 41 #ボールVSパドル 42 if self.y + self.w > paddle.y - paddle.wy and ball.x > paddle.x-paddle.wx and ball.x < paddle.x+paddle.wx: 43 self.dy *= -1 44 45 def delete(self): 46 cv.delete("ball") 47 #ボールのクラス 48 49 #パドルのクラス 50class Paddle: 51 x = win_center_x #パドルの初期値(y座標) 52 y = win_height - 30 #パドルの初期値(x座標) 53 wx = 45 #パドルの幅(x座標) 54 wy = 8 #パドルの幅(y座標) 55 dx = 6 #パドルの移動量(x成分) 56 color = "blue" 57 def draw(self): 58 cv.create_rectangle(self.x-self.wx,self.y-self.wy,self.x+self.wx,self.y+self.wy, fill = self.color, tag = "paddle") 59 60 def right(self,event): 61 cv.delete("paddle") 62 self.x += self.dx 63 self.draw() 64 def left(self,event): 65 cv.delete("paddle") 66 self.x -= self.dx 67 self.draw() 68 69 def move(self): 70 root.bind("<Right>",self.right) 71 root.bind("<Left>",self.left) 72 #パドルのクラス 73 74 #ブロックのクラス 75class Block: 76 w_x = 100 #ブロックの幅(x座標) 77 w_y = 30 #ブロックの幅(y座標) 78 global dy, score #衝突の際にボールのクラスの移動量およびスコアを変更したいので、グローバル宣言を行う。 79 80 #ブロックのスイッチ。1がON,0がOFF 81 block_list =[[1,1,1,1,1,1,1,1,1,1,1,1], # j = 0 , i = 0 ~ 11 82 [1,1,1,1,1,1,1,1,1,1,1,1], # j = 1 , i = 0 ~ 11 83 [1,1,1,1,1,1,1,1,1,1,1,1]] # j = 2 , i = 0 ~ 11 行・列の順番 84 def draw(self): 85 for i in range(6): 86 for j in range(3): 87 cv.create_rectangle(i*self.w_x, j*self.w_y, (i+1)*self.w_x, (j+1)*self.w_y, fill = "orange", tag = "block"+str(j)+str(i)) 88 89 def reflect(self): 90 for i in range(12): 91 for j in range(3): 92 #ボールが上から反射 93 if (ball.y-ball.w < (j+1)*self.w_y #ボールがブロックよりも下 94 and i*self.w_x < ball.x < (i+1)*self.w_x #ボールがブロックの左右に挟まれている 95 and self.block_list[j][i] == 1): #スイッチが1 96 ball.dy *= -1 #反射させる 97 cv.delete("block"+str(j)+str(i)) #ブロックの描画を消す 98 self.block_list[j][i] = 0 #スイッチを切る 99 score.score += 1 #スコアの加点 100 score.delete() #スコアを更新(削除-生成) 101 score.draw() 102 #ブロックのクラス 103 104 #スコアのクラス 105class Score(): 106 score = 0 #スコアの初期値 107 def draw(self): 108 cv.create_text(win_width - 50, 50, text = "Score = " +str(self.score), font = ('FixedSys', 16), tag = "score") 109 def delete(self): 110 cv.delete("score") 111 #スコアのクラス 112 113 #ゲームオーバーのメソッド 114def gameover(): 115 global w, dx, dy 116 if ball.y + ball.w > win_height : 117 cv.delete("paddle") 118 cv.delete("ball") 119 cv.create_text(win_center_x, win_center_y, text = "GAME OVER(T_T)", font = ('FixedSys', 40)) 120 ball.w = 0 121 ball.dx = 0 122 ball.dy = 0 123 #ゲームオーバーのメソッド 124 125 #ゲームクリアのメソッド 126def gameclear(): 127 global w, dx, dy 128 if score.score == 18 : 129 cv.delete("paddle") 130 cv.delete("ball") 131 cv.create_text(win_center_x, win_center_y, text = "GAME CLEAR(^0^)", font = ('FixedSys', 40)) 132 ball.w = 0 133 ball.dx = 0 134 ball.dy = 0 135 136 137 #インスタンス生成 138paddle = Paddle() #パドル 139ball = Ball() #ボール 140block = Block() #ブロッ 141score = Score() #スコア 142 #インスタンス生成 143 144 #初期描画 145ball.draw() #ボール 146paddle.draw() #パドル 147block.draw() #ブロック 148score.draw() #スコア 149 #初期描画 150 151 #ゲームのメインループ 152def gameloop(): 153 ball.delete() #ボールを消す 154 ball.move() #ボールを動かす 155 paddle.move() #ボールを動かす 156 block.reflect() #ボールを反射させ、ブロックを消す 157 ball.draw() #ボールを描く 158 gameover() #ゲームオーバーを表示させる 159 gameclear() #ゲームクリアを表示させる 160 root.after(tick, gameloop) #50ミリ秒経過後,ループの最初に戻る 161 #ゲームのメインループ 162 163 #メインの実行部分 164gameloop() 165root.mainloop() #画面を表示 166 #メインの実行部分

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

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

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

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

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

guest

回答1

0

ベストアンサー

ブロックのクラス
def reflect(self):
内の
ball.dy *= -1 #反射させる
の後で色を更新
ball.color = "green"
等でいいのでは?

投稿2020/10/04 12:27

lehshell

総合スコア1156

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

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

gabriel.r.n

2020/10/04 12:55

ありがとうございます! こんな簡単なことで済むとは驚きでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問