Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



viernes, 28 de junio de 2013

Un editor Latex Online



WriteLatex: Un editor Latex Online

Cada vez abundan más herramientas  online, y me he topado con este que me parece muy interesante...
Se trata de un editor latex, si de latex.... , online, que te permite crear, modificar,  ¡¡y compartirlos!!!, permitendotelo ver y descargar el archivo .pdf que genere tu documento.


Ademas de incluir plantillas y ejemplos, he comprobado que se pueden usar  usepackage{}, para ir añadiendo paquetes con nuevas funcionalidades, sin tener que instalar nada, por supuesto..., algo que es muy ventajoso ya que no tienes que instalar los paquetes en tu ordenador.

Por ejemplo, lo he usado para incluir el userpackage de listings que sirve para añadir codigo fuente y tenerlo formateado, con numero de linea e incluso definir el coloreado.

Código de ejemplo:
\lstset{emph={for,end}, emphstyle=\color{red},emph={[2]z,n, v},emphstyle={[2]\color{blue}}}
\lstset{ breaklines=true, basicstyle=\footnotesize}
\lstset{numbers=left, numberstyle=\tiny, stepnumber=1, numbersep=-2pt}
\begin{lstlisting}[frame=single]
  % suma de los elementos de un vector
  ajdfa a jsdf asadsfjk asdjklfa  asdjklfds asdjf dsfkl adsfj sdf asjkfd adsf a d jsdj dasjklfasf asd sd ds ds
  z = 0;
  n = length(v);
  for i=1:1:n
    z = z + v[i];
  end
\end{lstlisting}

Genera esta escrito:

Como veis, enumera las lineas, si la linea es mayor que el ancho disponible, la muestra indentada en la siguiente linea. Además he definido "palabras claves" con un color para ellas.



Este servicio es gratuito (incluye 100 mb) , aunque tiene otros planes de pago, para ampliar espacio, y opciones:


Nota:
En el "servicio gratuido",  por cada persona que se apunte con tu link de referido  (este es el mio)

Obtienes 50 mb más de espacio (hasta llegar a un máximo de 1 gb)


Enlace:
https://www.writelatex.com
http://minisconlatex.blogspot.com.es/2012/04/escribir-codigo-de-programacion-en.html

Otra Herramienta útil relacionada con Latex:
https://www.sharelatex.com/

viernes, 21 de junio de 2013

Programación con PyQT4: Paso y modificación de valores entre formularios

Programación con PyQT4: Paso y modificación de valores entre formularios

Una forma que se me ha ocurrido (puede haber más y mejores), para pasar datos de un formulario es aprovechar que los objetos se pasan por referencia y no por valor, para usarlo para pasar datos.


Esquema:

En el esquema anterior, podemos ver dos formularios (A y B). El A le envía información al B, para que sea editada. El B se encargará reenviar la información una vez modificada por el usuario.


Para hacer esto posible, mediante el uso de "paso por  referencia", hacemos lo siguiente:

1º Creamos una clase "Dato", que contiene varias propiedades con distintas variables.
class dato():
    base="" #contendrá un texto
    lista=[] #contendrá una lista

En el formulario A y B, crearemos una variable que sea de este tipo, 

#en el Formulario A
valorFA=dato() #creamos una instancia de la clase  dato()

#en el Formulario B
valorFB=dato() #creamos una instancia de la clase  dato()

En el formulario A,  igualamos a la variable del formularioB, la variable A (la estamos pasando por referencia)
#en el Formulario A
FormularioB.valorFB=valorFA 

Llamamos al formulario de modo modal:
FormularioB.exec_()

Ahora se abre el formulario B, donde modificaremos los datos recibidos y cuando pulsemos el botón, de cerrar el formulario, antes,  asignaremos los valores tomados a la variable valorFB
#en el formulario B
valorFB.base= ....
valorFB.lista = .... 
self.close() #se cierra el formulario

Cuando cerremos el el formulario, como la variable valorFA se ha pasado por referencia, esta contiene las  modificaciones que se hayan realizado en el formulario B, obteniendola modificada por ese formulario.

