Proy1Sec30+Grupo+No.+3

=**Juego para Python: Adivina al estilo 7 UP **=

 Universidad del Valle de Guatemala
**i) Manual de Usuario**


 * a) Como instalar el programa**: Primero, debes descargar el documento Proyecto1.py a tu computadora, haciendo click derecho en el link, y presionando **Guardar como** o **Guardar enlace como**. Elige la ubicación donde quieras guardarlo, y presiona **Guardar**.[[file:Proyecto1.py]] Asegurate de no cambiarle el .**py** al final del nombre, aunque si puedes cambiarle el resto del nombre.

- Debes pensar en un número - Debes revolver los dígitos, para obtener un número nuevo - Debes restarle el número más grande al más pequeño, de los dos números que tienes - Debes circular uno de los dígitos del número, sin que sea cero (porque ese número ya es un círculo) - Debes revolver el número nuevamente - Finalmente, debes ingresar el número que te quedó, sin el número circulado El programa debería devolverte el valor del número que circulaste. Mágico, ¿o no?
 * b) ¿Qué hace el programa?** El programa consiste en un juego, **Adivina al estilo 7 UP**. El programa te pedirá que realices una serie de pasos que debes seguir:

Si has terminado de jugar, basta con hacer click en la **X** en el extremo superior derecho. Si te presenta un mensaje en el cual te dice que el programa todavía está corriendo, y si está seguro de que quiere terminarlo, haz click en **sí** si deseas terminarlo, o en **no** si quieres seguir jugando. Dentro del juego, asegúrate que apaches **Enter** cuando te lo solicita. Al momento de ingresar el número, asegúrate que solamente ingreses números, y no dejes espacio entre los números. Si detecta algún error, te pedirá nuevamente el número. Al finalizar el programa, te preguntará si deseas jugar nuevamente. Si lo deseas, haz click en **y** en tu teclado. Asegúrate que sea minúscula, y de no dejar espacios ni agregar letras extra. Luego haz click en Enter. Si no deseas seguir jugando, haz click en cualquier otra tecla, y luego presiona Enter.
 * c) Instrucciones de Uso**: El programa es muy simple. Para poder utilizar este programa, basta con tener el interprete de **Python**. Si quieres descargarlo, lo puedes obtener en [] .También puedes utilizar el ejecutor de Windows, pero algunos caracteres no se mirarán muy bien, por lo que lo más aconsejable es utilizar Python. Simplemente haz **doble click** en el icono del archivo que descargaste para utilizarlo en el ejecutor, o haz click derecho sobre el ícono, y presiona **Edit with Idle**. En la página del código, haz click en **Run** en la parte superior izquierda del documento, y haz click en **Run Module**. También puedes hacer click en **F5** para correrlo. El programa debería correr en el intérprete.


 * d) Mensajes de Error:** Al momento del ingreso del número, pueden haber errores en la identificación del número para hallar el número tachado. En el caso que el intérprete no pueda leer el número, desplegará un mensaje: **"Ingrese el número nuevamente (asegúrate que no tenga espacios, y que no sean letras)"**. Si sale este mensaje, deberás ingresar el número nuevamente, asegurándote que no hayan espacios, no sean letras, ni caracteres extraños. Solamente ingresa números enteros.


 * e) Reportar Errores:** Si te surge alguna duda o sugerencia acerca del funcionamiento del programa, no dudes en comunicarte con los creadores. Si el programa tiene algún error que provoque su mal funcionamiento, también nos puedes contactar. Nuestros correos son danideb90@gmail.com y chipilin_7@hotmail.com.


 * ii) Video del Funcionamiento del programa**

Haz click en este link para ver el video: [|Video de funcionamiento]


 * iii) Investigación Corta**


 * //1) Análisis de Requerimientos//**


 * a) Preguntas insustituibles**

//¿Cuál es la Meta?// Hallar un número “adivinado” basado en una cifra proporcionada por el usuario.

//¿Cuáles son los datos?// Números.

//¿Cuáles son las entradas?// Un número.

//¿Cuáles son las condiciones?// El número hallado debe ser entre 1 y 9. El usuario debe ingresar un número con uno o más dígitos, y uno o más que no sea cero. El número ingresado es entero, sin espacios.

//¿Cuáles son los procesos?// 1. Pedir que la persona piense en un número, con dígitos variados, con la una cantidad de tres o más cifras. 2. Pedirle que mezcle los dígitos para formar un nuevo número. 3. Pedirle que reste el número pequeño al más grande. 4. Pedirle que tache un dígito, que no sea cero, en la cifra resultante. 5. Pedir al usuario que ingrese el número obtenido (sin el dígito tachado). 6. Ahora, la computadora debe sumar los dígitos de la cifra proporcionada, mientras la longitud de este número sea mayor a 1 (lo que se intenta obtener es un número que pueda ser restado a 9, y que se obtenga un número entre 1 y 9). Para ello, se hará lo siguiente: - Si el número ingresado es 9, el programa deberá desplegar un 9. - Si el número ingresado solamente tiene un dígito, basta con restarle ese dígito a 9. - Si el número tiene más de una cifra, mientras que tenga más que una cifra, se utilizará una asignación a una variable x para cada uno de los dígitos de la cifra. Luego, se sumarán estas diferentes variables x con diferentes valores, y se pondrá el valor en una variable “sumatoria”. El proceso se repetirá mientras que la longitud sea mayor a 1. Cuando ya se obtenga un número, se hará una de dos cosas: · Si la sumatoria de las x es 9, se desplegará 9 · Si la sumatoria es diferente a nueve, se restará a 9 el número obtenido, y se desplegará. 7. Finalmente, preguntará si quiere jugar nuevamente.

