Juego Tic Tac Toe usando PyQt5 en Python

En este artículo, veremos cómo podemos crear un juego de Tic Tac Toe usando PyQt5 . Tres en raya, ceros y cruces, o Xs y Os es un juego de papel y lápiz para dos jugadores, X y O, que se turnan para marcar los espacios en una cuadrícula de 3×3. El jugador que logra colocar tres de sus marcas en una fila horizontal, vertical o diagonal es el ganador.

A continuación se muestra cómo se verá el juego Tic Tac Toe:
 

Tic Tac Toe gui

Pasos de implementación de la GUI:
1. Cree una lista de botones pulsadores 
2. Dispóngalos en orden de 3×3 y agrégueles una fuente 
3 . Cree una etiqueta debajo de los botones que indique el resultado 
4. Establezca la alineación y la fuente de la etiqueta 
5 . Agregue otro botón para reiniciar el juego en la parte inferior 

Pasos de implementación de back-end :
1. Cree dos variables para saber de quién es la oportunidad y saber cuántas oportunidades se completan 
2 . Agregue la misma acción a la lista de botones de modo que cada botón llame a la misma acción 
3 . Dentro del método de acción, obtenga el botón por el cual se llama al método utilizando el método del remitente 
4. Establezca el texto en el botón de acuerdo con la posibilidad y desactívelo para que no se pueda presionar nuevamente y llame al método who_wins 
5 . Configure el texto de acuerdo con la respuesta devuelta por el método who_wins 
6 . Dentro del método who_wins comprueba si las filas, columnas y diagonales están cruzadas o no. 
7.Si alguien ganó el partido, establezca el texto en la etiqueta y deshabilite todos los botones 
8. Agregue acción al botón de reinicio 
9 . Dentro de la acción del botón de reinicio, establezca el valor de la variable en el valor inicial y active todos los botones y deje en blanco la etiqueta y el texto del botón. 

A continuación se muestra la implementación:
 

Python3

# importing required libraries
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtCore import *
  
import sys
  
# create a Window class
class Window(QMainWindow):
    # constructor
    def __init__(self):
        super().__init__()
  
        # setting title
        self.setWindowTitle("Python ")
  
        # setting geometry
        self.setGeometry(100, 100, 
                         300, 500)
  
        # calling method
        self.UiComponents()
  
        # showing all the widgets
        self.show()
  
    # method for components
    def UiComponents(self):
  
        # turn
        self.turn = 0
  
        # times
        self.times = 0
  
        # creating a push button list
        self.push_list = []
  
        # creating 2d list
        for _ in range(3):
            temp = []
            for _ in range(3):
                temp.append((QPushButton(self)))
            # adding 3 push button in single row
            self.push_list.append(temp)
  
        # x and y co-ordinate
        x = 90
        y = 90
  
        # traversing through push button list
        for i in range(3):
            for j in range(3):
  
                # setting geometry to the button
                self.push_list[i][j].setGeometry(x*i + 20, 
                                                 y*j + 20,
                                                 80, 80)
  
                # setting font to the button
                self.push_list[i][j].setFont(QFont(QFont('Times', 17)))
  
                # adding action
                self.push_list[i][j].clicked.connect(self.action_called)
  
        # creating label to tel the score
        self.label = QLabel(self)
  
        # setting geometry to the label
        self.label.setGeometry(20, 300, 260, 60)
  
        # setting style sheet to the label
        self.label.setStyleSheet("QLabel"
                                 "{"
                                 "border : 3px solid black;"
                                 "background : white;"
                                 "}")
  
        # setting label alignment
        self.label.setAlignment(Qt.AlignCenter)
  
        # setting font to the label
        self.label.setFont(QFont('Times', 15))
  
        # creating push button to restart the score
        reset_game = QPushButton("Reset-Game", self)
  
        # setting geometry
        reset_game.setGeometry(50, 380, 200, 50)
  
        # adding action action to the reset push button
        reset_game.clicked.connect(self.reset_game_action)
  
  
    # method called by reset button
    def reset_game_action(self):
  
        # resetting values
        self.turn = 0
        self.times = 0
  
        # making label text empty:
        self.label.setText("")
  
        # traversing push list
        for buttons in self.push_list:
            for button in buttons:
                # making all the button enabled
                button.setEnabled(True)
                # removing text of all the buttons
                button.setText("")
  
    # action called by the push buttons
    def action_called(self):
  
        self.times += 1
  
        # getting button which called the action
        button = self.sender()
  
        # making button disabled
        button.setEnabled(False)
  
        # checking the turn
        if self.turn == 0:
            button.setText("X")
            self.turn = 1
        else:
            button.setText("O")
            self.turn = 0
  
        # call the winner checker method
        win = self.who_wins()
          
        # text
        text = ""
  
        # if winner is decided
        if win == True:
            # if current chance is 0
            if self.turn == 0:
                # O has won
                text = "O Won"
            # X has won
            else:
                text = "X Won"
  
            # disabling all the buttons
            for buttons in self.push_list:
                for push in buttons:
                    push.setEnabled(False)
  
        # if winner is not decided
        # and total times is 9
        elif self.times == 9:
            text = "Match is Draw"
  
        # setting text to the label
        self.label.setText(text)
  
  
    # method to check who wins
    def who_wins(self):
  
        # checking if any row crossed
        for i in range(3):
            if self.push_list[0][i].text() == self.push_list[1][i].text() \
                    and self.push_list[0][i].text() == self.push_list[2][i].text() \
                    and self.push_list[0][i].text() != "":
                return True
  
        # checking if any column crossed
        for i in range(3):
            if self.push_list[i][0].text() == self.push_list[i][1].text() \
                    and self.push_list[i][0].text() == self.push_list[i][2].text() \
                    and self.push_list[i][0].text() != "":
                return True
  
        # checking if diagonal crossed
        if self.push_list[0][0].text() == self.push_list[1][1].text() \
                and self.push_list[0][0].text() == self.push_list[2][2].text() \
                and self.push_list[0][0].text() != "":
            return True
  
        # if other diagonal is crossed
        if self.push_list[0][2].text() == self.push_list[1][1].text() \
                and self.push_list[1][1].text() == self.push_list[2][0].text() \
                and self.push_list[0][2].text() != "":
            return True
  
  
        #if nothing is crossed
        return False
  
  
  
# create pyqt5 app
App = QApplication(sys.argv)
  
# create the instance of our Window
window = Window()
  
# start the app
sys.exit(App.exec())

Producción : 
 

Publicación traducida automáticamente

Artículo escrito por rakshitarora y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *