En el diseño de la jerarquía de objetos y las relaciones entre los mismos se ha intentado conseguir un diseño extensible, utilizando para ello las características de encapsulación, herencia y polimorfismo que la programación orientada a objetos ofrece.
La jerarquía de objetos diseñada es la siguiente:
La práctica ha sido desarrollada en C++ utilizando el compilador Borland Turbo C++ 1.01 bajo sistema operativo MS DOS.
TPantalla
Este objeto encapsula el acceso al sistema gráfico contribuyendo a la portabilidad del código. La mayoría de las funciones son simples "cambios de nombre" de las funciones que incorporan las librerías gráficas del Turbo C++.
TElemVis
Define un elemento visible. Sirve como clase base para los diferentes elementos visibles del programa. Aporta los atributos de posición y color y los métodos para manejarlos.
Al ser una clase abstracta no se puede instanciar, obligando a las clases descendientes de esta a redefinir las funciones virtuales puras.
Métodos
- Paint. Visualiza el objeto (virtual puro).
- SetRect. Fija la posición y el tamaño (virtual).
- GetRect. Obtiene posición y tamaño.
- SetColor y GetColor. Fijan y obtienen el color
TMesa
Mesa controla todo el terreno de juego. Contiene todos los objetos que están en el interior de una mesa de billar, por lo que tiene instancias (o punteros a ellas) de objetos TBanda, TAgujero y TBola (ver más adelante). Se encarga de la visualización de la mesa y de controlar la partida coordinando a todos los objetos que contiene.
Métodos
- Paint(Bolas). Dibuja la mesa. Si bolas es "true" también las bolas
- Partida. Bucle principal que gestiona la marcha de la partida. Entra en un ciclo en el que va llamando al método Step de cada bola para que la bola calcule su nueva posición, compruebe colisiones y se visualice. También se llama al método TragaBolas de los agujeros para que comprueben si alguna bola esta sobre ellos.
- GetnBolas y operador []. Sirven para el acceso a las bolas de la mesa. GetnBolas devuelve el número de bolas en la mesa y a través del operador [] obtenemos la i-esima bola de la mesa.
- GetBandaSup, GetBandaInf, GetBandaIzq, GetBandaDer.Devuelven una referencia a una banda de la mesa.
- QuitaBola. Quita una bola de la mesa. Este método lo usan los agujeros cuando detectan que hay una bola sobre ellos para decirle a la mesa que la quite.
- Movida. Lo usan las bolas para indicar que se han movido. Si en un paso no se ha movido ninguna bola se vuelve a lanzar la blanca.
TElemMesa
Un elemento que es susceptible de estar en una mesa. Dota a sus descendientes de una forma de acceder a la mesa que los contiene a través del puntero pMesa.
Métodos:
TBanda
Representa una de las bandas que forman parte de la mesa.
Métodos:
- Redefine el método Paint.
TAgujero
Representa a uno de los agujeros que están sobre la mesa de billar. Además de dibujarse a si mismo es capaz de detectar si hay una bola sobre él (en cuyo caso tendrá que "tragársela") y decirle a la mesa que la quite.
Métodos:
- Redefine el método Paint
- Redefine los métodos Set/Get para posición.
- TragaBolas. Comprueba si alguna bola está sobre él y en caso afirmativo invoca el método QuitaBola de TMesa.
TElemAnim
Es una elemento que puede estar sobre la mesa y que tiene la particularidad de que se debe mover al ritmo marcado por la mesa. Para esto dispone de un método Step que la mesa llamará para solicitar al elemento que avance. La mesa llamará al metodo Step de cada uno de sus elementos animados y cuando llegue al último volverá a empezar.
Métodos:
TBola
Una de las bolas que se deben mover por la mesa. Incorpora toda la funcionalidad de movimiento y visualización. Una bola "sabe" calcular su nueva posición, comprobar si ha chocado con una banda o con una bola y calcular la dirección que debe tomar después del choque. En este sentido un objeto del tipo TBola es casi autónomo ya que controla prácticamente todos sus movimientos.
Métodos:
- Redefine Step. En este método se calcula la nueva posición de la bola, se detectan colisiones y se ajustan de nuevo las componentes de velocidad y dirección de la bola.
- Redefine Paint
- Redefine SetRect, GetRect.
- Proporciona Setxy y Getxy para posicionamiento.
TBolaBlanca
Es un tipo de bola que tiene la capacidad para preguntar al usuario la velocidad y dirección para empezar su próximo movimiento.
Métodos:
- Añade el método AskMove para solicitar un moviento del usuario.