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

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

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

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

Q&A

解決済

2回答

1875閲覧

リストの情報を他のクラスに渡す

DANNBU

総合スコア19

Python

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

0グッド

0クリップ

投稿2017/08/03 07:42

編集2017/08/03 12:51

###前提・実現したいこと
随時更新されていくリストの情報を他のクラスに渡したい
###発生している問題・エラーメッセージ
今現在三目並べのプログラムを作っていますが、盤の情報を

self.board = [[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1],[-1,-1,-1,-1]

としており

def select(self, x, y): if x < 1 or y < 1 or x > 3 or y > 3: return if self.board[y][x] == -1: if self.turn == 1: self.turn = self.siro elif self.turn == -2: self.turn = self.kuro else: self.turn = self.kuro self.goban[y][x] = self.turn self.board[y][x] = self.turn else: print("そこには置けません")
碁を置いたときにこのselectメソッドが呼び出され盤の情報が更新されていくのですが、この更新されていくself.boardのリストの情報を

新たに作る勝敗判定のクラスに上手く渡せなく、このselect内でインスタンスを作って勝敗判定のクラスを呼んできても、上記の初期状態のself.boardのリストのまま渡され困っています。

どうしたら更新されていくリストの情報を他のクラスに渡せるのでしょうか?

###追記
新たにメソッドを作りmousePressEvent()メソッドで呼ぶようにしてみたのですが

def mousePressEvent(self, event): pos = event.pos() #self.select(int(pos.x()/100), int(pos.y()/100)) hantei_ryouiki_satan = int(self.goban_left_top_x - int(self.length_of_between / 2)) x_from_hantei_ryouiki_satan = int(pos.x()) - hantei_ryouiki_satan hantei_ryouiki_joutan = int(self.goban_left_top_y - int(self.length_of_between / 2)) y_from_hantei_ryouiki_joutan = int(pos.y()) - hantei_ryouiki_joutan x = int(x_from_hantei_ryouiki_satan / self.length_of_between) +1 y = int(y_from_hantei_ryouiki_joutan / self.length_of_between) +1 print("x = {}, y = {}\n".format(x, y)) self.select(x,y) ###追加したコード a = TicTacToe() a.Check_winner() ### self.update() super(TicTacToe, self).mousePressEvent(event) #追加メソッド def Check_winner(self): print(self.board)

とりあえずCheck_winner()メソッドの方はprint文出力だけにしてるのですが
やはりmousePressEvent()の方で呼び出してもself.boardの情報が更新されておらず
初期状態として呼び出してしまうのですが、やはりどこか間違っているのでしょうか?

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

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

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

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

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

guest

回答2

0

※直接的な回答ではありません。


個人的には、審判クラスがBoardクラスと別にある設計もアリかと思います。

  • TicTacToeクラス (全体の実行を管理)
  • Boardクラス (盤面の状況を管理、表示)
  • Judgeクラス (勝敗の判定)

Python

1class TicTacToe: 2 def __init__(self): 3 self.board = Board() 4 self.judge = Judge(self.board) 5 6 ... 7 8 def play(self): 9 self.board.reset() 10 11 while True: 12 self.board.wait_to_select() 13 if self.judge.judge(): 14 break 15 16 print(self.judge.get_winner(), 'has won.') 17 18 ...

雑なコードですみません。実際に組んだわけではないので、論理的な漏れもあるかと思います。
一応、こういう方針もあるかもね、ということで。

投稿2017/08/03 10:45

編集2017/08/03 10:46
LouiS0616

総合スコア35658

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

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

0

ベストアンサー

勝敗判定はboardクラスがやるべきではないでしょうか?
そもそも勝敗判定クラスという怪しいクラスがあるのが問題ですが、boardクラスに勝敗判定メソッドを用意しておけば情報を渡す必要はありません。

python

1class Board: 2 def __init__(self): 3 #省略 4 5 def is_gameover(self): 6 # 7 #処理 8 # 9 return #bool 10 11 def winner(self): 12 # 13 #処理 14 # 15 return #勝者

###追記
こうすればboardクラスから他のクラスに盤の情報を渡す必要がありませんよね?

python

1"""main""" 2from filename import Board 3b = Board() 4while 1: 5 #処理 6 if b.is_gameover(): 7 #処理

###追記2
TicTacToeクラスに勝敗判定メソッドを記述し、mousePressEvent()メソッド内で呼び出しましょう。勝敗判定をした後にどういう処理にするかは自分で好きなようにしてください。

python

1def mousePressEvent(self, event): 2 pos = event.pos() 3 4 hantei_ryouiki_satan = int(self.goban_left_top_x - int(self.length_of_between / 2)) 5 x_from_hantei_ryouiki_satan = int(pos.x()) - hantei_ryouiki_satan 6 7 hantei_ryouiki_joutan = int(self.goban_left_top_y - int(self.length_of_between / 2)) 8 y_from_hantei_ryouiki_joutan = int(pos.y()) - hantei_ryouiki_joutan 9 10 x = int(x_from_hantei_ryouiki_satan / self.length_of_between) +1 11 y = int(y_from_hantei_ryouiki_joutan / self.length_of_between) +1 12 print("x = {}, y = {}\n".format(x, y)) 13 self.select(x, y) 14 self.update() 15 # 16 #ここに勝敗判定メソッドを入れる 17 # 18 super(TicTacToe, self).mousePressEvent(event)

###追記3

python

1a = TicTacToe() 2a.Check_winner()

これでは新しいBoardのインスタンスを作成しているので初期状態なのは当たり前。
以下のように書けばいいです。

python

1self.Check_winner()

python

1def mousePressEvent(self, event): 2 pos = event.pos() 3 #self.select(int(pos.x()/100), int(pos.y()/100)) 4 5 hantei_ryouiki_satan = int(self.goban_left_top_x - int(self.length_of_between / 2)) 6 x_from_hantei_ryouiki_satan = int(pos.x()) - hantei_ryouiki_satan 7 8 hantei_ryouiki_joutan = int(self.goban_left_top_y - int(self.length_of_between / 2)) 9 y_from_hantei_ryouiki_joutan = int(pos.y()) - hantei_ryouiki_joutan 10 11 x = int(x_from_hantei_ryouiki_satan / self.length_of_between) +1 12 y = int(y_from_hantei_ryouiki_joutan / self.length_of_between) +1 13 print("x = {}, y = {}\n".format(x, y)) 14 self.select(x,y) 15 16 17 ###これでは初期状態のインスタンスなので盤面は初期で当たり前 18 a = TicTacToe() 19 a.Check_winner() 20 ### 21 22 ###正しくは以下 23 self.Check_winner() 24 ### 25 26 self.update() 27 28 super(TicTacToe, self).mousePressEvent(event) 29 #追加メソッド 30 def Check_winner(self): 31 print(self.board)

投稿2017/08/03 07:54

編集2017/08/03 13:00
_Victorique__

総合スコア1392

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

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

DANNBU

2017/08/03 08:05

すみません、私自身あまり知識がなく 勝敗メソッドを用意しておけば情報を渡す必要がないというのがよくわからなくてもう少し詳しく教えていただいても宜しいでしょうか...
_Victorique__

2017/08/03 08:19

回答を編集しました。クラスの利用の仕方が分からないのでしょうか?
DANNBU

2017/08/03 08:29

はい、、、使い方がいまいちわからなくて 追記に書かれてある filenameというのは何になるんでしょうか??
DANNBU

2017/08/03 08:48

URLまで載せていただきありがとうございます。 何度もすみませんが、 Boardクラスで勝敗判定するときはself.boardの情報を参照する必要はないのですか??
_Victorique__

2017/08/03 08:51

Boardクラスが自身の保持している盤の情報をもとに勝敗判定するので呼び出す側は参照しません。もちろん判定する側は使わないと判定できませんよ? is_gameover()メソッド内の処理と書いている部分に実装してください。
DANNBU

2017/08/03 09:16 編集

思ったのですが1つのファイルだけで実装はできないのでしょうか?? またBoardクラスが自身の保持している盤の情報というのが私の理解力のなさがゆえにわからなく def __init__のなかで盤の情報を定義するのでしょうか??
DANNBU

2017/08/03 09:41

やはり、イメージがつかめないです・・・ 私自身selectメソッドの更新されたsel.boardの情報を使って Boardクラスのis_gameover()で判定を行いたいと思っているのですが、、、 なにか根本的に間違っているのでしょうか
_Victorique__

2017/08/03 09:47

> 私自身selectメソッドの更新されたsel.boardの情報を使って Boardクラスのis_gameover()で判定を行いたいと思っているのですが、、、 それであっていますよ。is_gameover()メソッドでself.boardの情報を使えばいいのです。実際にmain関数で動かすときにmain関数ではself.boardの情報を受け取らなくても良いという話です。main関数で受け取ればいいのはbool値が妥当でしょうか。
DANNBU

2017/08/03 09:50

あっているのならよかったです。 しかしself.boardの情報を使おうとしたときにやはりその更新したself.boardの情報をis_gameoverメソッドで呼び出す方法がわからなく、、、
_Victorique__

2017/08/03 09:54

同じクラス内でするのですからself.boardでアクセスできますよ?select()メソッドでやっているようにやればいいのです。 やはり一度クラスの勉強をされた方が良いですね。
DANNBU

2017/08/03 10:11

元々select()メソッドに関しては別のクラスの中に書いていて、Boardクラスのis_gameover()メソッド の中で更新したself.boardの情報を呼び出したいのですがどうしても初期状態のself.boardが呼び出されてしまうんです...
_Victorique__

2017/08/03 10:27

ちょっと言っている意味がよく分からないのでコード示してもらえますか?
DANNBU

2017/08/03 11:51

追記していただきありがとうございます やはり新たにクラスを作るやりかたは難しいですか?
_Victorique__

2017/08/03 12:05 編集

大差ないです。ですが、boardの情報を2つのクラスが持っている状態はバグをうみやすくなります。それに新たにクラスを作るメリットがあるかと言われればないです。
DANNBU

2017/08/03 12:48

ありがとうございます。 追記したので見ていただければ嬉しいです。
_Victorique__

2017/08/03 13:01

追記しました。やはりクラスについてもう少し知識をつけた方がいいです。
DANNBU

2017/08/03 13:10

ありがとうございます!! やっと解決しました 長い間親身に答えてくださりありがとうございました。 クラスについてもう少し勉強します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問