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

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

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

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

Q&A

解決済

3回答

1459閲覧

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

orafumotoyama

総合スコア13

Python

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

0グッド

0クリップ

投稿2018/11/29 04:23

編集2018/12/01 00:46

前提・実現したいこと

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

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

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

該当のソースコード

Python

1from blokus.player import Player 2from blokus.utils import encodeFourCode 3from blokus.piece import Pieces 4from blokus.move import getAllMovePatterns 5from operator import itemgetter 6class PlayerA(Player): 7 8 9 def __init__(self): 10 super().__init__() 11 self.list1 = ['t','o','u','j','k'] 12 self.list2 = ['l','m','n','p'] 13 self.list3 = ['a','b','c','d','e','f','g','h','i'] 14 self.count = 0 15 self.logs = [] 16 17 18 def log(self, player, move): 19 self.logs.append((player, move)) 20 def move(self, board, pieces): 21 self.count += 1 22 hand = 'pass' 23 def sorta(): 24 a = getAllMovePatterns(board, self.list1, first=False) 25 list1=sorted(a,key=lambda x: x[0]) 26 if len(a) == 0: 27 hand = sorta_b() 28 return hand 29 elif len(a) != 0: 30 self.list1.remove(list1[0][2]) 31 return list1[0] 32 33 def sorta_b(): 34 a = getAllMovePatterns(board, self.list2, first=False) 35 list1=sorted(a,key=lambda x: x[0]) 36 if len(a) == 0: 37 hand = sorta_c() 38 return hand 39 elif len(a) != 0: 40 self.list2.remove(list1[0][2]) 41 return list1[0] 42 43 def sorta_c(): 44 hand = getAllMovePatterns(board, self.list3, first=False) 45 list1=sorted(hand,key=lambda x: x[0]) 46 if len(hand) == 0: 47 return 'pass' 48 elif len(hand) != 0: 49 self.list3.remove(list1[0][2]) 50 return list1[0] 51 def sortarou(): 52 a = getAllMovePatterns(board, self.list1, first=False) 53 list1=sorted(a,key=lambda x: x[1],reverse = True) 54 if len(a) == 0: 55 hand = sortarou_b() 56 return hand 57 elif len(a) != 0: 58 self.list1.remove(list1[0][2]) 59 return list1[0] 60 def sortarou_b(): 61 a = getAllMovePatterns(board, self.list2, first=False) 62 list1=sorted(a,key=lambda x: x[1],reverse = True) 63 if len(a) == 0: 64 hand = sortarou_c() 65 return hand 66 elif len(a) != 0: 67 self.list2.remove(list1[0][2]) 68 return list1[0] 69 70 71 def sortarou_c(): 72 a = getAllMovePatterns(board, self.list3, first=False) 73 list1=sorted(a,key=lambda x: x[1],reverse = True) 74 if len(a) == 0: 75 return 'pass' 76 elif len(a) != 0: 77 self.list3.remove(list1[0][2]) 78 return list1[0] 79 80 81 if self.count == 1: 82 hand = encodeFourCode(18,1,'s',1) 83 elif self.count == 2: 84 hand = encodeFourCode(15,4,'r',2) 85 elif self.count == 3: 86 hand = encodeFourCode(13,8,'q',2) 87 elif self.count == 4: 88 a = getAllMovePatterns(board, pieces, first=False) 89 if ('aau0' in a) == True: 90 hand = encodeFourCode(9, 9, 'u', 0) 91 return hand 92 elif ('aau0' in a) != True: 93 hand = sorta() 94 elif self.count == 5: 95 hand = sorta() 96 elif self.count == 6: 97 hand = sortarou() 98 elif self.count == 7: 99 hand = sorta() 100 elif self.count == 8: 101 hand = sortarou() 102 elif self.count == 9: 103 hand = sorta() 104 elif self.count >= 10: 105 a = getAllMovePatterns(board, pieces, first=False) 106 list1=sorted(a,key=lambda x: x[2],reverse = True) 107 if len(a) == 0: 108 return 'pass' 109 elif len(a) != 0: 110 return list1[0] 111 return hand 112

試したこと

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

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

Linux

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

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

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

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

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

hayataka2049

2018/11/29 04:44

コードが読めません。 https://teratail.com/tour を参考にコードをコードブロックのマークダウンの中に入れるよう再編集してください
y_waiwai

2018/11/29 05:28

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

2018/11/29 18:43

初めての質問のため、不備があり申し訳ありません。確認できる点またはまだ不備がある点があれば教えていただきたいです。
hayataka2049

2018/11/29 18:45

