lunes, 19 de marzo de 2012

Código fuente "EL GATO"

Después de pelear, pelear y pelear con los símbolos ASCII extendidos y con el gotoXY me he decidido finalmente en el código para el GATO (triste y azul que no se olvida....).

Antes de publicar el código quiero comentarles algunas cuestiones:

- ASCII Extendido: Así se le denomina a los símbolos del código ASCII que van del 127 a 255 que no son soportados por el tipo de dato "char" de C++; pero si por el "unsigned char"; para no entrar en aspectos de código que no utilizamos en las sesiones preferí no utilizar dichos símbolos y reemplazarlos por los símbolos ASCII del 1 al 126. Revisen la imagen del código ASCII que publique en un blog anterior para observar los símbolos.

- gotoxy (conio.h): Gotoxy significa go to (x, y), es decir ir a (x, y), donde (x, y) es una coordenada de nuestra pantalla. Dicha función no viene incluida con la librería "conio.h" que provee el code:blocks y para agregarla había que realizar ciertas acciones, para ejemplo práctico de nuestro proyecto fue mejor no realizar ninguna acción extraña o fuera de contexto.
Finalmente tome la decisión de hacer una CLASE (Programación Orientada a Objetos) llamada "conio" que incluye dos funciones principales: mensajeXY() e Imprimir(); donde:
  • mensajeXY: Permite la impresión de un texto en una posición especifica de la pantalla basado en las coordenadas X (Columna) y Y (Renglón). Un ejemplo de su eso es:  mensajeXY("Hola mundo", 10, 3) dicha linea imprimirá el texto "Hola mundo" a partir de la columna 10 y renglón 3.
  • Imprimir(): Se debe colocar solamente una vez al final de todas las instrucciones "mensajeXY()" con el fin de mostrar en pantalla impreso todo el texto.
- conio.cpp: Este es el nombre del archivo que contiene las funciones de impresión en una posición especifica de la pantalla MS-DOS de 80 x 24 simulando el tan añorado gotoxy. Por favor pon atención en tener este archivo siempre junto al programa principal "Gato.cpp", en el código la referencia esta indicada como #include "conio.cpp"

Olvidando un poco la teoría les dejo unas imagenes del funcionamiento del programita:


 

 Y ahora sí el tan esperado código fuente del programa:

Gato.cpp

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include "conio.cpp"
using namespace std;

// Variables globales
string jugador1, jugador2;
int jugador;
string aGato[10]={"",};
string mensaje;

// Declaración de funciones
void ImprimirGato();
bool Tirar(int posic);
int buscarGanador();
bool buscarEmpate();

int main() {
    bool salir = false;
    int tiro=0;
    int resultado;

    system("cls");
    cout << "REGISTRO DE COMPETIDORES.  --El Gato--" << endl;
    cout << "--------------------------------------" << endl << endl;
    cout << "Escribe el nombre del JUGADOR 1:";
    cin >> jugador1;
    cout << "Escribe el nombre del JUGADOR 2:";
    cin >> jugador2;
    mensaje = "BIENVENIDOS";

    while (!salir) {
        if (jugador ==1) {
            jugador =2;
        }
        else {
            jugador =1;
        }

        ImprimirGato();
        cin>>tiro;
        if (Tirar(tiro)) {
            // Si el tiro fue válido volver a imprimir el gato
            resultado = buscarGanador();
            switch(resultado) {
                case 0: // Todavia no hay ganador
                    if (buscarEmpate()) {
                        mensaje = "EMPATE. Lo sentimos";
                        salir = true;
                    }
                    else {
                        mensaje = "Es TURNO de: " + (jugador==1?jugador2:jugador1);
                    }
                    break;
                case 1: // Ganador jugador 1
                    mensaje = "GANASTE!!! " + jugador1;
                    salir = true;
                    break;
                case 2: // Ganador jugador 2
                    mensaje = "GANASTE!!! " + jugador2;
                    salir = true;
                    break;
            }
        }
        else
        {
            // Mostrar mensaje de error en tiro
            mensaje = "Posicion ocupada!";
            if (jugador ==1) {
                jugador =2;
            }
            else {
                jugador =1;
            }
        }

    }
    ImprimirGato();
    cin.get();
    cin.get();

    return 0;
}


