回答編集履歴
4
説明追記
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
終了条件追加
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
説明修正
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
tkinter は
|
1
|
+
tkinter は tk.mainloop() を呼び出さないとイベント処理や描画処理をしませんよ。
|
2
|
-
time.sleep()
|
2
|
+
time.sleep() は使ってはいけません。
|
3
|
-
時間制御は
|
3
|
+
時間制御は ウィジェット.after() を使って行います。
|
4
4
|
|
5
5
|
```python
|
6
6
|
from tkinter import*
|
1
コード追記
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
|
+
|