Ejemplo:

Consiste en dos formularios donde:
-> Formulario (A): tiene dos etiquetas, cuyo contenido vamos a modificar al abrir el otro formulario (B).
-> El otro formulario (de edición), contiene dos QtextEdit, que inicialmente toman los valores de las etiquetas del formulario inicial,y podemos modificar. Si pulsamos con el botón aceptar, se cierra y se modificaran los valores en el formulario (A), si le damos a cancelar se cierra pero no se modifican las etiquetas.














Enlace de descarga del ejemplo completo: enlace











Manualidades: Recortables para las vacaciones



Manualidades:

 Recortables para la vacaciones

Ahora que empiezan las vacaciones y hay tener distraidos a los crios (y no tan críos),  os dejo esta interesante web que he encontrado donde podeis obtener cientos de plantillas de recortables.

http://cp.c-ij.com/es/contents/1006/index.html




Temática de los
 recortables



Tiene cientos de recortables de distinta dificultad (para pequeños como para personas adultas) y temática

Ejemplo de recortable e instrucciones de montaje

El proceso es fácil:
1) Te descargas los archivos en .PDF de los recortables y las instrucciones de montaje (en algunos recortables es fundamental ya que tiene bastantes piezas.)
2) Lo imprimes.
3) Lo recortas y pegas las piezas según las instrucciones


Ejemplos

Para peques:
http://cp.c-ij.com/es/contents/3158/doll-wedding/index.html



http://cp.c-ij.com/es/contents/3160/halloween-bag-o/index.html
http://cp.c-ij.com/es/contents/2028/shuttle/index.html

Para Adultos:
http://cp.c-ij.com/es/contents/2027/toytrain/index.html

http://cp.c-ij.com/es/contents/3154/florence-cathedral/index.html




jueves, 20 de junio de 2013

El nuevo blog de gambas-es.org Sortea Una Raspberry Pi

blog.gambas-es.org

El nuevo blog de gambas-es.org 

Sortea Una Raspberry Pi


Acaba de crearse el nuevo blog de gambas-es.org realizado por jguardon, el administrador del foro de gambas en castellano http://www.gambas-es.org/ , y como promoción del blog, se ha creado un  sorteo de una Raspberry Pi.

Os podeis apuntar gratuitamente al sorteo pero antes leer las reglas del sorteo en este enlace: http://blog.gambas-es.org/sorteo/reglas-del-sorteo/




 y luego apuntaros al mismo en esta dirección http://blog.gambas-es.org/sorteo/









SUERTE!!!

Programación con PyQT4: Cuadro de dialogos modales


Programación con PyQT4:  Cuadro de diálogos modales

Algunas veces nos interesa que cuando que abramos un cuadro de dialogo o formulario para pedir datos, ese sea del tipo modal, con la intención de que hasta que no se cierre, no se pueda volver al formulario anterior (que este quede como inhabilitado: enabled).  Para ello usaremos el método exec_() en vez del show().
A continuación os dejo la explicación de la documentación oficial (ver enlace) y su traducción, de como usarlo y las diferencia con el método show(), y un ejemplo.


Modal Dialogs

A modal dialog is a dialog that blocks input to other visible windows in the same application. Dialogs that are used to request a file name from the user or that are used to set application preferences are usually modal. Dialogs can beapplication modal (the default) or window modal.
When an application modal dialog is opened, the user must finish interacting with the dialog and close it before they can access any other window in the application. Window modal dialogs only block access to the window associated with the dialog, allowing the user to continue to use other windows in an application.
The most common way to display a modal dialog is to call its exec_() function. When the user closes the dialog, exec_() will provide a useful return value. Typically, to get the dialog to close and return the appropriate value, we connect a default button, e.g. OK, to the accept() slot and a Cancel button to the reject() slot. Alternatively you can call the done() slot with Accepted or Rejected.
An alternative is to call setModal(true) or setWindowModality(), then show(). Unlike exec_(), show() returns control to the caller immediately. Calling setModal(true) is especially useful for progress dialogs, where the user must have the ability to interact with the dialog, e.g. to cancel a long running operation. If you use show() and setModal(true) together to perform a long operation, you must call QApplication.processEvents() periodically during processing to enable the user to interact with the dialog. (See QProgressDialog.)