//¿Cuál será la salida?// El número que tachó el usuario.


 * b) Fórmulas utilizadas**

Utilizamos fórmulas matemáticas, específicamente suma, y también utilizamos la asignación (=) y el igual a (==) para poder utilizar variables y compararlas en casos de condiciones. El único valor constante que se utilizó fue el 9, el cual es utilizado para hallar el número tachado, restándole la sumatoria de los dígitos a 9.


 * //2) Diseño//**

Las principales variables utilizadas son: - **xenerror**: Esta variable es muy importante, ya que impide que hayan errores al momento del cálculo del número. Como el ingreso de números separados por espacios, o caracteres diferentes a números, hacían que el programa fallara, fue necesario establecer una prueba de funcionalidad **(try, except)**. Esta variable es utilizada en un mientras, así que se le asigno un valor cualquiera al principio, para que suponga que siempre puede haber un error. Mientras que esta variable tenga ese valor, se repetirá el cálculo y supondrá que hay error. Sin embargo, si no hay error, la variable cambia de valor, y no se repite el cálculo. Si se reinicia el programa, el valor inicial regresará, siempre suponiendo que puede haber un error. - **numero_ingresado:** Esta variable es a la cual se le asigna el número que ingresa el usuario. Esta variable es muy importante, ya que el programa la utiliza para hacer los cálculos, y la utiliza como string al principio para determinar su longitud, y luego la utiliza como entero para poder realizar los cálculos. - **x**: Esta es la variable más importante del juego, ya que determina los valores para cada uno de los caracteres en un número que tenga longitud mayor a uno. Cuando esto ocurre, se crean varias x, cada una con el valor de cada uno de los caracteres de la cifra ingresada, para luego sumar todas las x. Se determina con **in range** y es utilizada para determinar la variable **sumatoria**. Utilizada únicamente cuando la cifra ingresada es de longitud mayor a uno.
 * a) Variables a utilizar**
 * - repetición:** Esta variable fue utilizada para determinar si la persona desea seguir jugando. Se colocó al principio como preestablecido que sí desea jugar. Luego, fue utilizado en un mientras, para que mientras repetición sea “y”, el programa seguirá corriendo. Al final, se asigna un nuevo valor a la variable, dependiendo de lo que desea hacer el usuario. Si el usuario desea seguir jugando, debe ingresar y, y si no, puede ingresar cualquier otra letra o apachar Enter. Esto hará que la variable ya no sea “y”, por lo que el programa no se repetirá.
 * - largo:** Esta variable cambia según la longitud de la cifra ingresada, y se determina con la función len, aplicada a la cifra ingresada. Es utilizada para determinar la variable **x** luego. Utilizada únicamente cuando la cifra ingresada es de longitud mayor a uno.
 * - sumatoria:** Esta variable es utilizada para obtener la suma de todas las x ingresadas. Luego, es utilizada para restarle ese valor a 9, y así obtener el número tachado. Utilizada únicamente cuando la cifra ingresada es de longitud mayor a uno.


 * b) Narrativa del Proceso (curso lógico de solución)**

Pedir que el usuario piense en un número, con dígitos variados, con la una cantidad de tres o más cifras. Pedir que el usuario mezcle los dígitos para formar un nuevo número. Pedir al usuario que reste el número más grande menos el más pequeño. Pedir al usuario que tache un dígito, que no sea cero, en la cifra resultante. Pedir al usuario que ingrese el número obtenido (sin el dígito tachado). Solicitar nuevamente el número Determinar que el número tachado es nueve Restarle a 9 el número ingresado Determinar que el número tachado es el resultado de la resta Asignar a x cada uno de los números en la cadena Sumar todos los x obtenidos Armar una nueva cifra con el número obtenido Restarle a 9 la sumatoria de los x Determinar que el número tachado es 9 Restarle a 9 el número obtenido Determinar que el número tachado es el resultado de la resta Mostrarle al usuario el número que se determinó como tachado Preguntar si desea jugar nuevamente
 * Mientras** el usuario quiera jugar
 * Si** la cifra ingresada no es correcta (no es un número válido)
 * Fin si**
 * Si** la cifra ingresada solamente tiene un dígito
 * Si** la cifra es nueve
 * Si no**
 * Fin si**
 * Fin si**
 * Si** la cifra tiene más de un dígito
 * Mientras** la cifra tenga más de un dígito
 * Fin mientras**
 * Si** la resta devuelve el valor cero
 * Si no**
 * Fin si**
 * Fin si**
 * Fin mientras**


 * c) Módulos de Python utilizados. Cómo se utilizarán en su programa.**

Los módulos son elementos que de Python que con sus funciones incorporadas y predeterminadas evitan que nosotros debamos tratar directamente con el hardware de la computadora para realizar diversas tareas típicas como leer un archivo, comprobar que una tecla se ha presionado, etc. (Gauld, 2003) El único modulo utilizado en el script del programa de nuestro proyecto fue el modulo de “time” este es un modulo que cumple con las siguientes f unciones de hora y fecha:  time - hora actual (expresada en segundos)  gmtime - convertir hora en segundos a UTC (GMT)  localtime - convertir a hora local  mktime - inverso de localtime  sleep - detener el programa por //n// segundos

En nuestro programa utilizamos el modulo “time”, en específico la función sleep, para que cuando se corriera el programa, hiciera una breve pausa cada vez que el programa se comunicaba con el usuario o cada vez que el usuario ingresaba un numero o presionaba Enter. Esto sirvió para darle un efecto al programa de que estaba “pensando” su próxima respuesta, aunque todos sabemos que no es asi. (Gauld, 2003)


 * d) Funciones desarrolladas por el programador. Para que se usan, parámetros esperados.**

def imprimirnumero: print "\n El número que circulaste es:" time.sleep(2)
 * Función 1: Imprimir número**

Esta función es utilizada en todas las otras funciones. Simplemente despliega el mensaje “El número que circulaste es: “ y espera dos segundos. No recibe ningún parámetro.

def Imprimir9: imprimirnumero print "9 !"
 * Función 2: Imprimir 9**

Esta función invoca primero a la función imprimirnumero y luego muestra el número nueve. Esta función se utiliza únicamente si el numero que nos queda como resultado de la sumatoria de dígitos es igual a 9. Esto se debe realizar porque, si se resta nueve a nueve, se obtendría un número cero, y como teóricamente el usuario no puede eliminar un cero, la única opción restante es la obtención de un nueve. No recibe ningún parámetro.

def numerocirculado1(numero): imprimirnumero print 9 - numero, "!"
 * Función 3: Numero circulado 1**

Esta función realiza dos cosas, la primera es que invoca a la función imprimirnumero y luego le resta el numero de caracteres a nueve y el resultado lo muestra seguido de un signo de exclamación. Esta función recibe como parámetro un número o variable de un número, que debe ser un entero.

def numerocirculado2(numero): imprimirnumero print 9 – int(numero), "!"
 * Función 4: Numero circulado 2**

Esta función invoca primero a la función de imprimirnumero y luego a nueve le resta el numero y el resultado lo muestra en pantalla seguido de un signo de exclamación. Esta es diferente a numerocirculado1 en el sentido que convierte a un entero el número obtenido en el proceso dentro de la función. Esta función recibe un número entero, pero en string, por lo que debe convertirlo.


 * //3) Conclusiones//**

- Para poder realizar un proyecto, con un programa exitoso, es necesario primero establecer las entradas, salidas, procesos y condiciones, para así poder considerar todo lo que necesita el programa para poder ejecutarse correctamente. - Para que un programa sea exitoso, debe tener defensas contra entradas incorrectas. Aunque hay veces que es imposible cambiar la entrada de usuario para que se adapte al proceso, se puede enviar un mensaje de error y solicitar nuevamente el ingreso. - Un programa bien estructurado, con funciones, comentarios y variables bien definidas, es fácil de entender y permite que otras personas aprendan también acerca del proceso de programación. - El programa puede ser mejorado utilizando funciones predeterminadas por Python, como el módulo time, que le puede dar un toque especial al programa, mejorando el desarrollo de éste y su aprovechamiento por el usuario.


 * //4) Bibliografía//**

Gauld, Alan. (2003) Programación Modular. Obtenido el 27 de Agosto de 2009, de “Aprendiendo a Programar”. Website: http://www.freenetpages.co.uk/hp/alan.gauld/spanish/tutfunc.htm

González, Raul (N.D) Python para todos. Obtenido el 30 de Agosto de 2009, de Mundo Geek. Website http://mundogeek.net/tutorial-python/

Downey, Allen (2008) Think Python. Obtenido el 30 de Agosto de 2009, de "Sakai, UVG" Website: http://sakai.uvg.edu.gt/access/content/group/de904d3c-8fb2-4c4e-a93b-678bd2a31f68/Python/thinkpython.pdf

“Adivina al estilo Seven-Up”. Referencia: http://www.digicc.com/fido/


 * iv) Programa fuente**

Puedes descargar el programa fuente aquí:


 * v) Pruebas unitarias**

Puedes ver las pruebas unitarias (doctests) de nuestras funciones aquí. Estas pruebas son utilizadas para verificar el correcto funcionamiento de los procesos dentro de las funciones. Función numerocirculado1: Función numerocirculado2: Función Imprimir9: Al igual que el programa, puedes ejecutar estos doctest utilizando el intérprete de Python.