void ImprimirGato() {
    system("cls");

    conio a;
    a.mensajeXY("JUEGO DEL",26,3);
    a.mensajeXY("####  ####  ####  ####",26,4);
    a.mensajeXY("#     #  #   ##   #  #",26,5);
    a.mensajeXY("# ##  ####   ##   #  #",26,6);
    a.mensajeXY("#  #  #  #   ##   #  #",26,7);
    a.mensajeXY("####  #  #   ##   ####",26,8);

    a.mensajeXY("|   |",37,10);
    a.mensajeXY("|   |",37,11);
    a.mensajeXY("----+---+----",33,12);
    a.mensajeXY("|   |",37,13);
    a.mensajeXY("|   |",37,14);
    a.mensajeXY("|   |",37,15);
    a.mensajeXY("----+---+----",33,16);
    a.mensajeXY("|   |",37,17);
    a.mensajeXY("|   |",37,18);

    a.mensajeXY((aGato[1]==""?"1":aGato[1]),35,11);
    a.mensajeXY((aGato[2]==""?"2":aGato[2]),39,11);
    a.mensajeXY((aGato[3]==""?"3":aGato[3]),43,11);
    a.mensajeXY((aGato[4]==""?"4":aGato[4]),35,14);
    a.mensajeXY((aGato[5]==""?"5":aGato[5]),39,14);
    a.mensajeXY((aGato[6]==""?"6":aGato[6]),43,14);
    a.mensajeXY((aGato[7]==""?"7":aGato[7]),35,17);
    a.mensajeXY((aGato[8]==""?"8":aGato[8]),39,17);
    a.mensajeXY((aGato[9]==""?"9":aGato[9]),43,17);

    a.mensajeXY("JUGADORES",3,19);
    a.mensajeXY("X -" + jugador1,7,20);
    a.mensajeXY("O -" + jugador2,7,21);
    if (jugador==1) {
        a.mensajeXY("==>",3,20);
    }
    else {
        a.mensajeXY("==>",3,21);
    }

    a.mensajeXY(" ------------------------  ",52,21);
    a.mensajeXY("|                        | ",52,22);
    a.mensajeXY(" ------------------------ |",52,23);
    a.mensajeXY("   -----------------------",52,24);

    a.mensajeXY(mensaje,54,22);
    a.imprimir();
}


bool Tirar(int posic) {
    bool retorno = false;
    if (aGato[posic]=="") {
        // Tirar
        if (jugador == 1) {
            aGato[posic] = "X";
        }
        else {
            aGato[posic] = "O";
        }
        retorno = true;
    }

    return retorno;
}

int buscarGanador() {
    int retorno =0;
    bool HayGanador = false;
    string cadenaGanadora;
    if (jugador == 1) {
        cadenaGanadora = "XXX";
    }
    else {
        cadenaGanadora = "OOO";
    }

    if (aGato[1] + aGato[2] + aGato[3] == cadenaGanadora) HayGanador = true;
    if (aGato[4] + aGato[5] + aGato[6] == cadenaGanadora) HayGanador = true;
    if (aGato[7] + aGato[8] + aGato[9] == cadenaGanadora) HayGanador = true;
    if (aGato[1] + aGato[4] + aGato[7] == cadenaGanadora) HayGanador = true;
    if (aGato[2] + aGato[5] + aGato[8] == cadenaGanadora) HayGanador = true;
    if (aGato[3] + aGato[6] + aGato[9] == cadenaGanadora) HayGanador = true;
    if (aGato[1] + aGato[5] + aGato[9] == cadenaGanadora) HayGanador = true;
    if (aGato[3] + aGato[5] + aGato[7] == cadenaGanadora) HayGanador = true;

    if (HayGanador) {
        retorno = jugador;
    }

    return retorno;
}

bool buscarEmpate () {
    bool retorno = false;
    string cadena ="";
    for (int i=1; i<=9; i++) {
        cadena = cadena + aGato[i];
    }
    if (cadena.length()==9){
        retorno = true;
    }

    return retorno;
}

 conio.cpp

#include <iostream>
#include <sstream>
using namespace std;

class conio {
    unsigned char tablero[80][24];
    void InicializarTablero();

    public:
        conio();
        void mensajeXY(string cadena, int x, int y);
        void mensajeXY(unsigned char simbolo, int x, int y);
        void imprimir();
};

void conio::mensajeXY(string cadena, int x, int y){
    for (int i=0; i<cadena.length(); i++){
        tablero[x+i-1][y-1] = cadena[i];
    }
}

void conio::mensajeXY(unsigned char simbolo, int x, int y){
    tablero[x-1][y-1] = (unsigned char)simbolo;
}

void conio::imprimir() {
    int x, y;
    for (y=0; y <24; y++){
        for (x=0; x <80; x++){
            cout << (unsigned char)tablero[x][y];
        }
        cout << endl;
    }
}

void conio::InicializarTablero(){
    int x, y;
    for (x=0; x <80; x++){
        for (y=0; y <24; y++){
            tablero[x][y]=' ';
        }
    }
}

conio::conio() {
    // Inicializar tablero
    InicializarTablero();
}

 

4 comentarios:

  1. Me sirvió de.mucho solo una.pequeña asesoría se podría meter try y catch con manejo de excepciones si ingreso string en vez de números que pasaria

    ResponderEliminar
    Respuestas
    1. Claro que se puede complementar la operatividad con validación de ingreso de datos mediante "if" o esperar el error mediante try -catch.

      Eliminar