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();
}

 

miércoles, 14 de marzo de 2012

Diseñando el programa del GATO

Después de varios días intentando subir los documentos prometidos necesarios para el diseño del programa del GATO en modo TEXTO, aquí los tienen:

FormatoPantallaTexto.pdf
- Este documento deberán de imprimirlo y sobre él dibujar la ventana del GATO, considerando que en cada cuadrito solo puede haber un símbolo o letra o numero.

ASCIItable.jpg
- Esta es la tabla con los códigos ASCII soportados por la computadora, descarguenla y conservenla, estoy segurisimo de que en cualquier momento de la vida la necesitaran.

Y para que se den una idea de como se utiliza el formato de diseño, les dejo la foto de mi propuesta de diseño:


Saludos

PD.: Es probable que el día viernes o antes les publique el código C++ para mandas a imprimir en una posición especifica de la pantalla basado en columnas y renglones.

jueves, 1 de marzo de 2012

Tareas, prácticas y examén

Hola les saludo, aunque ya algo tarde les publicó a continuación la lista de tareas que he recibido por correo y que he anotado en la lista de calificaciones; en caso de las tareas firmadas en la libreta por favor mostrármelas el día sábado.

En caso de no tener alguna de las tareas, favor de enviármelas por correo o mostrármelas en la siguiente clase. 

Las T en las lista representan tarea y las P significan Practica, la lista considerada es:

    LISTADO DE TAREAS Y PRACTICAS
1    Tipos de datos
2    Pruebas
3    PRAC- Tablas de multiplicar
4    PRAC- Hoja de presentación
5    PRAC- Alineación de textos
6    Propuesta para solución de problema de áreas y/o sapo
7    PRAC Áreas

La lista queda actualmente de la siguiente forma:

No se espanten por las calificaciones que falta ajustar con lo que les falta.

lunes, 27 de febrero de 2012

Estructuras de control C++

Hola buena noche, les informo que ya tengo calificaciones de examen, pero no encuentro mi lista de asistencia; mañana publicaré resultados. A los que por algún motivo no hayan presentado examen, por favor comunicarse por el correo a la brevedad para solucionar su situación.

Mientras tanto, aprovecho para informarles de la tarea para este próximo sábado que tiene como finalidad se familiaricen con las estructuras de control y sus usos.

TAREA:
Deberán investigar y tener en libreta lo siguiente:
  1. ¿Que son las estructuras de control de los lenguajes de programación?
  2. Sintaxis, función y ejemplos de uso de la estructura IF
  3. Sintaxis, función y ejemplos de uso de la estructura WHILE
  4. Sintaxis, función y ejemplos de uso de la estructura FOR
Aquí les dejo las imagenes representativas del funcionamiento de las estructuras a utilizar en la materia


martes, 14 de febrero de 2012

Tarea sobre sapos y código fuente para el calculo de áreas

Saludos!!! Hasta hoy tuve un poco de tiempo libre para publicarles en este medio el archivo de PowerPoint con el ejercicio lógico de pasar los sapos de un lugar a otro y el código fuente para el calculo de las áreas de cuadrado, triángulo y circulo.

Para hacer la descarga del archivo (.pps) con los sapos da clic aquí: DESCARGAR

El código fuente del programa para calcular áreas utilizando funciones lo coloco a continuación, he utilizado algunos elementos de código que no hemos visto en clase, por cual les pido, que las palabras o lineas del lenguaje C++ que desconozcan del código las copien a su libreta e investiguen su funcionamiento para analizarlas la próxima clase.



#include<iostream>
#include <stdlib.h>

using namespace std;

// Declaración de constantes y variables públicas
const float pi=3.1416;

// Declaración de funciones
float AreaCuadrado(float lado);
float AreaTriangulo(float base, float altura);
float AreaCirculo(float radio);

int main() {
    int opcion=1;
    float respuesta;
    while (opcion!=0){
        system("cls");
        cout<<"SELECCIONA EL AREA CALCULAR"<<endl;
        cout<<"---------------------------"<<endl;
        cout<<endl;
        cout<<"1. Cuadrado"<<endl;
        cout<<"2. Triangulo"<<endl;
        cout<<"3. Circulo"<<endl;
        cout<<"0. Salir"<<endl;
        cout<<endl;
        cout<<"Escriba el numero de la opcion deseada";
        cin>>opcion;
        cout<<endl;

        system("cls");
        switch (opcion) {
            case 1:
                float lado;
                cout<<"Indica el valor del lado: ";
                cin>>lado;
                respuesta = AreaCuadrado(lado);
                cout<<"El area es: "<<respuesta;
                break;
            case 2:
                float b, h;
                cout<<"Indica el valor de la base: ";
                cin>>b;
                cout<<"Indica el valor de la altura: ";
                cin>>h;
                respuesta = AreaTriangulo(b,h);
                cout<<"El area es: "<<respuesta;
                break;
            case 3:
                float r;
                cout<<"Indica el valor del radio: ";
                cin>>r;
                respuesta = AreaCirculo(r);
                cout<<"El area es: "<<respuesta;
                break;
            case 0:
                cout <<"Ha salido del programa. Gracias por utilizarlo"<<endl<<endl;
                break;
            default:
                cout <<"Por favor seleccione una opcion correcta"<<endl<<endl;
                break;
        }
        cin.get();
        cin.get();
    }
}