まだ読めません。プレビューを見ながら見れるようになるまで書き直してください。たぶん「ソースコード```Python」の「ソースコード」が邪魔しているので消してください。
horiegom

2018/11/30 06:06

表示されているエラーメッセージは何ですか。
orafumotoyama

2018/11/30 08:48

エラーは出ないのですが、ブロックを自分のターンで置いてくれません。
orafumotoyama

2018/11/30 08:48

たぶん訂正完了いたしました。お手数をおかけします。
Lhankor_Mhy

2018/11/30 09:24

blokus というモジュールは公開されているものですか?
Lhankor_Mhy

2018/11/30 09:27

sorta2, sorta3 という関数は、ここに書かれていないコードで定義されているのですか?
Lhankor_Mhy

2018/11/30 09:28

sortarou2, sortarou3 も同様ですか?
orafumotoyama

2018/11/30 23:34

blocksというモジュールは公開されていないと思います。sorta2,sorta3は関数名を勘違いしていました。それぞれsorta2→sorta_bなどの関数のことです。訂正内容の方で確認お願いします。
Lhankor_Mhy

2018/12/01 00:18

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

2018/12/01 00:45

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

2018/12/01 00:51

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

回答3

0

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

なお

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

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

Python

1""" 2from blokus.player import Player 3from blokus.utils import encodeFourCode 4from blokus.piece import Pieces 5from blokus.move import getAllMovePatterns 6from operator import itemgetter 7""" 8# 上の代わり 9class Player: 10 def __init__(self): 11 super().__init__() 12 13def encodeFourCode(*args): 14 return ['aaa','bbb'] 15 16def getAllMovePatterns(*args): 17 return ['ccc','ddd'] 18 19 20class PlayerA(Player): 21 22 def __init__(self): 23 super().__init__() 24 self.list1 = ['t','o','u','j','k'] 25 self.list2 = ['l','m','n','p'] 26 self.list3 = ['a','b','c','d','e','f','g','h','i'] 27 self.count = 0 28 self.logs = [] 29 30 31 def log(self, player, move): 32 self.logs.append((player, move)) 33 def move(self, board, pieces): 34 self.count += 1 35 hand = 'pass' 36 37 def sorta(): 38 a = getAllMovePatterns(board, self.list1, first=False) 39 list1=sorted(a,key=lambda x: x[0]) 40 if len(a) == 0: 41 hand = sorta_b() 42 return hand 43 elif len(a) != 0: 44 self.list1.remove(list1[0][2]) 45 return list1[0] 46 47 def sorta_b(): 48 a = getAllMovePatterns(board, self.list2, first=False) 49 list1=sorted(a,key=lambda x: x[0]) 50 if len(a) == 0: 51 hand = sorta_c() 52 return hand 53 elif len(a) != 0: 54 self.list2.remove(list1[0][2]) 55 return list1[0] 56 57 def sorta_c(): 58 hand = getAllMovePatterns(board, self.list3, first=False) 59 list1=sorted(hand,key=lambda x: x[0]) 60 if len(hand) == 0: 61 return 'pass' 62 elif len(hand) != 0: 63 self.list3.remove(list1[0][2]) 64 return list1[0] 65 def sortarou(): 66 a = getAllMovePatterns(board, self.list1, first=False) 67 list1=sorted(a,key=lambda x: x[1],reverse = True) 68 if len(a) == 0: 69 hand = sortarou_b() 70 return hand 71 elif len(a) != 0: 72 self.list1.remove(list1[0][2]) 73 return list1[0] 74 def sortarou_b(): 75 a = getAllMovePatterns(board, self.list2, first=False) 76 list1=sorted(a,key=lambda x: x[1],reverse = True) 77 if len(a) == 0: 78 hand = sortarou_c() 79 return hand 80 elif len(a) != 0: 81 self.list2.remove(list1[0][2]) 82 return list1[0] 83 84 85 def sortarou_c(): 86 a = getAllMovePatterns(board, self.list3, first=False) 87 list1=sorted(a,key=lambda x: x[1],reverse = True) 88 if len(a) == 0: 89 return 'pass' 90 elif len(a) != 0: 91 self.list3.remove(list1[0][2]) 92 return list1[0] 93 94 95 if self.count == 1: 96 hand = encodeFourCode(18,1,'s',1) 97 elif self.count == 2: 98 hand = encodeFourCode(15,4,'r',2) 99 elif self.count == 3: 100 hand = encodeFourCode(13,8,'q',2) 101 elif self.count == 4: 102 a = getAllMovePatterns(board, pieces, first=False) 103 if ('aau0' in a) == True: 104 hand = encodeFourCode(9, 9, 'u', 0) 105 return hand 106 elif ('aau0' in a) != True: 107 hand = sorta() 108 elif self.count == 5: 109 hand = sorta() 110 elif self.count == 6: 111 hand = sortarou() 112 elif self.count == 7: 113 hand = sorta() 114 elif self.count == 8: 115 hand = sortarou() 116 elif self.count == 9: 117 hand = sorta() 118 elif self.count >= 10: 119 a = getAllMovePatterns(board, pieces, first=False) 120 list1=sorted(a,key=lambda x: x[2],reverse = True) 121 if len(a) == 0: 122 return 'pass' 123 elif len(a) != 0: 124 return list1[0] 125 return hand 126 127player = PlayerA() 128hand = player.move('a','b') 129print(hand) # ['aaa', 'bbb'] 130

投稿2018/12/01 02:28

can110

総合スコア38260

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

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

Lhankor_Mhy

2018/12/01 03:18

たしかに(w ところで、 def getAllMovePatterns(*args, **kwargs): とすべきかもですね。   あと、クラス内部に状態を持っているので、何回かmoveメソッドを呼ぶと引数によってはエラー出ますね。(それが上手くいかない原因なんじゃ、と疑ってますが、エラー吐かないとのことなので)
can110

2018/12/01 03:23

ご指摘ありがとうございます。関数の引数はそうですね。 えいやっ!と回答なのでご容赦を…
orafumotoyama

2018/12/01 23:02

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

2018/12/01 23:06

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

2018/12/02 01:28

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

0

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

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

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

投稿2018/12/01 03:25

Lhankor_Mhy

総合スコア36074

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

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

0

ベストアンサー

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

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

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

投稿2018/12/01 00:47

morinatsu

総合スコア395

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

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

orafumotoyama

2018/12/01 00:54

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

2018/12/01 02:35

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問