回答編集履歴
1
座標の計算が一部おかしかったので修正
answer
CHANGED
@@ -39,7 +39,7 @@
|
|
39
39
|
|
40
40
|
Turtleオブジェクトの生成は、他の回答者の回答にもあるように、`t.Turtle`ではなく`t.Turtle()`です。
|
41
41
|
|
42
|
-
ボールの初期位置は`ball.goto(5, 5)`のように、x座標とy座標をカンマ区切りで指定します。元のコードでは(5, 5)に設定しようとして失敗していますが、パドルで受け止め損ねて再開するときは(0, 0)に設定しているので、ここでは(0, 0)に揃えてみました。
|
42
|
+
ボールの初期位置は`ball.goto(5, 5)`のように、x座標とy座標をカンマ区切りで指定します。元のコードでは(5, 5)に設定しようとして(カンマではなくドットを書いて)失敗していますが、パドルで受け止め損ねて再開するときは(0, 0)に設定しているので、ここでは(0, 0)に揃えてみました。
|
43
43
|
|
44
44
|
なお、`ball.get_shapepoly()`で得られるリストを見ると分かりますが、ボールの半径は10ピクセル、実際には円ではなく20角形です。
|
45
45
|
|
@@ -66,28 +66,12 @@
|
|
66
66
|
+ ball.sety(ball.ycor() + ballydirection)
|
67
67
|
```
|
68
68
|
|
69
|
-
ボールのx座標を得る`ball.xcor()`や、y
|
69
|
+
ボールのx座標を得る`ball.xcor()`や、y座標を得る`ball.ycor()`には引数を指定しません。それらの返り値に対して、`ballxdirection`や`ballydirection`を加算してください。
|
70
70
|
|
71
|
-
### 画面の上下端でボールが跳ねる処理
|
72
|
-
```diff
|
73
|
-
- if ball.ycor() > 290:
|
74
|
-
- ball.sety(290)
|
75
|
-
+ if ball.ycor() > 280:
|
76
|
-
+ ball.sety(280)
|
77
|
-
ballydirection = ballydirection * -1
|
78
|
-
- if ball.ycor() < -290:
|
79
|
-
- ball.sety(-290)
|
80
|
-
+ if ball.ycor() < -280:
|
81
|
-
+ ball.sety(-280)
|
82
|
-
ballydirection = ballydirection * -1
|
83
|
-
```
|
84
|
-
|
85
|
-
ボールの半径が10ピクセル(直径は20ピクセル)、画面の高さが600ピクセルなので、概算で(-300, 300)の範囲と見なし、ボールの一部が画面からはみ出さないように、±280を比較対象としています。
|
86
|
-
|
87
71
|
### 画面の左右端でボールを消して中央に戻し、得点を加算する処理
|
88
72
|
```diff
|
89
73
|
- if (ball.xcor()) < -390:
|
90
|
-
+ if ball.xcor() < -
|
74
|
+
+ if ball.xcor() < -390:
|
91
75
|
ball.goto(0, 0)
|
92
76
|
ballxdirection = ballxdirection * -1
|
93
77
|
- playerAscore = playerBscore + 1
|
@@ -96,7 +80,7 @@
|
|
96
80
|
- pen.write("player A:{} player B:{}".format(playerAscore, playerBscore), align='center', font=('Arial', 24, 'normal'))
|
97
81
|
+ pen.write(f"player A:{playerAscore} player B:{playerBscore}", align='center', font=('Arial', 24, 'normal'))
|
98
82
|
|
99
|
-
+ if ball.xcor() >
|
83
|
+
+ if ball.xcor() > 390:
|
100
84
|
+ ball.goto(0, 0)
|
101
85
|
+ ballxdirection = ballxdirection * -1
|
102
86
|
+ playerBscore += 1
|
@@ -105,7 +89,7 @@
|
|
105
89
|
+
|
106
90
|
```
|
107
91
|
|
108
|
-
ボールの半径が10ピクセル(直径は20ピクセル)、画面の幅が800ピクセルなので、概算で(-400, 400)の範囲と見なし、ボールの一部が画面からはみ出さないように、±
|
92
|
+
ボールの半径が10ピクセル(直径は20ピクセル)、画面の幅が800ピクセルなので、概算で(-400, 400)の範囲と見なし、ボールの一部が画面からはみ出さないように、±390を比較対象としています。
|
109
93
|
|
110
94
|
元のソースでは、左端での処理しか書いていなかったので、右端での処理を追加します。`playerAscore = playerBscore + 1`なんて書いてありました。`+=`を使えば、右辺に同じ変数名を書かずに、値の更新を明示できます。
|
111
95
|
|