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

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

ただいまの
回答率

90.35%

  • Python

    9138questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 170

こんにちは。
最近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
class Map:
    def __init__(self, width, height):
        self.width = width
        self.height = height
        #関数渡しで下記のメソッドを勇者インスタンスに渡し, マップ上での勇者を管理
        self.hero = Hero(3, 3, self.is_movable, self.get_message, self.update)
        self.CityPeople = []
        self.CityPeople.append(CityPerson(3, 1, "K", "I'm King."))
        self.CityPeople.append(CityPerson(1, 5, "S", "I'm Soldier1."))
        self.CityPeople.append(CityPerson(5, 5, "S", "I'm Soldier2."))
        self.CityPeople.append(CityPerson(2, 6, "S", "I'm Soldier3."))

    def run(self):
        self.hero.run()

    def is_movable(self, x, y):
        if(x < 0):
            return False
        elif(self.width-1 < x):
            return False
        elif(y < 0):
            return False
        elif(self.height-1 < y):
            return False

        for CityPerson in self.CityPeople:
            if(x == CityPerson.x and y == CityPerson.y):
                return False

        return True

    #画面上に現在の状態を描画
    def update(self, message=""):
        characters = {}
        for CityPerson in self.CityPeople:
            characters[(CityPerson.x, CityPerson.y)] = CityPerson.icon
        #位置情報のタプルに方向を示すアイコンを代入
        characters[(self.hero.x, self.hero.y)] = self.hero.icon

        def get_top_bottom_text():
            return "+" + "-" * self.width + "+\n"
        def get_message_border(width):
            return "#" + width + "\n"

        map_list = []
        map_list.append(get_top_bottom_text())
        for y in range(0, self.height):
            map_list.append("|")
            for x in range(0, self.width):
                if((x, y) in characters):
                    map_list.append(characters[(x, y)])
                else:
                    map_list.append(" ")
            map_list.append("|\n")
        map_list.append(get_top_bottom_text())

        map_list.append(get_message_border(10))
        map_list.append(message + "\n")
        map_list.append(get_message_border(10))

        print("".join(map_list))

    def get_message(self, x, y):
        for CityPerson in self.CityPeople:
            if(x == CityPerson.x and y == CityPerson.y):
                return CityPerson.message
        return "no one exits.."

class Hero:
    def __init__(self, x, y, is_movable, get_message, update):
        self.x = 0
        self.y = 0
        self.icon = "^"
        self.is_movable = is_movable
        self.get_message = get_message
        self.update = update

    def run(self):
        print("W:UP A:LEFT S:RIGHT Z:DOWN")
        print("E:EXIT")
        self.update()

        while True:
            key = input()
            if key == "e":
                print("Exit")
                break
            elif key == "w":
                self.icon = "^"
                if(self.is_movable(self.x, self.y-1)):
                    self.y -= 1
            elif key == "a":
                self.icon = "<"
                if(self.is_movable(self.x-1, self.y)):
                    self.x -= 1
            elif key == "s":
                self.icon = ">"
                if(self.is_movable(self.x+1, self.y)):
                    self.x += 1
            elif key == "z":
                self.icon = "v"
                if(self.is_movable(self.x, self.y+1)):
                    self.y += 1
            elif key == "d":
                self.talk()
                continue
            self.update()

    def talk(self):
        if(self.icon == "^"):
            message = self.get_message(self.x, self.y-1)
        elif(self.icon == "<"):
            message = self.get_message(self.x-1, self.y)
        elif(self.icon == ">"):
            message = self.get_message(self.x+1, self.y)
        elif(self.icon == "<"):
            message = self.get_message(self.x, self.y+1)
        else:
            print("Error")
            exit()
        self.update(message)

class CityPerson:
    def __init__(self, x, y, icon, message):
        self.x = x
        self.y = y
        self.icon = icon
        self.message = message

m = Map(7, 7)
m.run()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+4

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

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

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


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/20 17:30

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

    ご回答いただき、ありがとうございました!

    キャンセル

checkベストアンサー

+1

一点目

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

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

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

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

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

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


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

二点目

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/20 17:32

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

    ご回答いただき、ありがとうございました!

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Python

    9138questions

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