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

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

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

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

772閲覧

pyhon attribute error の原因を探っています

rawr

総合スコア1

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2021/09/06 01:18

編集2021/09/06 05:56

前提・実現したいこと

初心者です。
pythonでtrurtle をimportしピンポンゲームを作っています。

発生している問題・エラーメッセージ

Python

1Traceback (most recent call last): 2 File "C:\Users\1200728\Desktop\test\test.py", line 29, in <module> 3 ball.speed(0) 4 File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2032.0_x64__qbz5n2kfra8p0\lib\turtle.py", line 2168, in speed 5 return self._speed 6AttributeError: 'int' object has no attribute '_speed' 7 8### 該当のソースコード 9import turtle as t 10playerAscore=0 11playerBscore=0 12window=t.Screen() 13window.title=("pong game") 14window.bgcolor("green") 15window.setup(width=800,height=600) 16window.tracer(0) 17 18 19leftpaddle=t.Turtle() 20leftpaddle.speed(0) 21leftpaddle.shape("square") 22leftpaddle.color("white") 23leftpaddle.shapesize(stretch_wid=5,stretch_len=1) 24leftpaddle.penup() 25leftpaddle.goto(-350,0) 26 27rightpaddle=t.Turtle() 28rightpaddle.speed(0) 29rightpaddle.shape("square") 30rightpaddle.color("white") 31rightpaddle.shapesize(stretch_wid=5,stretch_len=1) 32rightpaddle.penup() 33rightpaddle.goto(-350,0) 34 35 36ball=t.Turtle 37ball.speed(0) 38ball.shape("circle") 39ball.color("red") 40ball.penup() 41ball.goto(5.5) 42ballxdirection=0.2 43ballydirection=0.2 44 45 46pen=t.Turtle 47pen.speed(0) 48pen.color("Blue") 49pen.penup() 50pen.hideturtle() 51pen.goto(0,260) 52pen.write("score",align="center",font=('Arial',24,'Normal' )) 53 54 55def leftpaddleup(): 56 y=leftpaddle.ycor() 57 y=y+90 58 leftpaddle.sety(y) 59 60def leftpaddledown(): 61 y=leftpaddle.ycor() 62 y=y-90 63 leftpaddle.sety(y) 64 65def rightpaddleup(): 66 y=rightpaddle.ycor() 67 y=y+90 68 rightpaddle.sety(y) 69 70def rightpaddledown(): 71 y=rightpaddle.ycor() 72 y=y-90 73 rightpaddle.sety(y) 74 75 76window.listen() 77window.onkeypress(leftpaddleup,'w') 78window.onkeypress(leftpaddledown,'s') 79window.onkeypress(rightpaddleup,'Up') 80window.onkeypress(leftpaddledown,'Down') 81 82while True: 83 window.update() 84 85 86 ball.setx(ball.xcor(+ballxdirection)) 87 ball.sety(ball.ycor(+ballydirection)) 88 89 if ball.ycor()>290: 90 ball.sety(290) 91 ballydirection=ballydirection*-1 92 if ball.ycor()<-290: 93 ball.sety(-290) 94 ballydirection=ballydirection*-1 95 96 if (ball.xcor())<-390: 97 ball.goto(0,0) 98 ballxdirection=ballxdirection*-1 99 playerAscore=playerBscore+1 100 pen.clear() 101 pen.write("player A:{} player B:{}".format(playerAscore,playerBscore),align='center',font=('Arial',24,'normal')) 102 103 104 if (ball.xcor()>340)and(ball.xcor()<350)and(ball.ycor()<rightpaddle.ycor()+40 and ball.ycor()>rightpaddle.ycor()-40): 105 ball.setx(340) 106 ballxdirection=ballxdirection*-1 107 108 109 if (ball.xcor()<-340)and(ball.xcor()<-350)and(ball.ycor()<leftpaddle.ycor()+40 and ball.ycor()>leftpaddle.ycor()-40): 110 ball.setx(340) 111 ballxdirection=ballxdirection*-1

試したこと

