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

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

ただいまの
回答率

87.78%

Pythonのプログラム内の関数の間違い

解決済

回答 3

投稿 編集

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

score 13

 前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)Pythonでblocksというゲームを進行するシステムを作っています。
関数内の関数を呼び出すときにエラーは表示されないのですが、関数内の関数を呼び出せていない気がしますが、色々訂正してもなかなか改善されないため困っています。関数sorta 関数sortarouのどこかでおかしいところがあるのであれば教えていただきたいです。インデントなど変えれそうなところは色々と変えてみました。
全体的にゲームのルールを把握していない状態でこのプログラムを考えることは難しいかもしれませんが、sorta,sorta_b,sorta_cとsortarou,sortarou_b,sortarou_cのそれぞれの三つずつの関数の関係性が間違っているのか、関数内の間違いさえ見つかれば、改善は可能であるとは思います。よろしくお願いします。

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

関数が呼び出されていないためか、関数を使う手数のところで、ブロックが置かれない問題が生じている。

 該当のソースコード

from blokus.player import Player
from blokus.utils import encodeFourCode 
from blokus.piece import Pieces 
from blokus.move import getAllMovePatterns
from operator import itemgetter
class PlayerA(Player):


    def __init__(self):
        super().__init__()
        self.list1 = ['t','o','u','j','k']
        self.list2 = ['l','m','n','p']
        self.list3 = ['a','b','c','d','e','f','g','h','i']
        self.count = 0
        self.logs = []


    def log(self, player, move):
        self.logs.append((player, move))
    def move(self, board, pieces):
        self.count += 1
        hand = 'pass'
        def sorta():
            a = getAllMovePatterns(board, self.list1, first=False)
            list1=sorted(a,key=lambda x: x[0])
            if len(a) == 0:
                hand = sorta_b()
                return hand
            elif len(a) != 0:
                self.list1.remove(list1[0][2])
                return list1[0]

            def sorta_b():
                a = getAllMovePatterns(board, self.list2, first=False)
                list1=sorted(a,key=lambda x: x[0])
                if len(a) == 0:
                    hand = sorta_c()
                    return hand
                elif len(a) != 0:
                    self.list2.remove(list1[0][2])
                    return list1[0]

                def sorta_c():
                    hand = getAllMovePatterns(board, self.list3, first=False)
                    list1=sorted(hand,key=lambda x: x[0])
                    if len(hand) == 0:
                        return 'pass'
                    elif len(hand) != 0:
                        self.list3.remove(list1[0][2])
                        return list1[0]
        def sortarou():
            a = getAllMovePatterns(board, self.list1, first=False)
            list1=sorted(a,key=lambda x: x[1],reverse = True)
            if len(a) == 0:
                hand = sortarou_b()
                return hand
            elif len(a) != 0:
                self.list1.remove(list1[0][2])
                return list1[0]
            def sortarou_b():
                a = getAllMovePatterns(board, self.list2, first=False)
                list1=sorted(a,key=lambda x: x[1],reverse = True)
                if len(a) == 0:
                    hand = sortarou_c()
                    return hand
                elif len(a) != 0:
                    self.list2.remove(list1[0][2])
                    return list1[0]


                def sortarou_c():
                    a = getAllMovePatterns(board, self.list3, first=False)
                    list1=sorted(a,key=lambda x: x[1],reverse = True)
                    if len(a) == 0:
                        return 'pass'
                    elif len(a) != 0:
                        self.list3.remove(list1[0][2])
                        return list1[0]


        if self.count == 1:
            hand = encodeFourCode(18,1,'s',1)            
        elif self.count == 2:
            hand = encodeFourCode(15,4,'r',2)
        elif self.count == 3:
            hand = encodeFourCode(13,8,'q',2)
        elif self.count == 4:
            a = getAllMovePatterns(board, pieces, first=False)
            if ('aau0' in a) == True:
                            hand = encodeFourCode(9, 9, 'u', 0)
                            return hand
            elif ('aau0' in a) != True:
                hand = sorta()
        elif self.count == 5:
                hand = sorta()
        elif self.count == 6:
                hand = sortarou()
        elif self.count == 7:
                hand = sorta()
        elif self.count == 8:
                hand = sortarou()
        elif self.count == 9:
                hand = sorta()
        elif self.count >= 10:
                a = getAllMovePatterns(board, pieces, first=False)
                list1=sorted(a,key=lambda x: x[2],reverse = True)
                if len(a) == 0:
                    return 'pass'
                elif len(a) != 0:
                    return list1[0]
        return hand

 試したこと

