回答編集履歴

4

説明追記

2022/09/05 16:28

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -1,6 +1,6 @@
1
1
  tkinter は tk.mainloop() を呼び出さないとイベント処理や描画処理をしませんよ。
2
- time.sleep() は使ってはいけません。
3
- 時間制御は ウィジェット.after() を使って行います。
2
+ time.sleep() は使ってはいけません。時間制御は ウィジェット.after() を使って行います。
3
+ マウスイベントやタイマーイベントなどに応じて動作するイベントドリブンな作りにしましょう。
4
4
 
5
5
  ```python
6
6
  from tkinter import*

3

終了条件追加

2022/09/05 16:21

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -74,7 +74,7 @@
74
74
 
75
75
 
76
76
  def repeat():
77
- if paddle.started:
77
+ if paddle.started and not ball.hit_bottom:
78
78
  ball.move()
79
79
  paddle.move()
80
80
  tk.after(20, repeat)

2

説明修正

2022/09/05 16:19

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -1,6 +1,6 @@
1
- tkinter は root.mainloop() を呼び出さないとイベント処理や描画処理をしませんよ。
1
+ tkinter は tk.mainloop() を呼び出さないとイベント処理や描画処理をしませんよ。
2
- time.sleep() 使うこともできません。
2
+ time.sleep() 使ってはいけません。
3
- 時間制御は root.after() などを使って行います。
3
+ 時間制御は ウィジェット.after() を使って行います。
4
4
 
5
5
  ```python
6
6
  from tkinter import*

1

コード追記

2022/09/05 16:17

投稿

shiracamus
shiracamus

スコア5406

test CHANGED
@@ -2,4 +2,95 @@
2
2
  time.sleep() を使うこともできません。
3
3
  時間制御は root.after() などを使って行います。
4
4
 
5
+ ```python
6
+ from tkinter import*
7
+ import random
5
8
 
9
+
10
+ class Ball:
11
+ def __init__(self, canvas, paddle, color):
12
+ self.canvas = canvas
13
+ self.paddle = paddle
14
+ self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
15
+ self.canvas.move(self.id, 245, 100)
16
+ starts = [-3, -2, -1, 1, 2, 3]
17
+ random.shuffle(starts)
18
+ self.x = starts[0]
19
+ self.y = -3
20
+ self.canvas_height = self.canvas.winfo_height()
21
+ self.canvas_width = self.canvas.winfo_width()
22
+ self.hit_bottom = False
23
+
24
+ def hit_paddle(self, pos):
25
+ paddle_pos = self.canvas.coords(self.paddle.id)
26
+ if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
27
+ if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
28
+ return True
29
+ return False
30
+
31
+ def move(self):
32
+ self.canvas.move(self.id, self.x, self.y)
33
+ pos = self.canvas.coords(self.id)
34
+ if pos[1] <= 0:
35
+ self.y = 3
36
+ if pos[3] >= self.canvas_height:
37
+ self.hit_bottom = True
38
+ if self.hit_paddle(pos) == True:
39
+ self.y = -3
40
+ if pos[0] <= 0:
41
+ self.x = 3
42
+ if pos[2] >= self.canvas_width:
43
+ self.x = -3
44
+
45
+
46
+ class Paddle:
47
+ def __init__(self, canvas, color):
48
+ self.canvas = canvas
49
+ self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
50
+ self.canvas.move(self.id, 200, 300)
51
+ self.x = 0
52
+ self.canvas_width = self.canvas.winfo_width()
53
+ self.started = False
54
+ self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
55
+ self.canvas.bind_all('<KeyPress-Right>', self.turn_right)
56
+ self.canvas.bind_all('<Button-1>', self.start_game)
57
+
58
+ def turn_left(self, evt):
59
+ self.x = -2
60
+
61
+ def turn_right(self, evl):
62
+ self.x = 2
63
+
64
+ def start_game(self, evt):
65
+ self.started = True
66
+
67
+ def move(self):
68
+ self.canvas.move(self.id, self.x, 0)
69
+ pos = self.canvas.coords(self.id)
70
+ if pos[0] <= 0:
71
+ self.x = 0
72
+ elif pos[2] >= self.canvas_width:
73
+ self.x = 0
74
+
75
+
76
+ def repeat():
77
+ if paddle.started:
78
+ ball.move()
79
+ paddle.move()
80
+ tk.after(20, repeat)
81
+
82
+
83
+ tk = Tk()
84
+ tk.title("Game")
85
+ tk.resizable(0, 0)
86
+ tk.wm_attributes("-topmost", 1)
87
+ canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
88
+ canvas.pack()
89
+ tk.update()
90
+ paddle = Paddle(canvas, 'blue')
91
+ ball = Ball(canvas, paddle, 'red')
92
+
93
+ tk.after(20, repeat)
94
+ tk.mainloop()
95
+ ```
96
+