その前に出ていたsyntax errorはすべて修正しました。
AttributeErrorについてたくさん調べたのですがよくわかりません。
親切な方、ご回答お願い致しますm(__)m

補足情報(FW/ツールのバージョンなど)

python version 3.9

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

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

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

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

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

meg_

2021/09/06 01:30

・コードは「コードの挿入」で記入してください。 ・タイトルに初心者と書くよりも初心者マークを着けた方が良いかと思います。
rawr

2021/09/06 01:37

ありがとうございます。修正しました。
1T2R3M4

2021/09/06 01:45

ball,penと leftpaddle,rightpaddleのソースコード上の違いは把握されてますか。
Daregada

2021/09/06 01:57 編集

> ありがとうございます。修正しました。 コード部分の修正に失敗していますね。 1. コードを載せたい位置に空行(何も書いていない行)を作り、そこをクリックしてから「<code>」ボタンを押す。 2. 「ここに言語を入力」の文字を全て消して、先頭の「```」の直後に「Python」と書く→挿入部分の先頭行は「```Python」となる。 3. 「コード」の文字を全て消して、あなたがコードを書いているアプリ(VSCodeなど)から、コードを全てコピーし、貼り付ける。 4. 貼り付けたコードの末尾に、「```」だけの行があることを確認する。もし、コードの末尾の行と「```」が1行に繋がっていたら、間をクリックしてEnterキーで分離する→挿入部分の末尾行は「```」になる。 5. 下に表示されるプレビューで表示を確認する。四角い灰色の領域の中にコードだけが表示されます。
y_waiwai

2021/09/06 02:30

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
rawr

2021/09/06 05:57

<code>ボタンの存在を知りませんでした(>_<)教えてくださってありがとうございます!
rawr

2021/09/06 06:00

>>ball,penと leftpaddle,rightpaddleのソースコード上の違いは把握されてますか。 えっとそれぞれの機能を表していることはわかります。 詳しいことは把握しているかどうか。。。
guest

回答2

0

ベストアンサー

質問文に現在(2021-09-06 22:00:00)提示されているソースコードを元に、一応ゲームっぽく動く状態したソースコードとの差分を示します。

なお、先頭の「-」は修正前(削除する行)、「+」は修正後(追加する行)を意味します。「+」や「-」は実際には付きません。

右パドルの初期位置

diff

1-rightpaddle.goto(-350, 0) 2+rightpaddle.goto(350, 0)

rightpaddleの位置が画面左側(leftpaddleと同じ)「-350」になっています。中央を挟んで画面右側の「350」に修正します。

なお、leftpaddle.get_shapepoly()leftpaddle.get_shapepoly()で得られるリストを見ると分かりますが、パドルはどちらも幅20ピクセル、高さ100ピクセルです。

ボールとペンのオブジェクト

diff

1-ball = t.Turtle 2+ball = t.Turtle() 3 ball.speed(0) 4 ball.shape("circle") 5 ball.color("red") 6 ball.penup() 7-ball.goto(5.5) 8+ball.goto(0, 0) 9 ballxdirection = 0.2 10 ballydirection = 0.2 11 12 13-pen = t.Turtle 14+pen = t.Turtle() 15 pen.speed(0) 16 pen.color("Blue") 17 pen.penup() 18 pen.hideturtle() 19 pen.goto(0, 260) 20-pen.write("score", align="center", font=('Arial', 24, 'Normal')) 21+pen.write(f"player A:{playerAscore} player B:{playerBscore}", align='center', font=('Arial', 24, 'normal'))

Turtleオブジェクトの生成は、他の回答者の回答にもあるように、t.Turtleではなくt.Turtle()です。

ボールの初期位置はball.goto(5, 5)のように、x座標とy座標をカンマ区切りで指定します。元のコードでは(5, 5)に設定しようとして(カンマではなくドットを書いて)失敗していますが、パドルで受け止め損ねて再開するときは(0, 0)に設定しているので、ここでは(0, 0)に揃えてみました。

なお、ball.get_shapepoly()で得られるリストを見ると分かりますが、ボールの半径は10ピクセル、実際には円ではなく20角形です。

また、ペンで文字を描画する処理では、fontの設定中の'Normal''normal'と小文字で書く必要があります。0対0から点数を表示するために、後に書いているスコア表示部分と揃えてみました。

文字列中に変数の値を埋め込むときは、"{}".format(変数名)を使うより、f"{変数名}"を使ったほうが読みやすくなります。

↓キーに対する関数割り当て

diff

1 window.onkeypress(leftpaddleup, 'w') 2 window.onkeypress(leftpaddledown, 's') 3 window.onkeypress(rightpaddleup, 'Up') 4-window.onkeypress(leftpaddledown, 'Down') 5+window.onkeypress(rightpaddledown, 'Down')

↓キー(Down)を押したときに右側のパドルを下に移動させるはずが、leftpaddledownを割り当てているために左側のパドルが下に移動してしまいます。rightpaddledownを割り当ててください。

ボールの移動処理

diff

1- ball.setx(ball.xcor(+ballxdirection)) 2- ball.sety(ball.ycor(+ballydirection)) 3+ ball.setx(ball.xcor() + ballxdirection) 4+ ball.sety(ball.ycor() + ballydirection)

ボールのx座標を得るball.xcor()や、y座標を得るball.ycor()には引数を指定しません。それらの返り値に対して、ballxdirectionballydirectionを加算してください。

画面の左右端でボールを消して中央に戻し、得点を加算する処理

diff

1- if (ball.xcor()) < -390: 2+ if ball.xcor() < -390: 3 ball.goto(0, 0) 4 ballxdirection = ballxdirection * -1 5- playerAscore = playerBscore + 1 6+ playerAscore += 1 7 pen.clear() 8- pen.write("player A:{} player B:{}".format(playerAscore, playerBscore), align='center', font=('Arial', 24, 'normal')) 9+ pen.write(f"player A:{playerAscore} player B:{playerBscore}", align='center', font=('Arial', 24, 'normal')) 10 11+ if ball.xcor() > 390: 12+ ball.goto(0, 0) 13+ ballxdirection = ballxdirection * -1 14+ playerBscore += 1 15+ pen.clear() 16+ pen.write(f"player A:{playerAscore} player B:{playerBscore}", align='center', font=('Arial', 24, 'normal')) 17+

ボールの半径が10ピクセル(直径は20ピクセル)、画面の幅が800ピクセルなので、概算で(-400, 400)の範囲と見なし、ボールの一部が画面からはみ出さないように、±390を比較対象としています。

元のソースでは、左端での処理しか書いていなかったので、右端での処理を追加します。playerAscore = playerBscore + 1なんて書いてありました。+=を使えば、右辺に同じ変数名を書かずに、値の更新を明示できます。

今回は修正個所が膨大になるためやりませんでしたが、ballxdirection = ballxdirection * -1ballxdirection *= -1と短く書けます。

左右のパドルとボールの接触判定とボールが跳ねる処理

diff

1- if (ball.xcor() > 340) and (ball.xcor() < 350) and (ball.ycor() < rightpaddle.ycor() + 40 and ball.ycor() > rightpaddle.ycor() - 40): 2- ball.setx(340) 3+ if 330 < ball.xcor() < 350 and rightpaddle.ycor() - 50 < ball.ycor() < rightpaddle.ycor() + 50: 4+ ball.setx(330) 5 ballxdirection = ballxdirection * -1 6 7- if (ball.xcor() < -340) and (ball.xcor() < -350) and (ball.ycor() < leftpaddle.ycor() + 40 and ball.ycor() > leftpaddle.ycor() - 40): 8- ball.setx(340) 9+ if -350 < ball.xcor() < -330 and leftpaddle.ycor() - 50 < ball.ycor() < leftpaddle.ycor() + 50: 10+ ball.setx(-330) 11 ballxdirection = ballxdirection * -1

「x > A and x < B」を「A < x < B」と書けるのがPythonの特長のひとつです。

説明が面倒なので、右のパドルとの接触判定だけ。

パドルの幅は20ピクセルあり、右のパドル中心のx座標350の左右に10ピクセルずつ広がっています。よって、中心より10ピクセル中央よりの340が右のパドルの前面のx座標です。

ボールの半径が10ピクセルなので、その右端がパドルの前面と接触するときのボール中心のx座標は330、左端がパドルの前面と接触するときのボール中心のx座標が350です。

ということで、右のパドルの前面とボールが重なるときのボール中心のx座標の条件は330 < ball.xcor() < 350ということになります。

同様に、パドルの高さは100ピクセルあり、右のパドル中心のy座標rightpaddle.ycor()の上下に50ピクセルずつ広がっています。

ということで、ボール中心のy座標ball.ycor()が右のパドルと重なる条件は、rightpaddle.ycor() - 50 < ball.ycor() < rightpaddle.ycor() + 50ということになります。

本当はこちらもボールの半径10ピクセルを考慮したいところですが、面倒なので省略します。

なお、元のコードでは、左のパドルとの接触判定の条件式ball.xcor() < -350の不等号が反対ですし、条件成立時になぜかボールのx座標を(-340ではなく)340に設定しています。


以上、現状のコードを(クラスを作ったりせずに)できるだけそのままの形で動くようにしてみました。

投稿2021/09/06 14:18

編集2021/09/06 14:28
Daregada

総合スコア11990

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

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

rawr

2021/09/07 01:15

ありがとうございます! 加算の方法、fontの設定など知らないことをたくさん教えていただきました。右のパドルが表示できない理由も解決できて良かったです。数値の設定も解説してくださって本当に助かりました。 ゲームとしては機能するようになったのであとはボールの速さを調節してみたいと思います。
Daregada

2021/09/07 01:23 編集

あとは、 ・左右のパドルの中心y座標が画面の範囲、概算で(-300, 300)を超えるとパドルが表示されなくなるので、leftpaddleupなどの関数で「パドルの中心が画面からはみ出さないときだけ、パドルのy座標を変更する」 ・パドルやボールの大きさを決め打ちして数値を書いている部分を、get_shapepoly()で得られるリスト内の数値を参考にしてパドルの高さやボールの半径を求め、それを使った式に変更する→パドルやボールの大きさを変えてもそのまま使えるようにする。 ・プレイヤーや左右のパドルの処理が似ているので、クラスを作って共通化できないか検討する あたりを、少しずつ試してみてください。
rawr

2021/09/14 10:26

返信ありがとうございます。やってみます。
guest

0

t.Turtleではなくt.Turtle()ではないでしょうか?

python

1ball=t.Turtle() 2 3pen=t.Turtle()

投稿2021/09/06 03:13

holy_

総合スコア364

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

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

rawr

2021/09/06 05:49

ありがとうございます!()付け足しました! するとspeedの方のエラーがなくなって turtle.Vec2D() argument after * must be an iterable, not float File "C:\Users\1200728\Desktop\test\test.py", line 33, in <module> ball.goto(5.5) となったのですがどういう意味なんでしょうか? 調べたけど分からないので教えてほしいです????お願い致します。
holy_

2021/09/06 06:02

ball.goto(5.5)ではなくball.goto(5,5)では?(ピリオドではなくカンマでは?)
Daregada

2021/09/06 06:47

一応動くようにしてみましたが、 ・キー割り当て時の左右のパドルの取り違え ・ボールを動かす際の式の間違い ・スコア加算時の変数の取り違え ・ボールが右端に到達したときの処理がない ・左側のパドルで跳ね返すときの条件式と設定するx座標の符号間違い など大量のバグがありますね。 今から食事に出かけるので対応できませんが。
rawr

2021/09/06 07:10

>>ball.goto(5.5)ではなくball.goto(5,5)では?(ピリオドではなくカンマでは?) 本当ですね!修正します(>_<)
rawr

2021/09/06 07:12

>>一応動くようにしてみましたが、 ・キー割り当て時の左右のパドルの取り違え ・ボールを動かす際の式の間違い ・スコア加算時の変数の取り違え ・ボールが右端に到達したときの処理がない ・左側のパドルで跳ね返すときの条件式と設定するx座標の符号間違い ありがとうございます。自分でもチェックしてみますがお時間のある時に教えてもらうことってできますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問