Traducido por el traductor de google:
Cuadros de diálogo modales
Un cuadro de diálogo modal es un diálogo que bloquea la entrada a otras ventanas visibles en la misma aplicación. Los diálogos que se utilizan para solicitar un nombre de archivo del usuario o que se utilizan para establecer preferencias de la aplicación suelen ser modal. Los diálogos pueden ser modal de la aplicación (por defecto) o modal ventana.
Cuando se abre un cuadro de diálogo modal aplicación, el usuario debe terminar la interacción con el diálogo y cerrarlo antes de que puedan acceder a cualquier otra ventana de la aplicación. Cuadros de diálogo modales ventana sólo bloquean el acceso a la ventana asociada con el cuadro de diálogo, que permite al usuario seguir utilizando otras ventanas en una aplicación.
La manera más común para mostrar un cuadro de diálogo modal es llamar a su función exec_(). Cuando el usuario cierra el cuadro de diálogo, exec_() proporcionará un valor de retorno útil. Normalmente, para conseguir el diálogo para cerrar y volver al valor adecuado, conectamos un botón predeterminado, por ejemplo, "OK", para   la ranura (slot) accept() y un botón "Cancelar" en la ranura (slot) reject(). Alternativamente, usted puede llamar a la ranura de done() con Aceptado o Rechazado.
Una alternativa es llamar setModal (true) o setWindowModality (), y luego show(). A diferencia exec_ (), show() devuelve el control al llamador inmediato. Calling setModal (true) es especialmente útil para los diálogos de progreso, donde el usuario debe tener la capacidad de interactuar con el cuadro de diálogo, por ejemplo, para cancelar una operación de larga duración. Si utiliza show () y setModal (true) juntos para realizar una operación larga, debe llamar QApplication.processEvents () periódicamente durante el proceso para que el usuario pueda interactuar con el diálogo. (Ver QProgressDialog.)


