class PrepareBattle(QtWidgets.QWidget): graphics_scene = None opponent_player = None ally_player = None def __init__(self, parent=None): super(PrepareBattle, self).__init__(parent) self.threadpool = QThreadPool() layout = QtWidgets.QHBoxLayout() self.parent = parent self.opponent_player = False self.ally_player = False self.parent.board_plane = [[0 for x in range(16)] for y in range(16)] self.verticalLayoutWidget = QtWidgets.QWidget() self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 791, 511)) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.graphicsView = QtWidgets.QGraphicsView(self.verticalLayoutWidget) self.graphicsView.setMouseTracking(True) self.graphicsView.setObjectName("graphicsView") self.graphics_scene = GraphicsScene() self.graphicsView.setMouseTracking(True) self.graphicsView.setScene(self.graphics_scene) pen = QtGui.QPen(QtCore.Qt.darkCyan) side = 24 for i in range(16): for j in range(16): r = QtCore.QRectF(QtCore.QPointF(i * side, j * side), QtCore.QSizeF(side, side)) self.graphics_scene.addRect(r, pen) self.horizontalLayout.addWidget(self.graphicsView) self.gridLayout = QtWidgets.QGridLayout() self.gridLayout.setObjectName("gridLayout") pixmap = QtGui.QPixmap("images/plane_0.png") self.label_2 = DragLabel(self.verticalLayoutWidget, self.graphics_scene, 0) self.label_2.setMinimumSize(QtCore.QSize(100, 100)) self.label_2.setMaximumSize(QtCore.QSize(100, 100)) self.label_2.setAcceptDrops(True) self.label_2.setText("") self.label_2.setPixmap(pixmap) self.label_2.setScaledContents(True) self.label_2.setObjectName("label_2") self.label_2.setMouseTracking(True) self.gridLayout.addWidget(self.label_2, 1, 1, 1, 1) self.label_3 = DragLabel(self.verticalLayoutWidget, self.graphics_scene, 1) self.label_3.setMinimumSize(QtCore.QSize(100, 100)) self.label_3.setMaximumSize(QtCore.QSize(100, 100)) self.label_3.setAcceptDrops(True) self.label_3.setText("") self.label_3.setPixmap(pixmap) self.label_3.setScaledContents(True) self.label_3.setObjectName("label_3") self.label_3.setMouseTracking(True) self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) self.label_4 = DragLabel(self.verticalLayoutWidget, self.graphics_scene, 2) self.label_4.setMinimumSize(QtCore.QSize(100, 100)) self.label_4.setMaximumSize(QtCore.QSize(100, 100)) self.label_4.setAcceptDrops(True) self.label_4.setText("") self.label_4.setPixmap(pixmap) self.label_4.setScaledContents(True) self.label_4.setObjectName("label_4") self.label_4.setMouseTracking(True) self.gridLayout.addWidget(self.label_4, 0, 1, 1, 1) self.label = DragLabel(self.verticalLayoutWidget, self.graphics_scene, 3) self.label.setMinimumSize(QtCore.QSize(100, 100)) self.label.setMaximumSize(QtCore.QSize(100, 100)) self.label.setAcceptDrops(True) self.label.setText("") self.label.setPixmap(pixmap) self.label.setScaledContents(True) self.label.setObjectName("label") self.label.setMouseTracking(True) self.gridLayout.addWidget(self.label, 0, 0, 1, 1) self.label_5 = DragLabel(self.verticalLayoutWidget, self.graphics_scene, 4) self.label_5.setMinimumSize(QtCore.QSize(100, 100)) self.label_5.setMaximumSize(QtCore.QSize(100, 100)) self.label_5.setAcceptDrops(True) self.label_5.setText("") self.label_5.setPixmap(pixmap) self.label_5.setScaledContents(True) self.label_5.setObjectName("label_5") self.label_5.setMouseTracking(True) self.gridLayout.addWidget(self.label_5, 2, 0, 1, 1) self.horizontalLayout.addLayout(self.gridLayout) self.verticalLayout.addLayout(self.horizontalLayout) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem) self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget) self.pushButton.setMinimumSize(QtCore.QSize(100, 50)) self.pushButton.setObjectName("pushButton") self.pushButton.clicked.connect(self.click_battle_now) self.horizontalLayout_3.addWidget(self.pushButton) self.verticalLayout.addLayout(self.horizontalLayout_3) self.retranslateUi() QtCore.QMetaObject.connectSlotsByName(self) layout.addWidget(self.verticalLayoutWidget) self.setLayout(layout) self.wait_for_message() def click_battle_now(self): if self.graphics_scene.valid_plane_position != 0: self.ally_player = True try: if type(self.parent.conn) is socket.socket: self.parent.conn.send('Im set'.encode()) else: self.parent.conn.send('Im set'.encode()).fire() except Exception as e: print(e) if self.opponent_player and self.ally_player: print('Battle Time') self.prepare_battle() self.parent.goto_battle_field() else: msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setWindowTitle("Error. . .") msg.setText("Invalid values") msg.setInformativeText("Not all the planes are set in the board") msg.setStandardButtons(QMessageBox.Ok) msg.exec_() def wait_for_message(self): worker = Worker(self.receive_message) worker.signals.result.connect(self.print_output) worker.signals.finished.connect(self.thread_complete) worker.signals.progress.connect(self.progress_fn) self.threadpool.start(worker) def progress_fn(self, output): print("%s" % output) def print_output(self, result): if result: try: if result.decode('utf-8') == 'Im set': self.opponent_player = True if self.opponent_player and self.ally_player: print('Battle Time') self.prepare_battle() self.parent.goto_battle_field() except Exception as e: print(e) def thread_complete(self): print("THREAD COMPLETE!") def receive_message(self, progress_callback): try: progress_callback.emit('Waiting for message. . .') if type(self.parent.conn) is socket.socket: data = self.parent.conn.recv(1024) else: data = self.parent.conn.recv(1024).fire() except Exception as e: data = 'NULL' print(e) finally: return data def prepare_battle(self): for i in range(16): for j in range(16): for k in range(5): if self.graphics_scene.board_plane[i][j][k]: self.parent.board_plane[i][j] = True break else: self.parent.board_plane[i][j] = False def retranslateUi(self): _translate = QtCore.QCoreApplication.translate self.pushButton.setText(_translate("Form", "Battle"))
class BattleField(QtWidgets.QWidget): graphics_scene_defense = None graphics_scene_attack = None next_move_shot = None side = 24 def __init__(self, parent=None): super(BattleField, self).__init__(parent) self.parent = parent self.threadpool = QThreadPool() self.next_move_shot = False layout = QtWidgets.QHBoxLayout() self.verticalLayoutWidget = QtWidgets.QWidget() self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 791, 511)) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.graphicsView = QtWidgets.QGraphicsView(self.verticalLayoutWidget) self.graphicsView.setObjectName("graphicsView") self.graphics_scene_defense = GraphicsScene() self.graphicsView.setMouseTracking(True) self.graphicsView.setScene(self.graphics_scene_defense) pen = QtGui.QPen(QtCore.Qt.darkCyan) for i in range(16): for j in range(16): r = QtCore.QRectF(QtCore.QPointF(i * self.side, j * self.side), QtCore.QSizeF(self.side, self.side)) self.graphics_scene_defense.addRect(r, pen) self.horizontalLayout.addWidget(self.graphicsView) self.graphicsView_2 = QtWidgets.QGraphicsView( self.verticalLayoutWidget) self.graphicsView_2.setObjectName("graphicsView_2") self.graphics_scene_attack = GraphicsScene() self.graphicsView_2.setMouseTracking(True) self.graphicsView_2.setScene(self.graphics_scene_attack) self.graphics_scene_attack.mousePressEvent = self.shot_bullet pen = QtGui.QPen(QtCore.Qt.darkCyan) for i in range(16): for j in range(16): r = QtCore.QRectF(QtCore.QPointF(i * self.side, j * self.side), QtCore.QSizeF(self.side, self.side)) self.graphics_scene_attack.addRect(r, pen) self.horizontalLayout.addWidget(self.graphicsView_2) self.verticalLayout.addLayout(self.horizontalLayout) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem) self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget) self.pushButton.setMinimumSize(QtCore.QSize(100, 50)) self.pushButton.setObjectName("pushButton") self.horizontalLayout_3.addWidget(self.pushButton) self.verticalLayout.addLayout(self.horizontalLayout_3) self.retranslateUi() QtCore.QMetaObject.connectSlotsByName(self) layout.addWidget(self.verticalLayoutWidget) self.setLayout(layout) if type(self.parent.conn) is socket.socket: self.next_move_shot = True else: self.wait_for_shot() def retranslateUi(self): _translate = QtCore.QCoreApplication.translate self.pushButton.setText(_translate("Form", "Battle")) def shot_bullet(self, event): try: if self.next_move_shot: self.next_move_shot = False row = int(event.scenePos().y() / 24) column = int(event.scenePos().x() / 24) strout = ('Fire;Row:' + str(row) + ';Column:' + str(column)) if 0 <= row < 16 and 0 <= column < 16: if type(self.parent.conn) is socket.socket: self.parent.conn.send(strout.encode()) self.wait_for_shot() else: self.parent.conn.send(strout.encode()).fire() self.wait_for_shot() except Exception as e: print(e) def wait_for_shot(self): worker = Worker(self.receive_shot) worker.signals.result.connect(self.print_output) worker.signals.finished.connect(self.thread_complete) worker.signals.progress.connect(self.progress_fn) self.threadpool.start(worker) def progress_fn(self, output): print("%s" % output) def print_output(self, result): if result: try: result = result.decode('utf-8') tokens = result.split(';') if tokens[0] == 'Fire': row = int(tokens[1].split(':')[1]) column = int(tokens[2].split(':')[1]) pen = QtGui.QPen(QtCore.Qt.darkCyan) self.graphics_scene_defense.addLine( column * self.side + 2, row * self.side + 2, column * self.side + self.side - 2, row * self.side + self.side - 2, pen) self.graphics_scene_defense.addLine( column * self.side + self.side - 2, row * self.side + 2, column * self.side + 2, row * self.side + self.side - 2, pen) if self.parent.board_plane[row][column]: str_output = 'Result;Shot:Hit;Row:' + str( row) + ';Column:' + str(column) self.parent.board_plane[row][column] = False else: str_output = 'Result;Shot:Miss;Row:' + str( row) + ";Column:" + str(column) if self.finish_match(): str_output = str_output + ';Match:Won' if type(self.parent.conn) is socket.socket: self.parent.conn.send(str_output.encode()) else: self.parent.conn.send(str_output.encode()).fire() msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setWindowTitle("Too bad") msg.setText("Too bad! You lost the match.") msg.setStandardButtons(QMessageBox.Ok) msg.exec_() self.next_move_shot = True elif tokens[0] == 'Result': result = tokens[1].split(':')[1] row = int(tokens[2].split(':')[1]) column = int(tokens[3].split(':')[1]) if len(tokens) == 5: match = tokens[4].split(':') if match[1] == 'Won': msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setWindowTitle("Congratulations") msg.setText("Congratulations! You won the match.") msg.setStandardButtons(QMessageBox.Ok) msg.exec_() if result == 'Hit': pen = QtGui.QPen(QtCore.Qt.red) else: pen = QtGui.QPen(QtCore.Qt.green) self.graphics_scene_attack.addLine( column * self.side + 2, row * self.side + 2, column * self.side + self.side - 2, row * self.side + self.side - 2, pen) self.graphics_scene_attack.addLine( column * self.side + self.side - 2, row * self.side + 2, column * self.side + 2, row * self.side + self.side - 2, pen) self.next_move_shot = False self.wait_for_shot() except Exception as e: print(e) def thread_complete(self): print("THREAD COMPLETE!") def finish_match(self): for i in range(16): for j in range(16): if self.parent.board_plane[i][j]: return False return True def receive_shot(self, progress_callback): try: progress_callback.emit('Waiting for message. . .') if type(self.parent.conn) is socket.socket: data = self.parent.conn.recv(1024) else: data = self.parent.conn.recv(1024).fire() except Exception as e: data = 'NULL' print(e) finally: return data