インデントの改善、関数内の改善。→どれも改善にあたらず。

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

Linux

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Lhankor_Mhy

    2018/12/01 09:18

    ほかの回答者のためにも、コードの方もご修正ください。また、blokus モジュールはご質問者が作成したのですか?

    キャンセル

  • orafumotoyama

    2018/12/01 09:45

    blocks といったゲームは実在するのですが、モジュールに関しては、学校側が用意しているのでちょっとわからないいです。

    キャンセル

  • Lhankor_Mhy

    2018/12/01 09:51

    ゲームの名前は Blokus ですよ。古典ですが有名なゲームです。さて、「エラーは出ない」とのことでしたが、それはどのようにして確認されましたか? また、インスタンスの作成とmoveメソッドの実行部分のコードもご提示いただけますか?

    キャンセル

回答 3

+1

コードは完璧です。なんの問題もありません。
エラー発生しないので関数も呼び出しているものは完璧に動作しています。
インデントもIndent Error発生していないので正しいです。

なお

関数が呼び出されていないためか、関数を使う手数のところで、ブロックが置かれない問題が生じている。

「手数」や「ブロック」がコード上の何を指しているのかよく分からないので先生に聞いてください
繰り返しになりますが、コードは完璧です。書いた通りに動いてます。なんの問題もありません。

"""
from blokus.player import Player
from blokus.utils import encodeFourCode 
from blokus.piece import Pieces 
from blokus.move import getAllMovePatterns
from operator import itemgetter
"""
# 上の代わり
class Player:
    def __init__(self):
        super().__init__()

def encodeFourCode(*args):
    return ['aaa','bbb']

def getAllMovePatterns(*args):
    return ['ccc','ddd']


class PlayerA(Player):

    def __init__(self):
        super().__init__()
        self.list1 = ['t','o','u','j','k']
        self.list2 = ['l','m','n','p']
        self.list3 = ['a','b','c','d','e','f','g','h','i']
        self.count = 0
        self.logs = []


    def log(self, player, move):
        self.logs.append((player, move))
    def move(self, board, pieces):
        self.count += 1
        hand = 'pass'

        def sorta():
            a = getAllMovePatterns(board, self.list1, first=False)
            list1=sorted(a,key=lambda x: x[0])
            if len(a) == 0:
                hand = sorta_b()
                return hand
            elif len(a) != 0:
                self.list1.remove(list1[0][2])
                return list1[0]

            def sorta_b():
                a = getAllMovePatterns(board, self.list2, first=False)
                list1=sorted(a,key=lambda x: x[0])
                if len(a) == 0:
                    hand = sorta_c()
                    return hand
                elif len(a) != 0:
                    self.list2.remove(list1[0][2])
                    return list1[0]

                def sorta_c():
                    hand = getAllMovePatterns(board, self.list3, first=False)
                    list1=sorted(hand,key=lambda x: x[0])
                    if len(hand) == 0:
                        return 'pass'
                    elif len(hand) != 0:
                        self.list3.remove(list1[0][2])
                        return list1[0]
        def sortarou():
            a = getAllMovePatterns(board, self.list1, first=False)
            list1=sorted(a,key=lambda x: x[1],reverse = True)
            if len(a) == 0:
                hand = sortarou_b()
                return hand
            elif len(a) != 0:
                self.list1.remove(list1[0][2])
                return list1[0]
            def sortarou_b():
                a = getAllMovePatterns(board, self.list2, first=False)
                list1=sorted(a,key=lambda x: x[1],reverse = True)
                if len(a) == 0:
                    hand = sortarou_c()
                    return hand
                elif len(a) != 0:
                    self.list2.remove(list1[0][2])
                    return list1[0]


                def sortarou_c():
                    a = getAllMovePatterns(board, self.list3, first=False)
                    list1=sorted(a,key=lambda x: x[1],reverse = True)
                    if len(a) == 0:
                        return 'pass'
                    elif len(a) != 0:
                        self.list3.remove(list1[0][2])
                        return list1[0]


        if self.count == 1:
            hand = encodeFourCode(18,1,'s',1)            
        elif self.count == 2:
            hand = encodeFourCode(15,4,'r',2)
        elif self.count == 3:
            hand = encodeFourCode(13,8,'q',2)
        elif self.count == 4:
            a = getAllMovePatterns(board, pieces, first=False)
            if ('aau0' in a) == True:
                            hand = encodeFourCode(9, 9, 'u', 0)
                            return hand
            elif ('aau0' in a) != True:
                hand = sorta()
        elif self.count == 5:
                hand = sorta()
        elif self.count == 6:
                hand = sortarou()
        elif self.count == 7:
                hand = sorta()
        elif self.count == 8:
                hand = sortarou()
        elif self.count == 9:
                hand = sorta()
        elif self.count >= 10:
                a = getAllMovePatterns(board, pieces, first=False)
                list1=sorted(a,key=lambda x: x[2],reverse = True)
                if len(a) == 0:
                    return 'pass'
                elif len(a) != 0:
                    return list1[0]
        return hand

