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

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

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

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

Q&A

解決済

3回答

1028閲覧

Python:チュートリアルでのエラーについて。

kakushi_goto_ih

総合スコア7

Python

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

0グッド

0クリップ

投稿2018/05/16 06:01

こんにちは。
最近Pythonの勉強を始めたものです。

プログラミング力を上達させるには写経が大事
それも自分が楽しんでできるようなチュートリアルの方が良い

というアドバイスを頂いたので、以下のサイトのゲーム製作を試しているのですが、
記載されているコード通り写しているはずなのにエラーが出てしまいます。
なるべく自分の力で解決したかったのですが、合わせて質問させていただきたいこと
がありましたので、こちらのサイトを利用させていただきました。

まず1点目が、以下のコードのエラーはどうしたら直るのかということです。
エラーで言われていることは、数値でなく文字列でないとダメだみたいなことだと思うんですが、どこをどう直してよいかわからない状態です。

2点目は、写経したコードで理解できていない部分があるのですが、そういう場合は
理解できるまで何度も見直した方が良いのかということです。
理解に時間をかけるのではなく、どんどんコードを書いていった方が良いのでは?と
思ったため、このような質問をさせていただきました。

利用しているサイト

お手数おかけしますが、何卒よろしくお願い致します。

Traceback (most recent call last): File "/Users/user/pyworks/ms.py", line 231, in <module> m.run() File "/Users/use/pyworks/ms.py", line 114, in run self.hero.run() File "/Users/user/pyworks/ms.py", line 181, in run self.update() File "/Users/user/pyworks/ms.py", line 157, in update map_list.append(get_message_border(10)) File "/Users/user/pyworks/ms.py", line 143, in get_message_border return "#" + width + "\n" TypeError: must be str, not int

Python

1class Map: 2 def __init__(self, width, height): 3 self.width = width 4 self.height = height 5 #関数渡しで下記のメソッドを勇者インスタンスに渡し, マップ上での勇者を管理 6 self.hero = Hero(3, 3, self.is_movable, self.get_message, self.update) 7 self.CityPeople = [] 8 self.CityPeople.append(CityPerson(3, 1, "K", "I'm King.")) 9 self.CityPeople.append(CityPerson(1, 5, "S", "I'm Soldier1.")) 10 self.CityPeople.append(CityPerson(5, 5, "S", "I'm Soldier2.")) 11 self.CityPeople.append(CityPerson(2, 6, "S", "I'm Soldier3.")) 12 13 def run(self): 14 self.hero.run() 15 16 def is_movable(self, x, y): 17 if(x < 0): 18 return False 19 elif(self.width-1 < x): 20 return False 21 elif(y < 0): 22 return False 23 elif(self.height-1 < y): 24 return False 25 26 for CityPerson in self.CityPeople: 27 if(x == CityPerson.x and y == CityPerson.y): 28 return False 29 30 return True 31 32 #画面上に現在の状態を描画 33 def update(self, message=""): 34 characters = {} 35 for CityPerson in self.CityPeople: 36 characters[(CityPerson.x, CityPerson.y)] = CityPerson.icon 37 #位置情報のタプルに方向を示すアイコンを代入 38 characters[(self.hero.x, self.hero.y)] = self.hero.icon 39 40 def get_top_bottom_text(): 41 return "+" + "-" * self.width + "+\n" 42 def get_message_border(width): 43 return "#" + width + "\n" 44 45 map_list = [] 46 map_list.append(get_top_bottom_text()) 47 for y in range(0, self.height): 48 map_list.append("|") 49 for x in range(0, self.width): 50 if((x, y) in characters): 51 map_list.append(characters[(x, y)]) 52 else: 53 map_list.append(" ") 54 map_list.append("|\n") 55 map_list.append(get_top_bottom_text()) 56 57 map_list.append(get_message_border(10)) 58 map_list.append(message + "\n") 59 map_list.append(get_message_border(10)) 60 61 print("".join(map_list)) 62 63 def get_message(self, x, y): 64 for CityPerson in self.CityPeople: 65 if(x == CityPerson.x and y == CityPerson.y): 66 return CityPerson.message 67 return "no one exits.." 68 69class Hero: 70 def __init__(self, x, y, is_movable, get_message, update): 71 self.x = 0 72 self.y = 0 73 self.icon = "^" 74 self.is_movable = is_movable 75 self.get_message = get_message 76 self.update = update 77 78 def run(self): 79 print("W:UP A:LEFT S:RIGHT Z:DOWN") 80 print("E:EXIT") 81 self.update() 82 83 while True: 84 key = input() 85 if key == "e": 86 print("Exit") 87 break 88 elif key == "w": 89 self.icon = "^" 90 if(self.is_movable(self.x, self.y-1)): 91 self.y -= 1 92 elif key == "a": 93 self.icon = "<" 94 if(self.is_movable(self.x-1, self.y)): 95 self.x -= 1 96 elif key == "s": 97 self.icon = ">" 98 if(self.is_movable(self.x+1, self.y)): 99 self.x += 1 100 elif key == "z": 101 self.icon = "v" 102 if(self.is_movable(self.x, self.y+1)): 103 self.y += 1 104 elif key == "d": 105 self.talk() 106 continue 107 self.update() 108 109 def talk(self): 110 if(self.icon == "^"): 111 message = self.get_message(self.x, self.y-1) 112 elif(self.icon == "<"): 113 message = self.get_message(self.x-1, self.y) 114 elif(self.icon == ">"): 115 message = self.get_message(self.x+1, self.y) 116 elif(self.icon == "<"): 117 message = self.get_message(self.x, self.y+1) 118 else: 119 print("Error") 120 exit() 121 self.update(message) 122 123class CityPerson: 124 def __init__(self, x, y, icon, message): 125 self.x = x 126 self.y = y 127 self.icon = icon 128 self.message = message 129 130m = Map(7, 7) 131m.run() 132

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

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

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

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

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