Ejemplo:
Os dejo un simple ejemplo, en el hay 2 fomularios:
  • (Ui_principal
  • Ui_FormularioSegundo
, los cuales a su vez son usados por la clase main.py y Formlario2.py.

Ejecutando el main.py, veremos que nos sale este formulario


Dependiendo que botón pulsemos, nos abrirá el formularioSegundo modal (exec_() ) o no (show())




Descarga del código de ejemplo: enlace

Nota:
El ejemplo esta realizado usando el ide Eric4, como proyecto.
Para abrir el ejemplo, descomprimelo en una carpeta, ve al ide de Eric4, y en el menu eliges la opción Proyecto/Abrir, ve a la carpeta donde lo descomprimiste y eliges el archivo: DialogoModales.e4p


Ref: http://pyqt.sourceforge.net/Docs/PyQt4/qdialog.html





¿sabes quien es Jose Chamizo? Exdefensor del Pueblo Andaluz

 ¿sabes quien es 
Jose Chamizo? 
Exdefensor del
Pueblo Andaluz

A uno de los diputados del Parlamento andaluz le hicieron el otro día una sencilla suma de ingresos y el hombre se revolvió molesto, como si lo hubieran ofendido gravemente. La operación matemática consistía en algo tan sencillo como sumar los ingresos que recibe su familia en concepto de alquiler, que les paga la Junta de Andalucía a él como diputado y exconsejero del Gobierno andaluz y a ella en su condición de alto cargo, en concreto como directora de la Agencia de la Competencia, que debe de ser una más de la incontable lista de agencias, observatorios y milongas de las que se adorna el Ejecutivo autonómico.

La cuestión es que, por ser los dos de Almería, la provincia más lejana de Sevilla, donde se encuentra la sede del Parlamento andaluz, reciben, además de su sueldo, una indemnización de 1.500 euros para el alquiler de un piso. Son marido y mujer, socialistas ambos, y obviamente viven en el mismo inmueble, pero la Junta de Andalucía les paga dos alquileres. En total, en el caso del exconsejero, algo más de 5.000 mil euros mensuales porque se suma el sueldo de diputado, las dietas de transporte por tener la residencia oficial en Almería (aunque no la habite), y la mencionada ayuda por alquiler. A esa cantidad, habría que sumarle los ingresos de la directora, que deben ser similares.

Él es Manuel Recio, que fue el consejero al que le estalló el caso de los ERE que apañaron sus antecesores, y ella es María Victoria Román, que trabajaba en la Universidad de Almería hasta que a su marido lo nombraron para el Gobierno y a ella también le abrieron hueco con otro cargo en Sevilla. Silvia Moreno, que fue la periodista que hizo las cuentas, le preguntó al diputado por qué les pagaban por dos alquileres si sólo tenían alquilado un piso y él se revolvió contrariado: “Cobramos lo legalmente establecido y todo está declarado”.
 

Si se repasa el despropósito, cobrar dietas de desplazamiento por estar censados en una provincia en la que no se vive y percibir dos indemnizaciones por un mismo alquiler, podríamos pensar que, ante un fraude tan flagrante, a los afectados nos les queda otra salida que la renuncia y la devolución del dinero cobrado de más; pero no, en la política andaluza este tipo de abusos pasan inadvertidos porque son muchos los que mojan sus privilegios en la misma cazuela legislativa. Los mismos dirigentes políticos que hacen grandes discursos contra la exclusión social, con golpes de pecho de izquierda, son los que pasan por caja, cada mes, sin reparo alguno para cobrar sus abultados emolumentos.
 

A esa distrofia parece haberse acostumbrado todo el mundo porque, en el fondo, lo que subyace es un profundo sentimiento de casta política, la endogamia política, tan perceptible en las autonomías. Todo se limita a un cansino y pueril intercambio de reproches continuos, en los que se barajan siempre los mismos argumentos políticos y se repiten las mismas respuestas sectarias. Así, sesión plenaria tras sesión plenaria, año tras año, legislatura tras legislatura.

Hubo un día en el Parlamento de Andalucía que, en una de esas cansadas sesiones del mismo cruce dialéctico de siempre, el defensor del pueblo andaluz, José Chamizo, que presentaba un informe anual al que nadie le prestaba atención porque la disputa política iba por los senderos acostumbrados, cogió el micrófono en un arrebato para dirigirse a todos, diputados del PSOE, de Izquierda Unida o del Partido Popular. Y dijo: “La gente está muy cabreada con ustedes, no sé si lo saben. Está muy enfadada porque los ven todo el día en la peleíta. La gente está hasta el gorro de todos ustedes. No sé si puedo decirlo con todo el cariño del mundo. Por favor, por favor… Un ejercicio de buena voluntad y avanzar para resolver los problemas del personal. Y nada más. Perdónenme el exabrupto pero es que tenía ganas de decirlo. Muchas gracias”.

De ese incidente, por denominarlo de alguna forma, no ha pasado todavía un año, pero el efecto que ha tenido en la clase política andaluza ha sido espectacular. Pocos días después del ‘rapapolvo’, todos los portavoces de los grupos parlamentarios se reunieron para hacerle llegar al defensor del pueblo el malestar por sus palabras, que tuvieron, sin embargo, un eco extraordinario en la población. Chamizo, por otra parte, no pidió disculpas y se ha reafirmado mil veces más en la necesidad de que la clase política cambie porque “no se dan cuenta de que la gente está aburrida y eso es muy delicado para el sistema democrático”


En esas, todos los grupos parlamentarios andaluces, todos, acordaron por unanimidad acelerar la sustitución del defensor por otra persona que aporte a la institución “un nuevo perfil”. Quizá sea este el primer gran acuerdo por consenso del Parlamento andaluz en esta legislatura: quitarse de en medio a quien osó reprochar a los diputados la esterilidad de muchos de sus debates, que nada tienen que ver con los problemas reales de la calle. 


José Chamizo, un cura de barrio que llegó al cargo por su lucha contra las mafias de la droga, ha sido defensor del pueblo por unanimidad durante 16 años y por unanimidad lo van a largar por la animadversión generada este año. En el punto de inflexión entre las dos unanimidades, la última cacicada de la clase política andaluza.


Enlaces: 
wikipedia: http://es.wikipedia.org/wiki/Jos%C3%A9_Chamizo

miércoles, 19 de junio de 2013

Aplicación: Generador de Carnets

Generador de Carnets

 
Este utilidad os va a servir para generar carnets que se autorellenen, con los datos que le suministreis.

 Los datos se introducen atreves de un formulario, o mediante  "arrastrar y soltar"el archivo de la fotografía del alumno, en este caso se aprovecha el nombre del archivo para rellenar los datos del alumno.

Contiene una serie de plantillas de carnets (biblioteca, Deportes, Club, etc), que se pueden editar y/o crear nuevas a partir de ellas, mediante el programa Inkscape.

Podemos añadir fotos desde archivos o tomarlas directamente desde la web cam.

Permite enumerar los carnet automáticamente dado un número inicial.  Imprimir todos los carnets, o un grupo de ellos o incluso un carnet determinado (por ejemplo, por si se ha perdido)

Para imprimirlos, se genera un fichero .PDF.

Nuevo!!! Lista de Videotutoriales Actualizados:






Algunas capturas de pantalla:
Captura de fotografías, mediante webcam

Gestión de Plantillas



Previsualización de plantillas rellenas con los datos




Archivo .PDF creado por la impresión de los carnets 

El programa es softwarelibre y gratuito, lo podeis descargar en la web del proyecto:
http://generadorcarnets.blogspot.com.es/





martes, 18 de junio de 2013

Utilidad para hacer Diplomas y rellenarlos automáticamente: Constructor de Diplomas


  Constructor de Diplomas


Al final de cada trimestre o ciclo, se suele hacer diplomas a los alumnos para incentivarlos en sus estudios. Esta herramienta os va a ayudar a realizar un conjunto de diplomas personalizados por alumnos y tipo de diploma. 

 Tendréis a vuestra disposición varios diplomas "tipo" los cuales se pueden modificar o crear nuevos a partir de ellos, usando Inkscape (editor vectorial que también es softwarelibre). Luego podéis añadir los datos del grupo de alumnos y el diploma que se le otorga. El programa rellenará con estos datos los diplomas, y obtendréis la impresión mediante archivos  .PDF  o .SVG (que permiten ser reeditados con Inkscape).

Video donde podeis ver como se instala y/o actualiza el programa:

Os dejo aquí varias capturas de pantallas:

Añadiendo Datos de Alumnos y Diploma otorgado.


Previsualización de diplomas rellenado con datos


Diplomas generados en formato .PDF

Este programa es softwarelibre y gratuito, y os lo podeis descargar en la página del proyecto: http://constructordiploma.blogspot.com.es/



Programas Con Caducidad....


Programas Con Caducidad....

Últimamente, por la crisis,  se habla de alargar (o eliminar directamente), la fecha de caducidad de algunos alimentos (Enlace).

En lo relacionado a la informática, ya existía un tipo de programas que tenían esta fecha de caducidad (los programas de evaluación o de prueba)...

Pero.... ¿os habéis encontrado alguna vez con un programa que no sea de ese tipo, y que deje de funcionar "misteriosamente" a partir de una fecha? (nota: no hablo de programas que dejen de tener soporte, como le pasará a Window XP, sino que directamente dejen de funcionar)

Pues yo si:  Se trataba de un programa de cálculo que usábamos en el trabajo, (comprado legalmente y con su correspondiente mochila), que se usaba muy  de vez en cuando y que un buen día, cuando quisimos volver a usarlo, dejo de funcionar... dando un misterioso error de memoria. 

El caso es que nos pusimos en contacto con el autor (era autónomo  y no una empresa), mandándole diversos pantallazos del error que se producía...... la contestación fue que era un problema de la versión que teníamos del sistema operativo, ya que nuestros ordenadores y sistema operativo eran de 64 bits, y el programa (antigüillo este), era de 32 bits... el caso que nos solucionaba el problema vendiéndonos la nueva versión de 64 bits para windows 7, que estaba apunto de salir al mercado.......

Para no esperar a "la nueva versión" de 64 bits (que estaba a punto de sacar y que había por supuesto que pasar por caja para tenerla), nos pusimos a buscar un ordenador antiguo y un sistema de 32 bits antiguo... al final pudimos localizar un windows 98 e instalarlo en una "moderna máquina"  pentium III... y en principio, ya debería de estar solucionado el tema, pero que va, seguía dándonos el mismo error.... (os hablo que estuvimos liados más de una semana enredados con el problema del dichoso programita....entre  buscar, formatear, instalar y reinstalar ...)

El caso que ya desesperados, un viernes a las 15.00 hora, (hora de irnos), cuando ya lo dábamos como imposible el resolver el problema, y pensando en tener que comprar la nueva versión..., se le ocurre a un compañero, cambiar la fecha del sistema operativo (a varios años atrás de la fecha actual) y desconectarlo de la red del trabajo (ya que el ordenador "actualizaba" la hora cada vez que nos conectamos a la red, ojo!, nos dimos cuenta de esto al probar varias veces...).--

Y... entonces...  el programa funcionó de maravilla, como el primer día...       

    Nos acordamos de toda los parientes cercanos y lejanos del autor del programa y de su "protección" ...e intento de vendernos "la moto" de su nueva versión...    


Nota:
Al tiempo que nos pasó esto, por circunstancia del destino, , también conocimos a otra empresa con el mismo programa y versión,  y que tubo el mismo problema, pero ellos si compraron  la "nueva versión de 64 bits"... ellos también se acordaron de la toda la familia del dichoso programador.

Nota 2:
Historia totalmente verídica, sufrida por el autor de este post  

lunes, 17 de junio de 2013

Foro para hablar sobre la publicidad en los blogs..


Os dejo aqui un "recien nacido" foro sobre el tema de la publicidad en los blog:


Allí se puede hablar de :

- Trucos y Consejos
- Blog/Paginas web de los usuarios registrados
- Empresas publicitarias.
- Experiencias
- Cafetería: de todo un poco


El caso es de informar a los blogueros de trucos, consejos, evitar conductas ilícitas, y  de la realidad de los beneficios que se pueden obtener de la publicidad en nuestros blogs.

viernes, 14 de junio de 2013

Listas en Gambas3: variant[]


Listas en Gambas3: variant[]

Gambas3 (al igual que Python) gestiona colecciones de valores
llamadas variant[] (listas o arrays dinámicos).

A diferencia de los arrays o matrices en otros lenguajes de programación, las listas poseen características más avanzadas y potentes, como la posibilidad de trabajar con diferentes tipos de datos, ordenar o invertir los datos, etc.




Descarga del proyecto de ejemplo: ejemplo


Enlace a la documentación oficial:
http://gambasdoc.org/help/comp/gb/variant[]?es&v3

jueves, 13 de junio de 2013

Me han tocado 600.000 euros!!!!

Me toca la lotería de Australia, 

y encima sin jugar... manda huevos...

Hola a todos, hoy esto muy feliz, porque he recibido esta buena noticia:
un cangurito de Australia me ha escrito:

LA SEDE DE LA LOTERIA DE AUSTRALIA.
Ref: 4758961725
Lote: ALLINC 70564943902/188
Ganar no: FGNGB2701/LPRC
Estimado afortunado ganador,
Nos complace informarle de su liberacion el premio el 11th de Junio de 2012 del Programa Internacional para la loteria de Australia, que esta completamente basado en una seleccion electronica de los ganadores mediante sus direcciones de correo electronico. Su direccion de correo electronico se adjunto a Ref: 4758961725, Lote: ALLINC 70564943902/188 por lo tanto gana la loteria en la segunda categoria y el ganador no: FGNGB2701/LPRC. Yo se han aprobado una suma global de EE.UU.$600,000.00 en efectivo el total de efectivo premio de US6 millones de dolares de los EE.UU. compartida entre los diez afortunados ganadores en esta categoria.
Ademos, mas sus datos (direccion de correo electronico) cae dentro de nuestra oficina de representacion de Inglaterra, como se indica en nuestra cupon de juego, y su premio de los EE.UU.$600,000,00. se dara a conocer a usted de nuestro centro de pago regionales en Londres. COMO PRESENTAR SU RECLAMO: Simplemente Fiducially en contacto con nuestro agente de reclamaciones en Londres, nuestro pago regional, con la siguiente informacion:
AQUA CONTACTO Su agente de reclamaciones
Agente de reclamaciones: Sr. George Meyers
Diario Correo electronico: george.meyers001@gmail.com
Posicion: Verificacion de la Loteria/Departamento de Reclamaciones,
Tel?fono: +44-702-402-3255.
Enhorabuena una vez mas de todos los directivos y el personal de la loteria de Australia Inc. Todos nuestros afortunados ganadores de este ano. Gracias por ser parte de este programa de loteria de promocion.
Enhorabuena una vez mas el ganador!
Tracy Chapman
(coordinador).
GESTION,
LOTERIA NACIONAL INC
Copyright © 1968-2011 Loteria Inc. Todos los derechos Reserved.


En fin... se trata de otra estafa o timo.... con lo bien que me venia el dinerito.... :(




miércoles, 12 de junio de 2013

Juego De Dominó hecho con Python (III): El Código Fuente

Juego De Dominó hecho 

con Python (III): 

El Código Fuente

Bien, una vez visto el esquema del programa, pasamos a ver y comentar el código fuente

La función Main: 
Es donde vamos a elegir el tipo Torneo y tipo de jugadores. Después pasaremos a jugar las partidas correspondientes.



Pregunta: ¿por qué para salir del bucle while hago que la variable punto sea igual que 120?
Respuesta: De esa forma, hago que cuando se vuelva a examinar la condición "punto<100" esta sea falsa y se termine de ejecutar el bucle...
Pregunta: ¿hay otra forma de hacerlo?
Respuesta: Si usando la orden Break (mucho más simple, e intuitivo :) )


La clase Jugador:


Comentarios:
Solo se ha creado una clase Jugador, que tiene una variable "tipo" que diferencia entre "CPU" y "HUMANO" y también tenemos una variable "inteligencia", que nos ayuda a saber que inteligencia va a tener la CPU (de las fichas que puede colocar en la "serpiente": 1: coloca una aleatoriamente, 2: coloca la ficha más pesada, 3: coloca la ficha doble más pesada, y si no tiene coloca la que más pese).

Esto funciona...si... pero es muy mejorable.

¿que pasa si tenemos otro tipo de jugador, por ejemplo jugador en red ?
¿que pasa si hay más inteligencias, por ejemplo si una CPU va a usar el algoritmo minimax para elegir la ficha a colocar?
Habría que alterar el código del método de la clase jugador, ampliándolo para admitir esos casos, básicamente añadiendo más grupos de instruciones if...then..., creando un código muy largo y difícil de comprobar , añadir más futuros casos y encontrar posibles errores.

Solución:
Lo mejor es usar la Herencia de Clases, y creamos, a partir de la clase Jugador, varias clases Heredadas de esta, con el método "colocar" redefinido con las caracteristicas del jugador/inteligencia (aprovechamos el concepto de polimorfismo)... consiguiendo que él código fácilmente ampliable.


Mejora: Usar Herencia con la clase Jugador





La Función Partida:




Como podéis ver, se sigue el esquema:



Nota: 
Para mezclar las fichas, he usado la funcion random.shuffle, que es una función que genera una lista con los elementos desordenados aleatoriamente, para poderla usar necesitamos importar el módulo random





Funciones varias:
- Para contar nº de fichas que tiene una lista
- Funciones para mostrar opciones que tiene que elegir el usuario.
- Averiguar que jugador tiene una determinada ficha




La clase serpiente:
Tiene varias propiedades, las más importante son "cola" y "cabeza" que tienen el valor de la ficha que se puede colocar en esos lugares. Además otras dos propiedades donde se van a almacenar las fichas que se van colocando en dos listas (cabeza y cola).
El método "Coloca" se va a encargar de añadir a la lista correspondiente la ficha colocada por el jugador. Y con el método "Ver" se nos muestra la serpiente, en forma de dos dos listas (cola y cabeza)




La clase Ficha:







martes, 11 de junio de 2013

Juego De Dominó hecho con Python (II): Esquema General

Juego De Dominó hecho con Python (II)
 Esquema General

A continuación os comento el esquema de como podía  funcionar el programa a vista del usuario:

1) Solicitar al usuario que tipo de torneo quiere jugar, dando 3 opciones: 2 partidas, 4 partidas o llegar a 100 puntos.

