コード例 #1
0
ファイル: main.py プロジェクト: dengapin/PythonProyecto
class Main(QtGui.QMainWindow):
    global coorX
    global coorY
    global criptar
    global celdaSeleccionada
    global casilla
    global valorPad
    global ficheroActual
    global ruta    
    
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.ui = Ui_Sudoku()
        self.ui.setupUi(self)
        self.casilla = []
        self.valorPad = []
        self.celdaSeleccionada = False
        self.ficheroActual =" "
        self.ruta = " "
        self.criptar = " "
        self.iniciarArreglo()
        self.iniciarValorPad()
        self.initGui()
        self.ui.pushButton.hide()
        self.ui.actionQuit.triggered.connect(self.close)
        self.ui.actionSave.triggered.connect(self.guardarPartida)
        self.ui.actionNew.triggered.connect(self.actionNew)
        self.ui.actionClose.triggered.connect(self.cerrar)
        self.ui.hintButton.clicked.connect(self.botonHintClicked)
        self.ui.nullButton.clicked.connect(self.botonNuloClicked)
        self.ui.normalButton.clicked.connect(self.botonNormalClicked)
        self.ui.clueButton.clicked.connect(self.botonClueClicked)
        
    def iniciarArreglo (self):
        """Crea e inicializa la matriz self.casilla de clase numero()"""
        del self.casilla [:]
        for i in range (9):
            self.casilla.append ([])
            for j in range(9):
                celda = numero()
                self.casilla[i]. append ([])
                celda = numero()
                celda.setFila(i)
                celda.setColumna(j)
                celda.setNumReal(0)
                celda.setNumeroAsignado(0)
                celda.setColor(0)
                celda.setEsConstante(False)
                self.casilla [i][j] = celda
    
    def iniciarValorPad(self):
        """ Crea el arreglo QPushbutton con los valores 
            del 1 al 9 para jugar el sudoku"""
        for i in range(9):
            self.valorPad.append ([])
            numSelec = QPushButton()
            numSelec.setText(str(i+1))
            self.valorPad[i] = numSelec
                
    def initGui(self):
        """Crea el tablero dentro del gridLayout con matriz self.casilla, 
           y a la vez agrega el arreglo de valores permitidos(1-9) en el sudoku"""
        self.coorX = -1
        self.coorY = -1
        
        flag = False
        for i in range(9):
            for j in range(9):
                celda = self.casilla [i][j]
                if(flag):
                    celda.setColor(0)
                    celda.setStyleSheet('QPushButton {background-color: SteelBlue; color: Brown; font:bold}' )
               
                else:
                    celda.setColor(1)
                    celda.setStyleSheet('QPushButton {background-color: LightPink; color: Brown; font:bold}' )
                
                self.casilla[i][j].clicked.connect(self.celdaClicked)
                self.ui.gridLayout.addWidget(self.casilla[i][j],i,j)
                
                if(j % 3 == 2):
                    flag = not(flag)
            
            if(i % 3 != 2):
                flag = not (flag)
        
        for i in range(9):
            self.ui.numberPad.addWidget(self.valorPad[i],i/3, i%3)
            self.valorPad[i].setStyleSheet('QPushButton {background-color: LightGreen; color: white; font:bold}')
            self.valorPad[i].clicked.connect(self.numeroClicked)
            
        self.ui.nullButton.setText('Borrar')
        self.ui.nullButton.setEnabled(False)
        self.ui.nullButton.setStyleSheet('QPushButton {background-color: LightSlateGray; color: white; font:bold}')
        self.celdaSeleccionada = False
        
        self.ventanaInvalida()
    
    def celdaClicked(self):
        """Selecciona el casillero al que se le quiere asignar un valor,
            obteniendo sus respectivos atributos"""
        if (not (self.celdaSeleccionada)):
            self.celdaSeleccionada = True
        else:
            celda = self.casilla[self.coorX][self.coorY]
            
            if(celda.getColor == 0):
                celda.setStyleSheet('QPushButton {background-color: SteelBlue; color: Brown; font:bold}')
            else:
                celda.setStyleSheet('QPushButton {background-color: LightPink; color: Brown; font:bold}')

        celda = numero()
        celda = self.sender() 
        self.coorX = celda.getFila()
        self.coorY = celda.getColumna()
        if (celda.getNumReal() == celda.getNumeroAsignado()):
            self.ui.radioButton.setChecked(True)
        else:
            self.ui.radioButton.setChecked(False)
        
        for i in range(9):
            numSelec = self.valorPad[i] 
            numSelec.setEnabled(True)
        if(self.ui.hintButton.isChecked()):
            self.validarCelda()
            
        celda.setStyleSheet('QPushButton {background-color: orange; font:bold}')
        
    def numeroClicked(self):
        """Selecciona el valor que se desea asignar a una casilla correspondiente
           y a la vez agrega dicho valor a esa casilla"""
        numero = QPushButton()
        numero = self.sender()
        if(self.celdaSeleccionada):
            celda = self.casilla[self.coorX][self.coorY]
            numSelec = self.valorPad[celda.getNumeroAsignado() -1]
            numSelec.setEnabled(True)
            celda.setText(numero.text())
            asignar = int
            asignar = int(numero.text())
            celda.setNumeroAsignado(asignar)
            
            if (celda.getNumReal() == celda.getNumeroAsignado()):  
                self.ui.radioButton.setChecked(True)         
            else:
                self.ui.radioButton.setChecked(False)
            
            if(self.ui.hintButton.isChecked()):
                numSelec.setEnabled(False)
                 
            self.ui.nullButton.setEnabled(True)
            
            if(self.sudokuCompleto()):
                self.ventanaInvalida()
        else:
            if(self.ui.clueButton.isChecked()):
                self.ventanaInvalida()
                self.ui.groupBox_2.setEnabled(True)
                
                numero = QPushButton()
                numero = self.sender()
                print numero.text()
                for k in range(9):
                    for l in range(9):
                        celda = self.casilla[k][l]
                        celda.setStyleSheet('background-color: springGreen; font:bold')
                
                for k in range(9):
                    for l in range(9):
                        celda = self.casilla[k][l]
                        if (celda.getNumeroAsignado()):
                            asignar = int
                            asignar = int(numero.text())    
                            if (celda.getNumeroAsignado() == asignar):
                                centerX = k/3
                                centerY = l/3
                                for i in range(9):
                                    for j in range(9):
                                        celda1 = self.casilla[i][j]
                                        if((i == k or j == l or (i/3 == centerX and j/3 == centerY ))):
                                            if (not celda1.getNumeroAsignado()):
                                                if(celda1.getColor() == 0):
                                                    celda1.setStyleSheet('QPushButton {background-color: SteelBlue; color: Brown; font:bold}' )
                                                else:
                                                    celda1.setStyleSheet('QPushButton {background-color: LightPink; color: Brown; font:bold}' )
                            if(celda.getColor() == 0):
                                celda.setStyleSheet('QPushButton {background-color: SteelBlue; color: Brown; font:bold}' )
                            else:
                                celda.setStyleSheet('QPushButton {background-color: LightPink; color: Brown; font:bold}' )
            for i in range(9):
                numero = self.valorPad[i]               
                numero.setEnabled(True)        
            
    def sudokuCompleto(self):
        for i in range(9):
            for j in range(9):
                celda = self.casilla[i][j]
                if (celda.getNumReal() != celda.getNumeroAsignado()):
                    return False
        return True
            
    def generadorSudoku(self, fila):
        if(fila > 8):
            return
        
        digitArray = [1, 2, 3, 4, 5, 6, 7, 8, 9]
                       
        temp = [0] * 9
        random.shuffle(digitArray)
            
        flag = False
        for i in range(9):
            for j in range(9):
                flag = False
                if (digitArray[j] >= 1):
                    if(self.asignarNumero(0, fila, i, digitArray[j])):
                        digitArray[j] = -1
                        flag = True
                    
                    if (flag):
                        break
        
        for k in range(9):
            celda = self.casilla[fila][k]
            temp[k] = celda.getNumReal()
            
        self.generadorSudoku(fila+1)
    
    def validarCeldaConNum(self, fila, columna, valor, cont):
        """Valida que el numero este correcto dentro de la celda asignada"""
        centerX = fila / 3
        centerY = columna / 3
        
        for i in range(9):
            for j in range(9):
                if((i == fila or j == columna or (i/3 == centerX and j/3 == centerY))):
                    celda = self.casilla[i][j]
                    if(celda.getNumReal()):
                        if( not(i == fila and j == columna - cont) and valor == celda.getNumReal()):
                            return False
        return True     
                   
    def asignarNumero(self,cont, fila, columna, valor):
        """Asigna el valor dentro de una celda, dada una fila y columna correspondiente"""
        if(cont > columna):
            return False
        else:
            celda = self.casilla[fila][columna - cont]
            if((not cont and self.validarCeldaConNum(fila, columna, valor, 0)) or (cont and self.validarCeldaConNum(fila, columna, celda.getNumReal(), cont) and self.validarCeldaConNum(fila, columna - cont, valor, 0))):
                if(not (cont)):
                    celda = self.casilla[fila][columna]
                    celda.setNumReal(valor)
                else:
                    celda = self.casilla[fila][columna-cont]
                    asign = self.casilla[fila][columna]
                    asign.setNumReal(celda.getNumReal())
                    
                    celda.setNumReal(valor)
                return True
            else:
                cont += 1
                return self.asignarNumero(cont, fila, columna, valor)
    
    def limpiarTablero(self):
        """Limpia el tablero"""
        for i in range(9):
            for j in range(9):
                celda = self.casilla[i][j]
                celda.setNumReal(0)
                celda.setNumeroAsignado(0)
                celda.setText("")
                
    def comprobarTableroVacio(self):
        """Comprueba que el tablero este vacio"""
        for i in range(9):
            for j in range(9):
                celda = self.casilla [i][j]
                if(not (celda.getNumReal())):
                    return False
        return True
    
    def actionNew(self):
        """Inicializa el tablero, un juego nuevo"""
        self.limpiarTablero()
        
        while(not(self.comprobarTableroVacio())):
            self.limpiarTablero()
            self.generadorSudoku(0)
        
        for k in range(0, 30):
            fila = random.randint(0,8)
            columna = random.randint(0,8)
            cont = 0
            
            for i in range(9):
                for j in range(9):
                    if(i == fila or j == columna or (i/3 == fila/3 and j/3 == columna/3)):
                        celda = self.casilla[i][j]
                        if(celda.getEsConstante()):
                            cont +=1
                if(cont < 5):
                    celda = self.casilla[fila][columna]
                    celda.setEsConstante(True)
                    celda.setEnabled(False)
                    celda.setText(str(celda.getNumReal()))
                    celda.setNumeroAsignado(celda.getNumReal())
                    celda.setStyleSheet('QPushButton {background-color: LightPink; color: Brown; font:bold}')
                else:
                    k -= 1    
                    
        self.ventanaInvalida()
        self.ventanaValida()
            
    
                    
                
     #int(x) Returns x converted to an int; x may be a string or a number   
            
    def validarCelda(self):
        centerX = self.coorX/3
        centerY = self.coorY/3
        
        for i in range(9):
            for j in range(9):
                if(i == self.coorX or j == self.coorY or (i/3 == centerX and j/3 == centerY )):
                    celda = self.casilla[i][j]
                    if (celda.getNumeroAsignado()):
                        valor = celda.getNumeroAsignado()
                        numSelec = self.valorPad[valor -1]
                        numSelec.setEnabled(False)
        
        celda = self.casilla[self.coorX][self.coorY]
        if(not(celda.getNumeroAsignado())):
            self.ui.nullButton.setEnabled(False)
        else:
            self.ui.nullButton.setEnabled(True)
            
    def ventanaInvalida(self):
        """Inhabilita el juego"""
        self.coorX = -1
        self.coorY = -1
        
        for i in range(9):
            for j in range(9):
                celda = self.casilla[i][j]
                celda.setEnabled(False)
                
                if(celda.getColor() == 0):
                    celda.setStyleSheet('QPushButton {background-color: SteelBlue; color: Brown}')
                else:
                    celda.setStyleSheet('QPushButton {background-color: LightPink; color: Brown}')
            
            numSelec = self.valorPad[i]
            numSelec.setEnabled(False)
        
        self.ui.nullButton.setEnabled(False)
        self.ui.radioButton.setChecked(False)
        self.celdaSeleccionada = False
        
        self.ui.groupBox_2.setEnabled(False)     
        
    def ventanaValida(self):
        """Habilitar el juego"""
        for i in range(9):
            for j in range(9):
                celda = self.casilla[i][j]
                if (not(celda.getEsConstante())):
                    celda.setEnabled(True)
        
        self.ui.groupBox_2.setEnabled(True)
             
    def cerrar(self):
        """Limpia el tablero e inhabilita el tablero hasta que el
            jugador designe un nuevo juego"""
        self.limpiarTablero()
        self.ventanaInvalida()
        
    def botonNuloClicked(self):
        """Boton que elimina un valor seleccionado del tablero"""
        if (self.celdaSeleccionada):
            celda = self.casilla[self.coorX][self.coorY]
            valor = celda.getNumeroAsignado()
            self.valorPad[valor -1].setEnabled(True)
            celda.setText("")
            celda.setNumeroAsignado(0)
            self.ui.nullButton.setEnabled(False)
            self.ui.radioButton.setChecked(False)
    
    def botonNormalClicked(self):
        """Realiza el juego de modo normal, sin ayuda, ni validaciones"""
        self.ventanaInvalida()
        self.ventanaValida()
        for i in range (9):
            numSelec = self.valorPad[i]
            numSelec.setEnabled(True)
        self.ui.gridLayout.setEnabled(True)
        if (self.celdaSeleccionada):
            numSelec = self.valorPad[i]
            numSelec.setEnabled(True)
            
    def botonHintClicked(self):
        """Valida la celda seleccionada, desbloqueando solo los valores
           que estan permitidos en dicha celda"""
        self.ventanaInvalida()
        self.ventanaValida()
        for i in range (9):
            numSelec = self.valorPad[i]
            numSelec.setEnabled(True)
        self.ui.gridLayout.setEnabled(True)
        if (self.celdaSeleccionada):
            self.validarCelda()
            
    def botonClueClicked(self):
        """Indica las posibles posiciones en donde puede agregarse
            un numero seleccionado"""
        self.ventanaInvalida()
        self.ui.groupBox_2.setEnabled(True)
        for i in range (9):
            numSelec = self.valorPad[i]
            numSelec.setEnabled(True)
                    
    def guardarPartida(self):
        """"Guarda la partida encriptandola de forma hexadecimal"""
        codigo = []
        key = []
        hint = [""]*9
        binaryBuffer = 0
        self.criptar = PyQt4.QtCore.QString()
        delta = 0
        #chr(i) Returns a one-character str whose ASCII value is given by int i
        if(not(self.comprobarTableroVacio())):
            return
        for i in range(9):
            for j in range(9):
                if(not(j)):
                    codigo.append([])
                    hint.append([])
                    key.append([])
                    celda = self.casilla[i][j]
                    delta = celda.getNumReal()
                    codigo[i] = PyQt4.QtCore.QString(delta + 96)
                else:
                    celda1 = self.casilla[i][j - 1]
                    delta = celda.getNumReal() - celda1.getNumReal()
                    valor = int
                    valor = valor.__abs__(delta + 96)
                    codigo[i] = PyQt4.QtCore.QString(valor)

                if (delta > 0):
                    raiz = int
                    raiz = raiz.__pow__(2, 8- j)
                    binaryBuffer += raiz
                    
                celda = self.casilla[8 - i][8 - j]    
                num = celda.getNumeroAsignado()
                hint[i] += str(num)
                
            valor = PyQt4.QtCore.QString()
            valor.setNum(binaryBuffer, 16)
            key[i] = valor

            delta = 0
            binaryBuffer = 0
            self.criptar += ("%s\n" % codigo[i]) + ("%s\n" % key[i]) + ("%s\n" % hint[i])
            
            print self.criptar 
        
        for i in range(9):
            for j in range(9):
                celda = self.casilla[i][j]
                if (celda.getEsConstante()):
                    numI = str(i)
                    numJ = str(j)
                    self.criptar += ("%s\n" % numI) + ("%s\n" % numJ)
        
        if (self.ficheroActual):
            ruta_guardar = self.ficheroActual
        else:
            ruta_guardar = self.ruta
                        
        nombre_fichero = QtGui.QFileDialog.getSaveFileName(self, "Guardar fichero", ruta_guardar)
        guardar = open(nombre_fichero, 'w')
        guardar.write(self.criptar)
        guardar.close()   
        
    def abrirPartida(self):

        codigo = []
        key = []
        hint = [""] *9
        
        self.criptar = " "
        decimal = 0
        digito = 0
        
        self.limpiarTablero()
        
        nombre_open = QtGui.QFileDialog.getOpenFileName(self ,  'Abrir Archivo' , '' )
        abrir = open(nombre_open, 'r')
        contenido = abrir.read()
        seguidor = 0
        
        linea = PyQt4.QtCore.QString()
        linea = abrir.readline()
        print linea
            
        if(linea.length()):
            linea.replace("\n", "")
            if(seguidor > 27):
                lineaI = linea / 10
                print lineaI
                lineaJ = linea % 10
                print lineaJ
                celda = self.casilla[lineaI][lineaJ]
                celda.setEsConstante(True)
            else:
                if (seguidor % 3 == 0):
                    codigo [seguidor / 3] = linea
                    print linea
                else:
                    if (seguidor % 3 == 1):
                        key [seguidor / 3] = linea
                        print linea
                    else:
                        if (seguidor % 3 == 2):
                            hint [seguidor / 3] = linea
                            print linea
            seguidor += 1