player = PlayerA()
hand = player.move('a','b')
print(hand) # ['aaa', 'bbb']

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/02 08:02

    回答ありがとうございます。上記のように書いてくださったプログラムに変更すれば動くのでしょうか?
    python初めて扱うので少し理解力不足で申し訳ないです。

    キャンセル

  • 2018/12/02 08:06

    また、自分が挙げたプログラムコードと回答者様が挙げてくれたプログラムコードがどう変化したのかおしえていただけると幸いです。

    キャンセル

  • 2018/12/02 10:28

    >「~動くのでしょうか?」
    動かしてみれば分かると思いますが、どうお考えでしょうか?
    >「~どう変化したのか~」
    見比べれば分かると思いますが、どうお考えでしょうか?

    キャンセル

checkベストアンサー

0

move関数が呼ばれたときのboardなどの状態が示されておらず、手元で検証できないので、単なる推測です。

sortasortarouやその下の関数を呼び出す分岐に進まずに終了しているのではないかと。

pdbなどによるデバッグ実行が使えるなら、それで。使えないのであれば、コードの中に適宜printを挟んで通過を確認するなどの方法で、解析・検証していくのが地道ながらもおすすめです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/01 09:54

    回答のほうありがとうございます。pythonを扱うのが初めてのため,pdbの扱いもよくわかっていませんが、少し勉強して取り組んでみたいと思います。ありがとうございます。
    sorta,sortarouの下の関数を呼び出す分岐に進まないのは,関数として成り立っていないからではないのでしょうか?そこがわかりません。
    インデントがおかしいとかの指摘があると幸いです。

    キャンセル

  • 2018/12/01 11:35

    質問者さんが、それぞれの関数をどのような意図で書いているのかの情報がないので、こちらからはその種の指摘はできません。実行時にエラーにならないのなら、コンパイラは文法的には間違っていないと判断しているのです。そこから先は質問者さんが自分で解決する必要があります。

    キャンセル

0

現状の情報で考えられる原因は次のとおりです。

  • そもそも、インスタンスを作成していない。(クラスを定義すれば動くと思っている)
  • インスタンスは作成しているが、メソッドを呼んでいない。(インスタンスを作成すれば動くと思っている)
  • sortarou_b などの関数を定義前に呼んでいるために、エラーを吐いている(質問者はエラーログが読めない)

もう少し、情報をください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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