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

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

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

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

Q&A

解決済

1回答

975閲覧

五目並べ 勝敗判定(classかdef)

DANNBU

総合スコア19

Python

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

0グッド

0クリップ

投稿2017/08/01 09:46

編集2017/08/01 10:34

###前提・実現したいこと
pythonで五目並べの勝敗判定を行おうとしているのですが、初心者なので教えていただきたい所があります
今class TicTacToe(QGraphicsItem)と
class class MainWindow(QWidget)の二つのクラスがあるのですが
勝敗判定を行うときは新たにclass を作った方がよいのか、それとも上記二つのどちらかに関数として作るのかどちらが良いのでしょうか?

またclassを作ったときはどこから新たなclassを呼びだしたらいいのでしょうか

お願いします。

###該当のソースコード

lang

1from PyQt5.QtCore import (QLineF, QPointF, QRectF, Qt) 2from PyQt5.QtGui import (QBrush, QColor, QPainter) 3from PyQt5.QtWidgets import (QWidget, QApplication, QGraphicsView, QGraphicsScene, QGraphicsItem, 4 QGridLayout, QVBoxLayout, QHBoxLayout, 5 QLabel, QLineEdit, QPushButton) 6 7import numpy as np 8 9class TicTacToe(QGraphicsItem): 10 def __init__(self): 11 super(TicTacToe, self).__init__() 12 #盤の情報記憶 13 self.board = [[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1], 14 [-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1], 15 [-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1], 16 [-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],[-1, -1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]] 17 18 19 self.goban = np.zeros((16, 16)) 20 self.O = 0 21 self.X = 1 22 self.turn = self.O 23 self.kuro = 1 24 self.siro = -2 25 self.space = 0 26 self.now = self.kuro 27 28 #盤の情報を設定 29 def reset(self): 30 for y in range(16): 31 for x in range(16): 32 self.board[y][x] = -1 33 self.goban[y][x] = 0 34 self.turn = self.O 35 self.update() 36 37 def select(self, x, y): 38 if x < 1 or y < 1 or x > 15 or y > 15: 39 return 40 #self.board[y][x]が0であればself.turnを1にし黒の番にする 41 #self.board[y][y]が1であればself.turnを-2にし白の番にする 42 if self.board[y][x] == -1: 43 if self.turn == 0: 44 self.turn = 1 - self.turn 45 self.goban[y][x] = self.turn 46 self.board[y][x] = self.turn 47 elif self.turn == 1: 48 self.turn = self.turn * -2 49 self.goban[y][x] = self.turn 50 self.board[y][x] = self.turn 51 elif self.turn == -2: 52 self.turn = self.turn * -1 -1 53 self.goban[y][x] = self.turn 54 self.board[y][x] = self.turn 55 elif self.board[y][x] == 1 or self.board[y][x] == -2: 56 print("そこには置けません") 57 58 59 def paint(self, painter, option, widget): 60 painter.setPen(Qt.black) 61 62 self.goban_left_top_x = 30 63 self.goban_left_top_y = 30 64 self.length_of_between = 30 65 self.goban_line_num = 15 66 67 68 69 #茶色の盤面にするための表示 70 painter.setBrush(QColor(255, 80, 0, 160)) 71 painter.drawRect(self.goban_left_top_x, self.goban_left_top_y ,self.goban_left_top_x * (self.goban_line_num - 1),self.goban_left_top_y * (self.goban_line_num - 1)) 72 73 #盤の黒い縦線と横線の記述 74 for x in range(self.goban_left_top_x, self.goban_left_top_x + self.length_of_between * self.goban_line_num, self.length_of_between): 75 painter.drawLine(x, self.goban_left_top_y, x, self.goban_left_top_y + self.length_of_between * (self.goban_line_num - 1)) 76 77 for y in range(self.goban_left_top_y, self.goban_left_top_y + self.length_of_between * self.goban_line_num, self.length_of_between): 78 painter.drawLine(self.goban_left_top_x, y, self.goban_left_top_x + self.length_of_between * (self.goban_line_num - 1), y) 79 80 81 for y in range(1, 16): 82 for x in range(1, 16): 83 cross_point_x = self.goban_left_top_x + self.length_of_between * (x - 1) 84 cross_point_y = self.goban_left_top_y + self.length_of_between * (y - 1) 85 if self.goban[y][x] == self.kuro: 86 painter.setBrush(Qt.black) 87 painter.drawEllipse(QPointF(cross_point_x, cross_point_y), 10, 10) 88 elif self.goban[y][x] == self.siro: 89 painter.setBrush(Qt.white) 90 painter.drawEllipse(QPointF(cross_point_x, cross_point_y), 10, 10) 91 92 def boundingRect(self): 93 return QRectF(0,0,600,600) 94 95 #マウスを押したときのイベント(黒の縦線と横線の交差するところに碁を置くための記述) 96 def mousePressEvent(self, event): 97 pos = event.pos() 98 99 hantei_ryouiki_satan = int(self.goban_left_top_x - int(self.length_of_between / 2)) 100 x_from_hantei_ryouiki_satan = int(pos.x()) - hantei_ryouiki_satan 101 102 hantei_ryouiki_joutan = int(self.goban_left_top_y - int(self.length_of_between / 2)) 103 y_from_hantei_ryouiki_joutan = int(pos.y()) - hantei_ryouiki_joutan 104 105 x = int(x_from_hantei_ryouiki_satan / self.length_of_between) +1 106 y = int(y_from_hantei_ryouiki_joutan / self.length_of_between) +1 107 print("x = {}, y = {}\n".format(x, y)) 108 self.select(x, y) 109 self.update() 110 super(TicTacToe, self).mousePressEvent(event) 111 112#class MainWindow(QGraphicsView): 113class MainWindow(QWidget): 114 def __init__(self): 115 super(MainWindow, self).__init__() 116 self.initUI() 117 118 def initUI(self): 119 self.graphicsView = QGraphicsView() 120 scene = QGraphicsScene(self.graphicsView) 121 self.graphicsView.setScene(scene) 122 self.tic_tac_toe = TicTacToe() 123 scene.addItem(self.tic_tac_toe) 124 125 vbox = QVBoxLayout() 126 127 vbox.addWidget(self.graphicsView) 128 self.setLayout(vbox) 129 130 #画面の大きさ 131 scene.setSceneRect(0, 0, 600, 600) 132 mainLayout = QHBoxLayout() 133 mainLayout.addLayout(vbox) 134 135 136 self.setWindowTitle("Tic Tac Toe") 137 138 #Rキーを押したら終了する 139 def keyPressEvent(self, event): 140 key = event.key() 141 if key == Qt.Key_R: 142 self.tic_tac_toe.reset() 143 super(MainWindow, self).keyPressEvent(event) 144 145 146 147if __name__ == '__main__': 148 import sys 149 app = QApplication(sys.argv) 150 mainWindow = MainWindow() 151 152 mainWindow.show() 153 sys.exit(app.exec_())

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

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

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

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

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