2) Elegir tipo de los dos  jugadores: Humano o CPU (máquina)
2.1) Si es CPU, pide que tipo de inteligencia tiene.

3) Dependiendo del tipo de torneo, jugar las partidas.
3.1) Si el jugador es Humano, mostraría las jugadas disponibles, el estado del tablero, y pediría al usuario que eligiese la ficha a colocar.

4) Cada resultado de la partida, la va almacenando en el marcador general de cada jugador.

5) Cuando termina el torneo, muestra el resultado del torneo, indicando quién ha ganado.


Identificando las clases:
Después de leer el problema, podemos identificar las siguiente clases:
Ficha: tenemos 28 fichas con dos valores cada una de ella, esos valores van desde el 0 al 6. Estos valores son propiedades de esta clase. Además como mínimo tendremos dos métodos: 
  •    ver: para mostrar la ficha y su valor 
  • contar: suma los valores de la ficha. Por ejemplo la ficha 6:6, vale 12 puntos. La 3:2, será de 5 puntos.

Jugador: es el "ente" que juega, habiendo en cada partida dos. Al principio de la partida tienen el mismo número de fichas, que van colocando según el turno del juego. Si alguno se queda sin poder poner la ficha, "pasa", y corre el turno. Si los dos "pasan", hay que contar el valor de la fichas que tienen, para ver el ganador. Si uno coloca su ultima la pieza hace "dominó" y gana.


