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

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

ただいまの
回答率

88.93%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,102

DANNBU

score 19

前提・実現したいこと

随時更新されていくリストの情報を他のクラスに渡したい

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

今現在三目並べのプログラムを作っていますが、盤の情報を

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の情報が更新されておらず
初期状態として呼び出してしまうのですが、やはりどこか間違っているのでしょうか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

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

class Board:
    def __init__(self):
        #省略

    def is_gameover(self):
        #
        #処理
        #
        return #bool

    def winner(self):
        #
        #処理
        #
        return #勝者

追記

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

"""main"""
from filename import Board
b = Board()
while 1:
    #処理
    if b.is_gameover():
        #処理

追記2

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

def mousePressEvent(self, event):
        pos = event.pos()

        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)
        self.update()
        #
        #ここに勝敗判定メソッドを入れる
        #
        super(TicTacToe, self).mousePressEvent(event)

追記3

a = TicTacToe()
a.Check_winner()


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

self.Check_winner()
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.Check_winner()
    ###

    self.update()

        super(TicTacToe, self).mousePressEvent(event)
    #追加メソッド 
    def Check_winner(self):
        print(self.board)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/03 21:48

    ありがとうございます。

    追記したので見ていただければ嬉しいです。

    キャンセル

  • 2017/08/03 22:01

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

    キャンセル

  • 2017/08/03 22:10

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

    キャンセル

0

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


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

  • TicTacToeクラス (全体の実行を管理)
  • Boardクラス (盤面の状況を管理、表示)
  • Judgeクラス (勝敗の判定)
class TicTacToe:
    def __init__(self):
        self.board = Board()
        self.judge = Judge(self.board)

    ...

    def play(self):
        self.board.reset()

        while True:
            self.board.wait_to_select()
            if self.judge.judge():
                break

        print(self.judge.get_winner(), 'has won.')

    ...

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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