コード例 #2
0
ファイル: main.py プロジェクト: dengapin/PythonProyecto
class Main(QtGui.QMainWindow):
    
    
    
    def __init__(self):
        QtGui.QWidget.__init__(self)
       # uifile = os.path.join(os.path.abspath(os.path.dirname(__file__)),"sudoku.ui")
       # uic.loadUi(uifile, self)
        self.ui = Ui_Sudoku()
        self.ui.setupUi(self)
        self.initGui()
   
     
              
    def initGui(self):
        global coorX
        global coorY
        global encriptar
        global celdaSeleccionada
        global casilla
        global valorPad
        casilla = [[0 for j in range(9)] for i in range(9)]
        valorPad = [0 for j in range(9)]
        coorX = -1
        coorY = -1
        
        flag = False
                  
        for i in range(0,9):    
            for j in range(0,9):
               celda = numero()
               celda.setFila(i)
               celda.setColumna(j)
               celda.setNumReal(0)
               celda.setNumAsignado(0)
               celda.setEsConstante(False)
               
               if(flag):
                   celda.setColor(0)
                   celda.setStyleSheet('QPushButton {background-color: red}' )
               else:
                   celda.setColor(1)
                   celda.setStyleSheet('QPushButton {background-color: blue}' )
               casilla [i][j]= celda
               self.ui.gridLayout.addWidget(celda,i,j)
               
               if(j % 3 == 2):
                    flag = not(flag)
            if(i % 3 != 2):
                flag = not (flag)
                  
        for i in range(0,9):
            numSelec = QPushButton(str(i+1))
            valorPad [i] = numSelec
            self.ui.numberPad.addWidget(numSelec,i/3, i%3)
            numSelec.setStyleSheet('QPushButton {background-color: black; color: white}')
    
        self.ui.nullButton.setText('Borrar')
        self.ui.nullButton.setEnabled(False)
        #self.ui.nullButton.setStyleSheet('QPushButton {background-color: black; color: white}')
        celdaSeleccionada = False
        self.ventanaInvalida()
        
    def ventanaInvalida(self):
        coorX = -1
        coorY = -1
        celda = numero()
        for i in range(0,9):
            for j in range(0,9):
                celda = casilla[i][j]
                celda.setEnabled(False)
                if(celda.getColor() == 0):
                    celda.setStyleSheet('QPushButton {background-color: red}')
                else:
                    celda.setStyleSheet('QPushButton {background-color: blue}')
            numSelec = QPushButton()
            numSelec = valorPad[i]
            numSelec.setEnabled(False)
        
        self.ui.nullButton.setEnabled(False)
        self.ui.radioButton.setChecked(False)
        celdaSeleccionada = False
        
        self.ui.groupBox_2.setEnabled(False)        
                    
    def celdaClicked(self):
        if(not(celdaSeleccionada)):
            celdaSeleccionada = True
        else:
            celda = casilla[coorX][coorY]
            if(celda.getColor == 0):
                celda.setStyleSheet('QPushButton {background-color: red}')
            else:
                celda.setStyleSheet('QPushButton {background-color: blue}')
        celda = numero()
        celda.sender()
        coorX = celda.getFila()
        coorY = celda.getColumna()
        
        if (celda.getNumReal() == celda.getNumeroAsignado()):
            self.ui.radioButton.setChecked(True)
        else:
            self.ui.radioButton.setChecked(False)
            numSelec = QPushButton() 
        for i in range(0,9):
            numSelec = valorPad[i] 
            numSelec.setEnabled(True)
        if(self.ui.radioButton.isChecked()):
            self.validarCelda()
        
        celda.setStyleSheet('QPushButton {background-color: orange}')
            
    def validarCelda(self):
        centerX = coorX/3
        centerY = coorY/3
        celda = numero()
        for i in range(0,9):
            for j in range(0,9):
                if(i == coorX | j == coorY | (i/3 == centerX & j/3 == centerY )):
                    celda = casilla[i][j]
                    if (celda.getNumeroAsignado()):
                        numSelec = QPushButton()
                        valor = celda.getNumeroAsignado()
                        numSelec = valorPad[valor -1]
                        numSelec.setEnabled(False)
        
        celda = casilla[coorX][coorY]
        if(not(celda.getNumeroAsignado())):
            self.ui.nullButton.setEnabled(False)
        else:
            self.ui.nullButton.setEnabled(True)