Serpiente (tablero): En el tablero se van colocando las fichas de los jugadores, formando una "serpiente", que solo permite colocar las fichas al principio (cabeza) o final (cola) de ella, según los valores que tenga.
En el siguiente turno podemos poner fichas que contengan 0 o 1

Partida: Enfrentamiento entre los dos jugadores. En el torneo se juegan varias partidas (2,4, o el número necesarias para llegar a la puntuación de 100). Al inicio de la partida se reparten las 28 fichas, el jugador con el 6:6, empieza el turno.
Van colocando la fichas, hasta que:

  •  los dos pasen (no puedan colocar ninguna ficha, gana quien tenga menos puntos en sus fichas) 
  • o haga alguno "domino" (coloque la última pieza que tenga, conviertiéndose en ganador), 
Entonces se da por terminada la partida y se contabilizan los puntos que ha obtenido el jugador ganador.


La función Main la podemos asimilar a lo que es el Torneo: elegir el tipo nº de partidas , tipos de jugadores y proceder a realizar las partidas, obteniendo un resultado final con la suma de todos los puntos obtenidos en las anteriores partidas.

Os dejo aquí dos "esquemas" que me he hecho ver que se hace en la "partida" y para analizar la colocación de fichas.
Esquema de como se juega una partida


Esquema del método colocar Ficha de la clase jugador


En la próxima entrada veremos y comentaremos el código completo.

Nota:
Aprovechando que Python es un lenguaje de programación multiparadigma, ya que soporta orientación a objetosprogramación imperativa y, en menor medida,programación funcional, el análisis de clases no es exhaustivo, y se puede añadir más clases para orientar el programa más a objetos, pero esto lo "mínimo" y "suficiente" para ver claro y entender como se puede hacer el programa.


Entradas relacionadas:
http://jsbsan.blogspot.com.es/2013/06/juego-de-domino-hecho-con-python-i.html
http://jsbsan.blogspot.com.es/2013/06/juego-de-domino-hecho-con-python-iii-el.html