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

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

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

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

1回答

803閲覧

enemyの関数を動かせるず、困っています。

kyurin

総合スコア0

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

0クリップ

投稿2021/10/14 14:06

前提・実現したいこと

88行目のenemy.draw() に関して、5行目からのenemyの定義でdrawのことも定義したのにAttribute Errorとなってしまいます。どうしたらいいですか。

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

Attribute error

該当のソースコード

from tkinter import * import random import time class Enemy: def __init__ (self, canvas, player, color): self.canvas = canvas self.player = player self.id = canvas.create_oval(10, 10, 25, 25, fill=color) self.canvas.move(self.id, 245, 100) starts = [-3, -2, -1, 1, 2, 3] random.shuffle(starts) self.x = starts[0] self.y = -3 self.canvas_height = self.canvas.winfo_height() self.canvas_width = self.canvas.winfo_width() self.hit_player = False def hit_player(self, pos): player_pos = self.canvas.coords(self.player.id) if pos[2] >=player_pos[0] and pos[0] <= player_pos[2]: if pos[3] >= player_pos[1] and pos[3] <= player_pos[3]: return True return False def draw(self): self.canvas.move(self.id, self.x, self.y) pos = self.canvas.coords(self.id) if pos[1] <= 0: self.y = 3 if pos[3] >= self.canvas_height: self.hit_player = True if self.hit_player(pos) == True: self.y = -3 if pos[0] <= 0: self.x = 3 if pos[2] >= self.canvas_width: self.x = -3 class Player: def __init__(self,canvas,color): self.canvas = canvas self.id = canvas.create_rectangle(30, 30, 70, 70, fill=color) self.canvas.move(self.id, 200,300) self.x = 0 self.canvas_width = self.canvas.winfo_width() self.canvas.bind_all('<KeyPress-Left>', self.turn_left) self.canvas.bind_all('<KeyPress-Right>', self.turn_right) self.canvas.bind_all('<KeyPress-space>', self.game_start) self.state = 1 def draw(self): self.canvas.move(self.id, self.x, 0) pos = self.canvas.coords(self.id) if pos[0] <= 0: self.x = -0 elif pos[2] >= self.canvas_width: self.x = 0 def turn_left(self, evt): self.x = -2 def turn_right(self, evt): self.x = 2 def game_start(self, evn): self.state = 2 tk = Tk() tk.title("Game") tk.resizable(0,0) tk.wm_attributes("-topmost",1) canvas = Canvas(tk, width=500, height=400, bd=0,highlightthickness=0) canvas.pack() tk.update() player = Player(canvas, 'green') enemy = Enemy(canvas, player, 'yellow') while True: if player.state == 1: canvas.create_rectangle(500, 400, 0, 0, fill='white', tag="start_screen") canvas.create_text(250, 80, text = '-- ゲーム --', fill='black', font=('Arial', 20), tag="start_message") canvas.create_text(250, 200, text = 'PUSH SPACE', fill='black', font=('Arial', 20), tag="start_message") if enemy.hit_player == False and player.state == 2: enemy.draw() player.draw() canvas.delete("start_message") canvas.delete("start_screen") time.sleep(0.01) if enemy.hit_player == True: canvas.create_rectangle(500, 400, 0, 0, fill='white') canvas.create_text(250, 150, text = 'GAME OVER!', fill='red', font=('Arial', 50)) tk.update_idletasks() tk.update() time.sleep(0.01)

試したこと

スペリングや字下げに関してミスが無いか確認した。playerのdrawと混ざったのかと思い名前を変えてみた。

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

Python(3,10,0)を使いました。

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

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

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

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

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

guest

回答1

0

スペリングや字下げに関してミスが無いか確認した。playerのdrawと混ざったのかと思い名前を変えてみた。

字下げ(インデント)が想定通りになってません。

もし、エディタ上で問題が無いように見えてるのだとすれば、
タブ文字とスペースが混在していないかを確認してください。

エディタの設定でタブ幅が4の場合、見ただけでは気付きにくいので注意。
解決策: タブ文字→スペースへの変換をお勧めします。

python

1## NG 2class Enemy: 3 def __init__ (self, canvas, player, color): 4 ... 5 6 # コンストラクタ内で定義される一時的な関数 7 8 def hit_player(self, pos): 9 ... 10 11 12 def draw(self): 13 ... 14 15## OK 16class Enemy: 17 def __init__ (self, canvas, player, color): 18 ... 19 20 21 # メソッド定義 22 23 def hit_player(self, pos): 24 ... 25 26 def draw(self): 27 ...

投稿2021/10/14 14:22

teamikl

総合スコア8664

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問