LouiS0616

2017/08/01 09:54

コードはマークダウンして見やすくしてください。前回出来たのでわかりますね?
LouiS0616

2017/08/01 09:56

また、さすがにこの量読む気にはならないかと思います。もう少し全体の方針とか関数/メソッドの役割を示すとか、コードをただ貼る以上の情報を示してほしいところです。
DANNBU

2017/08/01 10:35

ご指摘ありがとうございます。少し編集しました
guest

回答1

0

ベストアンサー

オブジェクト指向的な観点で言えば、TicTacToeクラスはQGraphicItemsを継承すべきではありません。
「三目並べはグラフィックスの一種」とはとても言い切れないからです。
本来なら、TicTacToeクラス内でQGraphicItemsクラスに描画を委譲した方がよいでしょう。


ただし、現状ある程度コードが出来ているのなら、とりあえず完成させてもよいかと思います。
次の二つの方法があるでしょう。一長一短です。(後者の方が雑、そして楽)

  • 判定用のクラスを作り、TicTacToeクラス内にインスタンスを作る。
  • TicTacToeクラス内に、判定用のメソッドを作る。

あんまり詳しくコードを見ていないのですが、ところどころ冗長な個所が目につきます。

Python

1if self.board[y][x] == -1: 2 if self.turn == 1: 3 self.turn = self.siro 4 elif self.turn == -2: 5 self.turn = self.kuro 6 else: 7 self.turn = self.kuro 8 9 self.goban[y][x] = self.turn 10 self.board[y][x] = self.turn 11 12else: 13 print("そこには置けません")

これくらいシンプルで良いんじゃないですかね。if-elif-else文の使い方を再確認してください。
(動作確認はしていません、参考にする程度でお願いします。)

あとは、for文ももっとシンプルになる気がします。いろいろ試してみてください。

投稿2017/08/01 12:23

編集2017/08/01 12:51
LouiS0616

総合スコア35658

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

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

DANNBU

2017/08/01 13:17

ありがとうございます! いろいろと試行錯誤してみます、またわからないところがあったらお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問