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

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

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

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

Q&A

解決済

1回答

997閲覧

ブロック崩しでブロックが消えないのはなぜ?

likelive.geo

総合スコア23

Python

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

0グッド

0クリップ

投稿2020/04/30 05:02

https://news.mynavi.jp/article/zeropython-10/

こちらのサイトからプログラムをダウンロードをして、動かしてみたのですが、

ボールが当たってもブロックが消えない時があります。

なぜでしょう?

Python

1 2 # ブロック崩し 3from tkinter import * 4import random 5 6# ゲーム中で使う変数の一覧 7blocks = [] 8block_size = {"x": 75, "y": 30} 9ball = {"dirx": 15, "diry": -15, "x": 350, "y": 300, "w": 10} 10bar = {"x": 0, "w": 100} 11is_gameover = False 12point = 0 13 14# ウィンドウの作成 15win = Tk() 16cv = Canvas(win, width = 600, height = 400) 17cv.pack() 18 19# ゲームの初期化 20def init_game(): 21 global is_gameover, point 22 is_gameover = False 23 ball["y"] = 250 24 ball["diry"] = -10 25 point = 0 26 # ブロックを配置する 27 for iy in range(0, 5): 28 for ix in range(0, 8): 29 color = "red" 30 if (iy + ix) % 2 == 1: color = "blue" 31 x1 = 4 + ix * block_size["x"] 32 x2 = x1 + block_size["x"] 33 y1 = 4 + iy * block_size["y"] 34 y2 = y1 + block_size["y"] 35 blocks.append([x1, y1, x2, y2, color]) 36 win.title("START") 37 38# オブジェクトを描画する 39def draw_objects(): 40 cv.delete('all') # 既存の描画を破棄 41 cv.create_rectangle(0, 0, 600, 400, fill="black", width=0) 42 # ブロックを一つずつ描画 43 for w in blocks: 44 x1, y1, x2, y2, c = w 45 cv.create_rectangle(x1, y1, x2, y2, fill=c, width=0) 46 # ボールを描画 47 cv.create_oval(ball["x"] - ball["w"], ball["y"] - ball["w"], 48 ball["x"] + ball["w"], ball["y"] + ball["w"], fill="green") 49 # バーを描画 50 cv.create_rectangle(bar["x"], 390, bar["x"] + bar["w"], 400, 51 fill="yellow") 52 53# ボールの移動 54def move_ball(): 55 global is_gameover, point 56 if is_gameover: return 57 bx = ball["x"] + ball["dirx"] 58 by = ball["y"] + ball["diry"] 59 # 上左右の壁に当たった? 60 if bx < 0 or bx > 600: ball["dirx"] *= -1 61 if by < 0: ball["diry"] *= -1 62 # プレイヤーの操作するバーに当たった? 63 if by > 380 and (bar["x"] <= bx <= (bar["x"] + bar["w"])): 64 ball["diry"] *= -1 65 if random.randint(0, 1) == 0: ball["dirx"] *= -1 66 by = 380 67 # ボールがブロックに当たった? 68 hit_i = -1 69 for i, w in enumerate(blocks): 70 x1, y1, x2, y2, color = w 71 w3 = ball["w"] 72 if (x1-w3 <= bx <= x2+w3) and (y1-w3 <= by <= y2+w3): 73 hit_i = i 74 break 75 if hit_i >= 0: 76 del blocks[hit_i] 77 if random.randint(0, 1) == 0: ball["dirx"] *= -1 78 ball["diry"] *= -1 79 point += 10 80 win.title("GAME SCORE = " + str(point)) 81 # ゲームオーバー? 82 if by >= 400: 83 win.title("Game Over!! score=" + str(point)) 84 is_gameover = True 85 if 0 <= bx <= 600: ball["x"] = bx 86 if 0 <= by <= 400: ball["y"] = by 87 88def game_loop(): 89 draw_objects() 90 move_ball() 91 win.after(50, game_loop) 92 93# マウスイベントの処理 94def motion(e): # マウスポインタの移動 95 bar["x"] = e.x 96def click(e): # クリックでリスタート 97 if is_gameover: init_game() 98# マウスイベントを登録 99win.bind('<Motion>', motion) 100win.bind('<Button-1>', click) 101# ゲームのメイン処理 102init_game() 103game_loop() 104win.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

クリックで二回目以降を遊んだときですね。init_gameでブロックを配置する前にblocksを空にしていないので、前回の配置情報が残り、前回消さなかったブロックは残っている情報が消えきるまで弾を当てないと消えなくなるのでしょう。init_gameの中で配置する前にblocks.clear()とか呼んであげてください。

投稿2020/04/30 05:18

hayataka2049

総合スコア30933

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

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

likelive.geo

2020/04/30 05:53

前の情報が残っていたから、消えてないように見えてただけなんですね。 blocks.clear()を追加したら、ちゃんと消えるようになりました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問