float AreaCuadrado(float lado){
    float resultado;
    resultado = lado * lado;
    return resultado;
}

float AreaTriangulo(float base, float altura) {
    float resultado;
    resultado = (base * altura)/2;
    return resultado;
}

float AreaCirculo(float radio){
    float resultado;
    resultado = pi * (radio * radio);
    return resultado;
}



Suerte con el funcionamiento de este programita en su computadora, recuerden que todos los programas deberán de ponerlos en funcionamiento en su casa.

Cualquier cosa al correo, o utilizando el chat ubicado al lado derecho de este blog.

lunes, 6 de febrero de 2012

C++ Alineando textos en impresión modo texto

Saludos a todos los lectores de este blog, después de haberles puesto a desarrollar una hoja de presentación en modo texto con C++ y utilizando la salida básica COUT, hemos aprendido en clase como desarrollar funciones para facilitar la impresión de textos alineados en un espacio máximo de 80 caracteres.

Este tipo de funciones son muy utilizadas para la impresión en impresoras de matriz de puntos, dichas impresoras podemos verlas en muchos negocios que cuentan con impresión de ticket y empresas que utilizan hoja continua para la generación de nomina o reportes.


Sin mas, a continuación les coloco el código fuente que imprime los textos: UNO y DOS centrados, TRES y CUATRO a la derecha, y CINCO y SEIS a la izquierda




#include
#include 
using namespace std;

void CentrarTexto(string texto, int ancho);
void DerechaTexto(string texto, int ancho);
void IzquierdaTexto(string texto, int ancho);

int main() {
    // Centrar texto
    CentrarTexto("UNO",80);
    CentrarTexto("DOS",80);

    // Texto a la derecha
    DerechaTexto("TRES",80);
    DerechaTexto("CUATRO",80);

    // Texto a la izquierda
    IzquierdaTexto("CINCO",80);
    IzquierdaTexto("SEIS",80);



    cin.get();
    return 0;
}

void CentrarTexto(string texto, int ancho){
    int espacios;
    espacios = (ancho - texto.length())/2;

    for (int i=1; i<=espacios; i++){
        cout << " ";
    }
    cout << texto << endl;
}

void DerechaTexto(string texto, int ancho){
    int espacios;
    espacios = ancho - texto.length()-1;

    for (int i=1; i<=espacios; i++){
        cout << " ";
    }
    cout << texto << endl;
}

void IzquierdaTexto(string texto, int ancho){
    cout << texto << endl;
}



Es importante, seguir recordando y recalcando que las funciones tienen que estar declaradas en la parte superior antes de la función main() y después deben ser definidas como se muestra en el código anterior.


A continuación, vamos con el siguiente reto:

"Un alumno de la escuela primaria ORIZABA esta desesperado porque el profesor le ha encargado cientos de problemas para calcular áreas, por lo tanto, este niño desearía un programa de computadora que le permitiera el calculo de dichas operaciones; las áreas que tiene que calcular son:
- Cuadrados
- Triángulos
- Círculos"

TAREA: Definir cuales serían las funciones para solucionar el problema del niño.

miércoles, 1 de febrero de 2012

Hoja de presentación C++

He recibido ya algunas tareas con el código de las hojas de presentación en lenguaje C++, algo realmente sencillo pero que nos permite desarrollar la creatividad en la presentación de la información; el próximo sábado veremos algunos detalles que podríamos mejorar utilizando funciones.

La impresión de las salidas es mediante la sentencia COUT como se muestra en el siguiente código:

cout << "****************************************";
cout << "**                                    **";
cout << "**           U P A V                  **";

.... y asi línea por línea hasta completar la hoja de presentación

Yo también he desarrollado mi hoja de presentación para que los que no hayan enviado su tarea se animen a iniciarlo o terminarlo y tengan otras ideas:


Saludos y no dejen de visitar este blog, recuerden que el chat esta activo del lado derecho de esta página (Digsby), cuando yo estoy conectado deberá aparecerles "on-line"