Advertisement
Sax

PyZapv3

Sax
May 9th, 2013
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.14 KB | None | 0 0
  1. #PyZap
  2. # -*- coding: utf-8 -*-
  3.  
  4. #TODO
  5.  
  6. #minor -> agregar boton de reset
  7. #minor -> untogglear botones con clear
  8. #minor -> self.line_edit.clear()agregar un nuevo shortcut en letras repetidas
  9. #minor -> de-focusear botones después de oprimidos
  10.  
  11. import random
  12. import csv
  13. import sys
  14. import unittest as u
  15. from PySide import QtGui, QtCore
  16.  
  17. class MainWindow(QtGui.QMainWindow):
  18.  
  19.     def __init__(self, parent=None):
  20.         super(MainWindow, self).__init__(parent)
  21.  
  22.         self.initUI()
  23.  
  24.     def initUI(self):
  25.         """Inicia la Ventana del juego."""
  26.  
  27.         self.statusBar().showMessage('Listo.')
  28.  
  29.         self.widget = MainWidget()
  30.         self.setCentralWidget(self.widget)
  31.  
  32.         self.setGeometry(300, 300, 300, 300)
  33.         self.setWindowTitle('PyZap')
  34.         self.setWindowIcon(QtGui.QIcon('icon.png'))
  35.         self.show()
  36.  
  37. class MainWidget(QtGui.QWidget):
  38.    
  39.         def __init__(self, parent=None):
  40.             super(MainWidget, self).__init__(parent)
  41.             self.init_ui()
  42.  
  43.         def init_ui(self):
  44.             #Aqui van las weas graficas
  45.  
  46.             self.grid= QtGui.QGridLayout()
  47.             self.grid.setSpacing(10)
  48.  
  49.             self.letter_grid = QtGui.QGridLayout()
  50.             self.letter_grid.setSpacing(10)
  51.  
  52.             pos = [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0), (2,1), (2,2)]
  53.             j = 0
  54.  
  55.             for i in pyzap.letras_escogidas:
  56.                 button = QtGui.QPushButton(i)
  57.                 button.setShortcut(str(i))
  58.                 button.setCheckable(True)
  59.                 button.clicked[bool].connect(self.typea)
  60.                 self.letter_grid.addWidget(button, pos[j][0], pos[j][1])
  61.                 j = j + 1
  62.  
  63.             self.line_edit = QtGui.QTextEdit()
  64.             self.line_edit.setReadOnly(True)
  65.             self.line_edit.setMaximumHeight(25)
  66.  
  67.             self.grid.addLayout(self.letter_grid, 0, 0)
  68.  
  69.             self.clear_button = QtGui.QPushButton('Clear')
  70.             self.clear_button.setShortcut("Ctrl + Q")
  71.             self.clear_button.clicked.connect(self.line_edit.clear)
  72.  
  73.             self.ok_button = QtGui.QPushButton("OK")
  74.             self.ok_button.setShortcut("Enter")
  75.             self.ok_button.clicked.connect(self.send)
  76.            
  77.             self.grid.addWidget(self.clear_button, 0, 1)
  78.             self.grid.addWidget(self.line_edit, 1, 0, 1, 1)
  79.             self.grid.addWidget(self.ok_button, 2, 1)
  80.            
  81.  
  82.             self.grid.addWidget(QtGui.QLabel("Tus Palabras"), 2,0)
  83.  
  84.             self.tus_palabras = QtGui.QTextEdit()
  85.             self.tus_palabras.setReadOnly(True)
  86.  
  87.             self.grid.addWidget(self.tus_palabras, 3, 0, 1, 1)
  88.  
  89.             self.setLayout(self.grid)
  90.             self.show()
  91.  
  92.  
  93.         def typea(self, pressed):
  94.             """Escribe el texto del boton."""
  95.  
  96.             source = self.sender()
  97.  
  98.             if pressed:
  99.                  self.line_edit.insertPlainText(source.text())
  100.             else:
  101.                 self.line_edit.clear()
  102.                
  103.  
  104.         def send(self):
  105.             """Envia word para ser validada. Regresa texto si succedea."""
  106.  
  107.             word = self.line_edit.toPlainText()
  108.             print "La palabra enviada fue " + str(word) #debug
  109.            
  110.             self.line_edit.clear()
  111.  
  112.             valid = self.validate_word(word)
  113.  
  114.             if valid:
  115.                 repeated = self.check_repeated(word)
  116.                 if not repeated:
  117.                     pyzap.your_words.append(word)
  118.                     self.tus_palabras.append(word)
  119.                     window.statusBar().showMessage("Correcto!")
  120.                 else:
  121.                     self.line_edit.insertPlainText(
  122.                     "Ya usaste esa palabra!")
  123.                     window.statusBar().showMessage(
  124.                     "Ya usaste esa palabra!")
  125.             else:
  126.                 self.line_edit.insertPlainText(
  127.                     "Esa palabra no se puede formar o no existe")
  128.                 window.statusBar().showMessage(
  129.                     "Esa palabra no se puede formar o no existe!")
  130.  
  131.             if len(pyzap.your_words) == 10:
  132.                 #ShowDialogBox diciendo que ganaste
  133.                 msg = QtGui.QMessageBox.information(self, "Felicidades!",
  134.                                                     "Has logrado formar 10 palabras!")
  135.  
  136.         def validate_word(self, word):
  137.             """Valida que la palabra este presente en el diccionario."""
  138.             return word in pyzap.palabras2
  139.  
  140.         def check_repeated(self, word):
  141.             """Valida que la palabra no haya sido usada antes."""
  142.             return word in pyzap.your_words
  143.  
  144.            
  145.  
  146. class PyZap(object):
  147.    
  148.     def __init__(self, parent=None):
  149.  
  150.         self.init_mind()
  151.  
  152.     def init_mind(self):
  153.         """Inicia procesos de la aplicacion."""
  154.  
  155.         self.alpha = self.create_alpha()
  156.         print "Alfabeto creado correctamente" #Debug
  157.         print "--------------------------------------------" #Debug
  158.        
  159.         self.letras_escogidas = self.get_sample()
  160.         print "Letras de la corrida: " + str(self.letras_escogidas)
  161.         print "--------------------------------------------" #Debug
  162.  
  163.         print "Comenzando busqueda lv1 en diccionario seleccionado..." #debug
  164.         self.palabras1 = self.first_search(
  165.             self.letras_escogidas)
  166.  
  167.         print "Busqueda lv1 concluida.\nComenzando busqueda lv2..." #debug
  168.         self.palabras2 = self.second_search(
  169.             self.palabras1, self.letras_escogidas)
  170.         print "Hecho." #Debug
  171.         print "--------------------------------------------" #Debug
  172.  
  173.         self.your_words = []
  174.  
  175.     def create_alpha(self):
  176.         """Regresa el alfabeto a utilizar en el PyZap."""
  177.         zipo= []
  178.         letters = list("abcdefghijklmnopqrstuvwxyz")
  179.  
  180.         for row in reader:
  181.             zipo.append(tuple(row))
  182.  
  183.         for (char,proba) in zipo:
  184.             for i in range(int(proba)):
  185.                 letters.append(char)
  186.  
  187.         return letters
  188.  
  189.     def get_sample(self):
  190.         """Regresa una muestra de LETRAS letras entre el alfabeto disponible.
  191.        LETRAS es una constante definida en el main().
  192.  
  193.        """
  194.  
  195.         chosen = random.sample(self.alpha,LETRAS)
  196.  
  197.         for el in chosen:
  198.             if el is "a" or el is "e"or el is "i" or el is "o" or el is "u":
  199.                 check = True
  200.                 break
  201.             else:
  202.                 check = False
  203.  
  204.         if check is False:
  205.             self.get_sample()
  206.         else:
  207.             return chosen
  208.  
  209.     def first_search(self, search_terms):
  210.         """Realiza la primera busqueda de palabras dentro de 'diccionario' que
  211.        contengan cualquier elemento de search_terms.
  212.  
  213.        Los search_terms son una sola lista de caracteres. Cada elemento de la
  214.        lista es una letra.
  215.  
  216.        Tras haber encontrado las palabras, las copia a un diccionario a RAM
  217.        en el siguiente formato:
  218.  
  219.        'palabra' : num_de_coincidencias, num_de_caracteres
  220.  
  221.        Regresa el diccionario antes mencionado.
  222.  
  223.        """
  224.        
  225.         diccionario.seek(0)
  226.         results = []
  227.  
  228.         for word in diccionario:
  229.             word = word.rstrip()
  230.             for term in search_terms:
  231.                 if word.find(term) != -1:
  232.                     results.append(word)
  233.  
  234.         first_search_words = {}
  235.  
  236.         for word in results:
  237.             if word not in first_search_words:
  238.                 first_search_words[word] = [results.count(word), len(word)]
  239.  
  240.         return first_search_words
  241.  
  242.     def second_search(self, first_search_words, search_terms):
  243.         """Recibe el diccionario en ram con las first_search_words para refinar
  244.        la busqueda.
  245.  
  246.        Primero se eliminan los resultados que tengan menos coincidencias que
  247.        numero de caracteres. Posteriormente, cada palabra es separada en
  248.        caracteres, y se comparan uno a uno con las letras escogidas en el run.
  249.  
  250.        Regresa una lista de palabras.
  251.  
  252.        """
  253.  
  254.         flagged_for_deletion = []
  255.  
  256.         for word in first_search_words:
  257.             if first_search_words.get(word)[0] < first_search_words.get(word)[1]:
  258.                 flagged_for_deletion.append(word)
  259.  
  260.         for word in flagged_for_deletion:
  261.             del first_search_words[word]
  262.  
  263.         used_chars = []
  264.         final_words = []
  265.         keys = first_search_words.keys()
  266.  
  267.         for word in keys:
  268.  
  269.             available = list(search_terms)
  270.             used_chars[:] = []
  271.             actual_word = list(word)
  272.  
  273.             for current_char in actual_word:
  274.                 if current_char in available:
  275.                     used_chars.append(current_char)
  276.                     available.remove(current_char)
  277.  
  278.             actual_word.sort()
  279.             used_chars.sort()
  280.             available[:] = []
  281.  
  282.             if actual_word == used_chars:
  283.                 final_words.append(word)
  284.  
  285.         return final_words
  286.  
  287.  
  288. def main():
  289.  
  290.     app = QtGui.QApplication(sys.argv)
  291.     global reader, diccionario, archivo, pyzap, window, LETRAS
  292.  
  293.     LETRAS = 9
  294.     FILE = "diccionario"
  295.  
  296.     archivo = open('probas.csv', 'r+')
  297.     diccionario = open(FILE, 'r+')
  298.     reader = csv.reader(archivo, delimiter=',')
  299.    
  300.     print "Iniciando..." #Debug
  301.  
  302.     pyzap = PyZap()
  303.     window = MainWindow()
  304.  
  305.     print "Las coincidencias en el diccionario son las siguientes:" #Debug
  306.     print pyzap.palabras2 #Debug
  307.  
  308.     sys.exit(app.exec_())
  309.    
  310. if __name__ == '__main__':
  311.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement