Mostrando entradas con la etiqueta Cupi2. Mostrar todas las entradas
Mostrando entradas con la etiqueta Cupi2. Mostrar todas las entradas

lunes, 7 de diciembre de 2015

APO1 - Nivel 4 - Club Social

Índice

1. Introducción
2. Palabras Clave
3. Problema
3.1 Enunciado
3.2 Interfaz gráfica de usuario (versión Java)
4. Requerimientos
4.1 R1 - Registrar una persona autorizada por un socio
4.2 R2 - Pagar una factura
4.3 R3 - Afiliar un socio al club
4.4 R4 - Registrar un consumo en la cuenta de un socio
5. Modelo del Mundo del Problema
6. Modelo de la Interfaz Gráfica de Usuario
7. Modelo de Pruebas Unitarios
8. Repositorio: Exploración de Código Fuente C#
9. Recursos
9.1 Java
9.2 C#
9.2.1 Solución y proyectos
9.2.2 Documentación código fuente
9.2.3 Aplicación en ejecución
9.2.3.1 Capturas de pantalla
9.2.3.2 Demostración
10. Cambios
11. Conclusiones
12. Literatura & Enlaces

1. Introducción

Se inicia esta serie de aplicaciones del Nivel 4 de Algoritmia y Programación Orientada a Objetos 1 (APO1) donde principalmente se comprende los conceptos de definición de contrato de un método, uso del contrato para la invocación de un método, asignación de responsabilidades a clases, uso de la técnica de dividir y conquistar para facilitar la resolución de un problema, entre otras más.


En cuanto a la primea aplicación a desarrollar en este nivel, ésta consiste en la administración de un club social. En esta aplicación se crean socios y asignar las personas que poseen autorización para el ingreso al club y uso de sus servicios. Además, cuenta con la administración de los gastos generados por las personas autorizadas; gastos que serán cargados a la cuenta del socio.

2. Palabras Clave

  • .NET
  • Aplicación
  • Clase
  • Cupi2
  • Cupi2.NET
  • Enumeración
  • Excepción
  • Software

3. Problema

3.1 Enunciado

Descripción literal del problema original "Enunciado" (2015):

Se quiere construir una aplicación para un club, el club tiene socios afiliados y personas autorizadas por los socios. Cada socio está identificado con su nombre y su cédula, el autorizado se caracteriza por su nombre y la cédula del socio quien lo autoriza. Dentro del club se pueden realizar consumos que serán cargados al socio, esto se manejará en la contabilidad del club. Estos consumos se caracterizan por un concepto que lo identifica y el valor de los consumido.

Las cuentas pendientes de un socio es la lista de sus facturas. Cada factura contiene el concepto y el valor del consumo o servicio que el club lee prestó. Los pagos se realizarán de acuerdo con la factura que el usuario seleccione.

3.2 Interfaz gráfica de usuario (versión Java)


En la Figura 1 se presenta la interfaz gráfica de usuario de la aplicación Club construida con los elementos de programa del lenguaje de programación Java.
GUI en Java
Figura 1. GUI en Java.

4. Requerimientos

4.1 R1 - Registrar una persona autorizada por un socio

Código: R1

Nombre: Registrar una persona autorizada por un socio

Descripción: Los socios tienen un conjunto de personas autorizadas que pueden ingresar al club y hacer consumos en sus restaurantes. Este requerimiento permite a un socio registrar una de estas personas.

Entradas:
  • Nombre: Nombre de la persona autorizada por el socio.
  • Cédula: Cédula del socio al que se registrará el autorizado.
Resultados:
  • Registro de autorizado: El socio tiene una nueva persona autorizada.

4.2 R2 - Pagar una factura

Código: R2

Nombre: Pagar una factura

Descripción: La factura que quiere pagar el socio, de su lista de facturas pendientes.

Entradas:
  • Socio: Cédula del socio que pagará la factura.
  • Factura: La factura que quiere pagar el socio, de su lista de facturas pendientes.
Resultados:
  • La factura ha sido pagada: La factura cancelada ya no está pendiente para el socio.

4.3 R3 - Afiliar un socio al club

Código: R3

Nombre: Afiliar un socio al club

Descripción: Se agregar un nuevo socio al club.

Entradas:
  • Nombre: Nombre del socio.
  • Cédula: Cédula del socio.
Resultados:
  • Afiliación del socio: Se adicionó el nuevo socio al club.

4.4 R4 - Registrar un consumo en la cuenta de un socio

Código: R4

Nombre: Registrar un consumo en la cuenta de un socio

Descripción: El socio o una de sus personas autorizadas, puede agregar un consumo a la cuenta del socio.

Entradas:
  • Concepto: Concepto del consumo.
  • Valor: Valor por el cual fue el consumo.
  • Nombre: Persona que realizó el consumo.
Resultados:
  • Registro de consumo: Se crea una nueva factura por el valor del consumo y se rgistra al socio.

5. Modelo del Mundo del Problema

En la Figura 2 se describe el diagrama UML con las entidades que integran el modelo del mundo del problema (dominio). (Original en "Modelo conceptual" (2015)).
Modelo del mundo del problema
Figura 2. Modelo del mundo del problema.

6. Modelo de la Interfaz Gráfica de Usuario

En la Figura 3 se muestra el diagrama UML que describe los controles visuales que integran la interfaz gráfica de usuario. (Original en "Interfaz" (2015)).
Modelo de la interfaz gráfica de usuario
Figura 3. Modelo de la interfaz gráfica de usuario.

7. Modelo de Pruebas Unitarias

En el diagrama UML presentando en la Figura 4 se modelan las clases de pruebas del modelo del mundo del problema. (Original en "Pruebas" (2015)).
Modelo de pruebas unitarias
Figura 4. Modelo de pruebas unitarias.

8. Repositorio: Exploración de Código Fuente C#

En el siguiente enlace de repositorio en GitHub se puede explorar todo el código fuente de la aplicación; el cual comprende:
  • Modelo del mundo del problema
  • Controles de la interfaz gráfica de usuario
  • Archivos de configuración
  • Recursos (imágenes, íconos, cadenas de texto, entre otros)
  • Clases de pruebas unitarias del comportamiento y estado de las entidades del modelo del mundo del problema.

9. Recursos

9.1 Java

Recursos del proyecto en su versión original:

9.2.1 Solución y proyectos

Enlaces de descarga de archivos ZIP con la solución y los proyectos integrales de la aplicación en Visual Studio:

9.2.2 Documentación código fuente

Archivo CHM con la documentación del código fuente C#:

9.2.3 Aplicación en ejecución

9.2.3.1 Capturas de pantalla
Club Social en C#
Figura 6. Club Social en C#.
9.2.3.2 Demostración

10. Cambios

Cambios sobresalientes en la solución respecto al proyecto original:

Clase Factura:
  • El tipo de dato para el campo valor pasa de double a decimal (apto para representar valores que requieren precisión).
  • Se remueven los métodos darConcepto, darValor y darNombre y se usan propiedades para obtener el valor de los campos correspondientes.
Clase Socio:
  • En lugar de los métodos darCedula, darNombre, darFacturas y darAutorizados, se crearon propiedades de solo lectura.
  • El método AfiliarSocio recibe, ahora, un parámetro de tipo Socio.
Nuevo:
  • Agregada la clase AutoreferenciaSocioException que hereda de System.Exception. Útil para manejar la excepción cuando el autorizado es el mismo socio.
  • Agregada la clase SocioExisteException que hereda de System.Exception. Clase útil para la gestión de excepciones relacionadas con la existencia de un socio.
  • Agregada la clase AutorizadoExisteException que hereda de System.Exception. Clase útil para la gestión de excepciones relacionadas con la existe de autorizado.
  • Agregada enumeración Operaciones para determinar el tipo de operación que debe asociar en la búsqueda de socio desde un control personalizado.

11. Conclusiones

A través de esta aplicación se ha adquirido conocimiento práctico acerca de una de las estructuras de datos integrados en .NET Framework: ArrayList.Estructura útil para el almacenamiento y manipulación de objetos. Se realizaron cambios en el proyecto C# con el propósito de aprovechar sus componentes sintácticos de descripción de entidades de un modelo: propiedades, enumeraciones; en especial. En la próxima publicación se desarrollará una aplicación controlar un brazo mecánico de una bodega.

12. Literatura & Enlaces

Universidad de los Andes - Colombia (2015, diciembre 7). Recuperado desde: http://www.uniandes.edu.co/.
Cupi2 (2015, diciembre 7). Recuperado desde: http://cupi2.uniandes.edu.co/sitio/.
APO1 (2015, diciembre 7). Recuperado desde: http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1.
Enunciado (2015, diciembre 7). Recuperado desde: http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-4/club.
Modelo Conceptual (2015, diciembre 7). Recuperado desde: http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-4/club/modeloconceptual-n4club.
Interfaz (2015, diciembre 7). Recuperado desde: http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-4/club/interfaz-n4club.
Pruebas (2015, diciembre 7). Recuperado desde: http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-4/club/pruebas-n4club.


V

sábado, 25 de julio de 2015

APO1 - Nivel 3 - El Ahorcado

Índice

0. Introducción
1. Problema
1.1 Enunciado
1.2 Interfaz gráfica de usuario (Java)
2. Requerimientos
2.1 R1 - Iniciar un juego
2.2 R2 - Jugar una letra
3. Modelo del Mundo del Problema
4. Modelo de la Interfaz Gráfica de Usuario
5. Modelo de Pruebas Unitarias
6. Repositorio: Exploración de Código Fuente C#
7. Recursos
7.1 Java
7.2 C#
7.2.1 Solución y proyectos
7.2.2 Documentación código fuente
7.2.3 Aplicación en ejecución
7.2.3.1 Captura de pantalla
7.2.3.2 Demostración
8. Cambios
9. Conclusiones
10. Glosario
11. Literatura & Enlaces

0. Introducción

En esta ocasión desarrollaremos una aplicación para jugar al ahorcado. Seguiremos el enfoque de análisis, diseño, e implementación orientado objetos como parte de la metodología desarrollada en el proyecto Cupi2 del Departamento de Ingeniería de Sistemas y Computación de la Universidad de los Andes (Colombia). Presentaremos el resultado de análisis, modelaremos, y desarrollaremos la solución usando el lenguaje de programación C# de .NET. Todo esto con el propósito de ofrecer a la comunidad de programadores que desean fortalecer sus conocimientos de la programación orientada a objetos, y/o desean profundizar en C# y las tecnologías .NET.


[Nota importante: Los materiales aquí usados del proyecto Cupi2 y que constituyen la base para el proceso de traducción desde la plataforma Java a la plataforma .NET, se mantienen como son. Su propósito y uso es únicamente académico y divulgativo.]

1. Problema

1.1 Enunciado

Descripción original del problema [4]: 

El juego del Ahorcado consiste en tratar de adivinar una palabra escondida usando la menor cantidad posible de letras. Si el jugador tiene más de 6 intentos fallidos, pierde el juego. Al iniciar, el jugador solamente conoce el número de letras de la palabra. A medida que avanza el juego, las letras que escoge el jugador se van poniendo en los espacios vacíos de la palabra, de forma que el jugador pueda intentar deducir cuál es.

Durante un juego de Ahorcado, se debe validar si la letra elegida está o no en la palabra, sin distinguir si la letra es mayúscula o minúscula. Si la letra elegida está en la palabra se deben llenar los campos en los que ocurre la letra. También es necesario tener en cuenta que la letra que se esté jugando, no haya sido jugada anteriormente, de modo que si es letra repetida, no se pierda un intento para el jugador. Adicionalmente se debe validar que el jugador sólo tenga el número de oportunidades determinadas por la secuencia de ahorcar el muñeco en juego y que con cada jugada se valide si se ha ganado o no el juego. Finalmente, es importante tener en cuenta que sólo se puede jugar una letra si el juego está iniciado, de forma que una persona que haya perdido, no puede hacer más jugadas hasta que inicie un nuevo juego.

Se quiere construir una aplicación que permita jugar el juego del Ahorcado, donde las palabras por adivinar pertecen al diccionario de palabras de Cupi2 Nivel 3 y son las siguientes:
  • algoritmo, 
  • contenedora, 
  • avance, 
  • ciclo, 
  • instrucciones, 
  • arreglo, 
  • vector, 
  • inicio, 
  • cuerpo, 
  • recorrido, y 
  • patrón
No se tienen en cuenta los acentos de las palabras. El diccionario de palabras sólo maneja minúsculas y no se tienen en cuenta las tildes.

1.2 Interfaz gráfica de usuario (versión Java)

En la Figura 1 se muestra la interfaz gráfica de usuario de la aplicación Ahorcado construida en el lenguaje de programación Java.
GUI en Java
Figura 1. GUI en Java.

2. Requerimientos

2.1 R1 - Iniciar un juego

Código: R1

Nombre: Iniciar un juego

Descripción: La aplicación inicia un nuevo juego escogiendo una palabra del diccionario. El número de intentos posibles es 6.

Entradas: 
  • Ninguna
Resultados:
  • Hay una palabra escogida, se muestran los espacios vacíos, todas las letras del alfabeto están disponibles y el número de intentos para jugar.

2.2 R2 - Jugar una letra

Código: R2

Nombre: Jugar una letra

Descripción: El jugador propone una letra para ver si está en la palabra o no.

Entradas:
  • La letra escogida por el jugador
Resultados:
  • Si la letra pertenece a la palabra, entonces se le muestra al usuario las ocurrencias de esa letra en la palabra, en las posiciones correspondientes.
  • Si la letra no está en la palabra, entonces el usuario pierde el intento y se valida si ya está ahorcado o si puede seguir jugando.
  • Si la letra ya había sido jugada se informa al usuario que la letra ya se había jugado.
  • Si la palabra está completa, entonces el juego termina.

3. Modelo del Mundo del Problema

En la Figura 2 se describe el diagrama UML con las entidades que integran el modelo del mundo del problema (dominio). (Original en [6].)
Ahorcado - Modelo del mundo del problema
Figura 2. Ahorcado - Modelo del mundo del problema.

4. Modelo de la Interfaz Gráfica de Usuario

En la Figura 3 se muestra el diagrama UML que describe los controles visuales que integran la interfaz gráfica de usuario. (Original en [7].)
Ahorcado - Modelo de la interfaz gráfica de usuario
Figura 3. Ahorcado - Modelo de la interfaz gráfica de usuario.

5. Modelo de Pruebas Unitarias

En el diagrama UML presentado en la Figura 4 se modelan las clases de pruebas del modelo del mundo del problema. (Original en [8].)
Ahorcado - Modelo de pruebas unitarias
Figura 4. Ahorcado - Modelo de pruebas unitarias.

6. Repositorio: Exploración de Código Fuente C#

En el siguiente enlace de repositorio in GitHub se puede explorar todo el código; el cual comprende: 
  • Modelo del mundo del problema, 
  • Controles de la interfaz gráfica de usuario, 
  • Archivos de configuración, 
  • Recursos (imágenes, íconos, cadenas de texto, etc.), 
  • Clases de pruebas unitarias de la funcionalidad y estado de las entidades del mundo del problema.

7. Recursos

7.1 Java

Recursos del proyecto en su versión original: 

7.2.1 Solución y proyectos

Enlaces de descarga de archivos ZIP con la solución y los proyectos integrales (proyectos C# y pruebas unitarias) de la aplicación: 

7.2.2 Documentación código fuente

Archivo CHM con la documentación del código fuente C#: 
APO1 - Nivel 3 - El Ahorcado - Documentación
Figura 5. APO1 - Nivel 3 - El Ahorcado - Documentación.

7.2.3 Aplicación en ejecución

7.2.3.1 Capturas de pantalla
APO1 - Nivel 3 - El Ahorcado
Figura 6. APO1 - Nivel 3 - El Ahorcado.
7.2.3.2 Demostración

8. Cambios

Cambios sobresalientes en la solución: 
  • Adición de las enumeraciones EstadoJuego y JuegoAhorcadoConstantes para representar el estado del juego y constantes del juego.
  • Varios métodos de las clases Letra, Palabra, y JuegoAhorcado como propiedades.

9. Conclusiones

A lo largo del proceso de traducción hemos afianzado nuestro conocimiento no sólo en lenguaje de programación C#, sino además en comprender estructuras fijas para la contención de datos. La creación de controles personalizados nos ayuda a crear una interfaz gráfica modular y propensa a fáciles modificaciones.


En la próxima traducción pasaremos al nivel 4 de APO1: seguimiento de una especificación en términos de un contrato para la construcción de elementos de programa.

10. Glosario

  • Arreglo
  • Clase
  • Control
  • Estructura de dato
  • Índice
  • Método

11. Literatura & Enlaces

[1]: Universidad de los Andes - Colombia - http://www.uniandes.edu.co/
[2]: Cupi2 - http://cupi2.uniandes.edu.co/sitio/
[3]: APO1 - http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1
[4]: Enunciado - http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-3/ahorcado
[5]: Requerimientos Funcionales - http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-3/ahorcado/requerimientos-funcionales
[6]: Modelo Conceptual - http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-3/ahorcado/modelo-conceptual
[7]: Interfaz - http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-3/ahorcado/interfaz
[8]: Pruebas - http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-3/ahorcado/pruebas


V

viernes, 25 de julio de 2014

APO1 - Nivel 2 en C#: El Triqui

Tabla de Contenido

0. Introducción
1. Enunciado
1.1 Interfaz gráfica de usuario (versión previa en Java)
2. Requerimientos
2.1 R1: Recibir y marcar las jugadas del usuario
2.2 R2: Responder con las jugadas del computador
2.3 R3: Comenzar un nuevo juego
3. Modelo del Mundo del Problema
4. Modelo de la Interfaz Gráfica de Usuario (GUI)
5. Modelo de Pruebas Unitarias
6. Exploración de Código Fuente C#
6.1 Modelo
6.2 GUI
7. Recursos
7.1 Java
7.2 C#
7.2.1 Solución y proyectos
7.2.2 Documentación del código fuente de la aplicación
7.2.3 Aplicación en ejecución
7.2.3.1 Capturas de pantalla
7.2.3.2 Vídeo
8. Conclusiones
9. Glosario
10. Literatura & Enlaces

0. Introducción

En esta tercera traducción de los ejercicios del Nivel 2 de APO1, crearemos una aplicación en C# que consistirá en el juego triqui. Emularemos la misma estrategia de juego adoptada por el computador para que compita con un jugador humano. Este ejercicio nos servirá para comprender no sólo características del lenguaje C# y su plataforma subyacente, sino además el diseño de algoritmos de competencia hombre-máquina. Desde luego se trata de un problema sencillo, en futuro dedicaremos tiempo para estudiar el proceso de análisis y diseño de programas más complejos y complicados que nos sirvan de reto para la especialización y dominio de los elementos esenciales de la ciencia de la computación.

1. Enunciado

A continuación se describe el planteamiento original del juego de Triqui publicado en [3].

El Triqui se desarrolla entre dos jugadores, cada uno de los cuales elige una marca para representarse, usualmente entre los símbolos O y X. Los jugadores van colocando intercaladamente su marca en un tablero de 9 posiciones. Gana el jugador que logre formar primero una línea de tres casillas seguidas con su marca, ya sea en sentido:
  • vertical, 
  • horizontal, o 
  • diagonal
Si se acaban las casillas libres y ningún jugador hizo una línea de tres, se determina un empate.

Se quiere desarrollar un programa que permita el juego del Triqui entre un humano y el computador. Para éste último se elige una estrategia sencilla de juego que puede depender o no de las jugadas realizadas por el humano. Un ejemplo de estrategia es ir asignando la siguiente posición libre (según el orden establecido de las casillas).

Adicionalmente se desea dar al usuario la posibilidad de comenzar un juego en cualquier momento.

1.1 Interfaz gráfica de usuario (versión previa en Java)


En la Figura 1 se muestra la interfaz gráfica de usuario de la aplicación desarrollada en lenguaje de programación Java.
Juego de Triqui en Java
Figura 1. Juego de Triqui en Java.

2. Requerimientos

Conjunto de requerimientos funcionales de la aplicación El Triqui.

2.1 R1: Recibir y marcar las jugadas del usuario

Código: R1

Descripción: Rercibir y marcar las jugadas del usuario.

Resumen: Cuando se selecciona una casilla, esta debe terminar con la predeterminada para el usuario.

Entradas:
  • Posición en el tablero seleccionada por el usuario.
Resultados:
  • La casilla seleccionada con la marca del usuario. Si con esta marca se completa una hilera de 3, se informa al usuario que ganó el juego.

2.2 R2: Responder con las jugadas del computador

Código: R2

Descripción: Responder con las jugadas del computador

Resumen: Se generan marcas en el tablero automáticamente, en respuesta a las jugadas anteriores hechas por el usuario.

Entradas:
  • El juego del triqui en su estado actual.
Resultados:
  • La casilla seleccionada por el programa con la marca predeterminada para este. Si con la jugada el juego termina, se informa al usuario que perdió el juego.

2.3 R3: Comenzar un nuevo juego

Código: R3

Descripción: Comenzar un nuevo juego

Resumen: Se inicializa sin marcas el tablero del triqui para comenzar un nuevo juego en cualquier momento.

Entradas:
  • «Ninguna»
Resultados:
  • Un nuevo juego listo para comenzar.

3. Modelo del Mundo del Problema


En la Figura 2 se muestra el diagrama UML con la descripción de las entidades que componen el modelo del mundo del problema. (Original en [4].)
Modelo del mundo del problema
Figura 2. Modelo del mundo del problema.

4. Modelo de la Interfaz Gráfica de Usuario (GUI)


En la Figura 3 se presenta el diagrama UML con los componentes que integran la interfaz gráfica de usuario. (Original en [7].)
Modelo de la interfaz gráfica de usuario.
Figura 3. Modelo de la interfaz gráfica de usuario.

5. Modelo de Pruebas Unitarias


El diagrama UML en la Figura 4 presenta las clases de prueba de la clase Triqui y la enumeración PosicionCasilla. (Original en [8].)
Modelo de pruebas unitarias
Figura 4. Modelo de pruebas unitarias.

6. Exploración de Código C#

6.1 Modelo
Conjunto artefactos del modelo

6.2 GUI
Artefactos de la interfaz gráfica de usuario

7.1 Java

Conjunto de recursos del proyecto en su versión original [9]:

7.2 C#

7.2.1 Solución y proyectos

Enlace de descarga de archivo ZIP con la solución y los proyectos integrales de la aplicación:

7.2.2 Documentación de código fuente de la aplicación

Enlace de descarga de la documentación (formato CHM) del código fuente C# de la aplicación.

7.2.3 Aplicación en ejecución

7.2.3.1 Capturas de pantalla
El Triqui en C#
Figura 5. El Triqui en C#.
El Triqui en C# y Java
Figura 6. El Triqui en C# y Java.
7.2.3.2 Vídeo

8. Cambios

Lista de cambios realizados sobre el modelo del mundo del problema de la aplicación El Triqui:
  • Las nueves posiciones del tablero de trique ha sido representado por una instancia de la enumeración PosicionCasilla.
  • Las casillas del tablero en la clase Triqui quedan representadas como un arreglo de constantes de la enumeración PosicionCasilla.
  • La marca de la casilla estará representada por valores de tipo char.
  • Cambios en la clase Casilla:
    • Se removieron los siguientes métodos fueron reemplazados por la propiedad Marca:
      • AsignarMarca(string)
      • ObtenerMarca
    • El tipo de la marca, string, fue reemplazado por char.

9. Conclusiones

Durante el proceso de traducción de la aplicación Java El Triqui a lenguaje de programación C#, aprendimos a manipular controles personalizadas a partir de la clase ControlUser. Estos controles pueden ser agregados usando la caja de herramientas (toolbox) de Visual Studio o programáticamente. Usamos este último enfoque, pues exige conocer varias propiedades y métodos de la la clase ControlUser, por ejemplo, para poder posicionar cada uno de los controles en el formulario principal de la aplicación.

10. Glosario

  • Caja de herramientas
  • Control
  • Cupi2
  • Formulario
  • Triqui
  • Uniandes

11. Literatura & Enlaces

[1]: Universidad de los Andes - http://www.uniandes.edu.co
[2]: Departamento de Ingeniería de Sistemas y Computación - http://sistemas.uniandes.edu.co
[3]: Proyecto Cupi2 - http://cupi2.uniandes.edu.co/sitio
[4]: Enunciado - http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-2/triqui/enunciado-2051
[5]: Requerimientos - http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-2/triqui/requerimientos-2052
[6]: Tac, Tic, Toe icon | Icon Search Engine | Iconfinder - https://www.iconfinder.com/icons/85811/tac_tic_toe_icon#size=30
[7]: Interfaz - http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-2/triqui/interfaz-n2triqui
[8]: Pruebas - http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-2/triqui/pruebas-n2triqui
[9]: El Triqui - http://cupi2.uniandes.edu.co/sitio/index.php/cursos/apo1/nivel-2/triqui


S