guest

回答3

0

写経のミスです。確認したところ、オリジナルはこうなっていました。

python

1def get_message_border(width): 2 return '#' * width + '\n'

文字列'#'をwidth回繰り返したものと'\n'の結合です。


2点目は、写経したコードで理解できていない部分があるのですが、そういう場合は
理解できるまで何度も見直した方が良いのかということです。
理解に時間をかけるのではなく、どんどんコードを書いていった方が良いのでは?

情報なしで一人で見直しても理解するのは無理なので、ググったり参考書にあたったりして調べるべきです。どうしても(調べても)わからなかったらここで質問しても構いませんよ。
あとは、とりあえず動かして入出力を見たり変えたりしながら理解していくのも手です。
また、基本的な文法に関しては入門書を買って目を通しておいた方が良いですし(せめて入門サイトを読む)、ライブラリの挙動などはたいてい公式のリファレンスマニュアルがありますから、そういうものを参照するクセをつけるのも大切です。

投稿2018/05/16 06:14

編集2018/05/16 06:17
hayataka2049

総合スコア30933

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

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

kakushi_goto_ih

2018/05/20 08:30

返信が遅くなってしまい、申し訳ございません。 基本的な部分が理解できていないとこういうミスに気付かないのですね...。 もっと勉強します。 また、沢山アドバイスしていただいて、本当に嬉しいです。 まだまだ勉強不足ですが、頑張って続けていきたいと思います。 ご回答いただき、ありがとうございました!
guest

0

ベストアンサー

一点目

数値でなく文字列でないとダメだみたいなことだと思う

その通りです。Pythonでは 文字列+数値 による連結をサポートしていません。

Python

1>>> 'answer=' + 42 2Traceback (most recent call last): 3 File "<stdin>", line 1, in <module> 4TypeError: must be str, not int

フォーマット済み文字列リテラルを使って文字列中に数値を埋め込むと良いでしょう。

Python

1def get_message_border(width): 2 return f"#{width}\n"

Pythonのバージョンに依っては別の書き方をしないといけませんが。


追記:
ありゃ、写経ミスでしたか。
あらぬ方向の回答になってしまいましたが、間違ったことは書いていないので参考程度に。

二点目

2点目は、写経したコードで理解できていない部分があるのですが、そういう場合は

理解できるまで何度も見直した方が良いのかということです。
理解に時間をかけるのではなく、どんどんコードを書いていった方が良いのでは?と
思ったため、このような質問をさせていただきました。

読むだけではなく、積極的に改造するのが良いでしょう。
基礎的なスキルはバグの解消によって身につくものだと思っています。

ただし、コードを読む上では体系的な知識も必要になります。
チュートリアルに取り組むと共に、書籍で勉強すると効率的でしょう。

投稿2018/05/16 06:09

編集2018/05/16 06:36
LouiS0616

総合スコア35658

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

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

kakushi_goto_ih

2018/05/20 08:32

返信が遅くなってしまい、申し訳ございません。 迅速なご回答、誠にありがとうございます。 今回は私の写経ミスでしたが、ご回答いただいた方法は勉強になりました。 また、アドバイスしていただき、ありがとうございます。 まだまだ勉強不足ですが、書籍などで知識をつけていきたいと思います。 ご回答いただき、ありがとうございました!
guest

0

動作しているけど内容が理解できないプログラムの挙動を調べる、
とか
実行させるとエラーが出る・動作が正しくないのを調べる
といった場合は、コードをエディタで読んでがんばる以外にも次の方法があります。

デバッガで途中で動作を止めて、その時点での変数の値をしらべる、そこから一行ずつ実行をすすめていく,変数の値をその場で変化させて継続実行してみる...

デバッガーの使い方を学んでみてください。
参考情報

  • PythonデバッグTips

https://qiita.com/TakesxiSximada/items/45b6d71a44f2706798ed

投稿2018/05/20 10:32

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問