Categorías > Lenguajes > C++ > Saber sobre que plataforma se está compilando (C/C++) ...
Nuevo Mensaje | Responder
TR4XER


13 envíos
Desconectado
2357 lecturas
26 respuestas
Saber sobre que plataforma se está compilando (C/C++)12-12-2009 a las 18:39:23

Hola!, tengo una pregunta.
Es que tengo casi listo un juego (por que solo me falta la inteligencia artificial para que el usuario pueda jugar contra la CPU) de "gato" como le decimos en mi país, creo que en otros países se dice "tres en raya" o "tic tac toe". Bueno la cosa es que no sé como hacer para que al compilar un programa el compilador haga algo si está en entorno windows o linux y así que el programa sea multiplataforma. Aquí esta el codigo:
Código Fuente:

//Aquí iría un #ifdef <Plataforma windows>
#define EN_WINDOWS
//Aquí iría un #elif <Plataforma linux>
//#define EN_LINUX
//Aquí iría un #endif

#include <iostream>

#ifdef EN_WINDOWS
#include <Windows.h>
#endif

#ifdef EN_WINDOWS
#define LIMPIAR_CONSOLA() limpiarConsola()
#elif EN_LINUX
#define LIMPIAR_CONSOLA() system("clear")
#endif

//El tamaño de la fila o la
//columna respectivamente
const int FILA = 3;
const int COLUMNA = 3;

using namespace std;

/////////////////////////////// Prototipos ///////////////////////////////

#ifdef EN_WINDOWS
//Limpia la consola (solo windows)
void limpiarConsola();
#endif
//Inicializa los valores del array del juego
void inicializarGato(char cCuadros[3][3]);
//Imprime el gato
void imprimirGato(const char cCuadros[3][3]);
//Espera a que el usuario pulse ENTER
void esperar();
//Realiza la jugada del jugador
//retorna true si se realizo la jugada y false en caso contrario
bool jugadaJugador(char cCuadros[3][3],
                  char cNumeroCuadro,
                  char cCharJugador);
//Comprueba si algún jugador ha ganado
//retorna el número del jugador que ha ganado
//y retorna -1 si ninguno a ganado
int comprobarVictoria(const char cCuadros[3][3],
                      const char *cCharJugadores);
//Comprueba si han empatado
bool comprobarEmpate(const char cCuadros[3][3],
                    const char *cCharJugadores);


int main()
{
    char cCuadro[FILA][COLUMNA];  //Array del juego (gato)
    char cCharJugador[2] = { 'X', 'O' }; //El char a usar por el jugador
    char cResJugarOtraVez[20];    //Respuesta si jugar otra vez
    char cResDosJugadores[20];      //Respuesta si 2 jugadores o no
    char cJugadaJugador[20];      //Es la jugada del jugador actual
    unsigned int uiTurnoJugador = 0;    //El turno del jugador
    int iJugadorGanador;          //El jugador que gano la partida
    bool bJugarOtraVez = false;  //Si resonde si a "¿Jugar otra vez?"
    bool bDosJugadores = false;      //Si se juega con dos jugadores
    bool bJuegoTerminado = false; //Si termina el juego o no

    do  //Se ejecutara mientras bJugarOtraVez sea true
    {
        LIMPIAR_CONSOLA();
        inicializarGato(cCuadro);

        cout << "¨Jugar n 2 jugadores? (S/N): ";
        cin >> cResDosJugadores;

        if (cResDosJugadores[0] == 'S' || cResDosJugadores[0] == 's')
            bDosJugadores = true;
        else
            bDosJugadores = false;

        //Loop del juego
        do
        {
            LIMPIAR_CONSOLA();
            imprimirGato(cCuadro);

            //Se ejecuta mientras se haga una jugada correcta
            do
            {
                cout << "Jugador " << uiTurnoJugador + 1 << " juega: ";
                cin >> cJugadaJugador;

                //Si no es un número
                if (cJugadaJugador[0] < '0' || cJugadaJugador[0] > '9')
                {
                    cout << endl;
                    cout << "Debe realizar una jugada correcta" << endl;
                    esperar();
                    continue;
                }

                //Si la jugada ya se realizó
                if (!jugadaJugador(
                    cCuadro,
                    cJugadaJugador[0],
                    cCharJugador[uiTurnoJugador])
                    )
                {
                    cout << endl;
                    cout << "Ese n£mero ya esta ocupado!" << endl;
                    cout << endl;
                    esperar();
                    continue;
                }

                break;
            } while (true);

            //Si hay un empate
            if (comprobarEmpate(cCuadro, cCharJugador))
            {
                cout << endl;
                cout << "Ha habido un empate!";
                cout << endl;
                esperar();
                break;
            }

            iJugadorGanador = comprobarVictoria(cCuadro, cCharJugador);
            //Si alguien a ganado
            if (iJugadorGanador != -1)
            {
                cout << endl;
                cout << "El jugador " << iJugadorGanador + 1 << " ha ganado!";
                cout << endl;
                bJuegoTerminado = true;
                esperar();
            }
            else
                bJuegoTerminado = false;
            if (uiTurnoJugador == 0)
                uiTurnoJugador = 1;
            else
                uiTurnoJugador = 0;
        } while (!bJuegoTerminado);

      cout << "¨Jugar otra vez? (S/N): ";
      cin >> cResJugarOtraVez;

        if (cResJugarOtraVez[0] == 'S' || cResJugarOtraVez[0] == 's')
            bJugarOtraVez = true;
        else
            bJugarOtraVez = false;

        //Si responde que sí
        if (cResJugarOtraVez[0] == 'S'
        || cResJugarOtraVez[0] == 's')
            bJugarOtraVez = true;
        else
            bJugarOtraVez = false;
    } while (bJugarOtraVez);

    return EXIT_SUCCESS;
}

////////////////////////////// Definiciones //////////////////////////////

#ifdef EN_WINDOWS
//Limpia la consola (solo windows)
void limpiarConsola()
{
    HANDLE hOutPut;    //Manejador de salida de la consola
    CONSOLE_SCREEN_BUFFER_INFO csbi; //Información de la consola
    COORD coord = { 0, 0 };    //Desde donde empezar a borrar

    hOutPut = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hOutPut, &csbi);

    //Limpia la consola
    FillConsoleOutputCharacter(
        hOutPut,
        '',
        csbi.dwSize.X * csbi.dwSize.Y,
        coord,
        NULL
        );
    //Situa el cursor en el inicio del lugar borrado
    SetConsoleCursorPosition(hOutPut, coord);
}
#endif

//Inicializa los valores del array del juego
void inicializarGato(char cCuadros[3][3])
{
    char cNumero = '1'; //Es el número que se escribirá en el array

    //Escribe los valores en el array
    for (int fila = FILA - 1; fila >= 0; fila--)
    {
        for (int columna = 0; columna < COLUMNA; columna++)
        {
            cCuadros[fila][columna] = cNumero;
            //Pasa al otro número
            cNumero++;
        } //for
    } //for
}

//Imprime el gato
void imprimirGato(const char cCuadros[3][3])
{
    for (int fila = 0; fila < FILA; fila++)
    {
        for (int columna = 0; columna < COLUMNA; columna++)
        {
            cout << cCuadros[fila][columna];

            //Si no es la ultima columna
            if (columna < COLUMNA - 1)
                cout << "|";
        } //for

        cout << endl;
        //Si no es la ultima fila
        if (fila < FILA - 1)
            cout << "-+-+-";
        cout << endl;
    } //for
}

//Espera a que el usuario pulse ENTER
void esperar()
{
    cin.sync();
    cin.get();
    cin.sync();
}

//Realiza la jugada del jugador
//retorna true si se realizo la jugada y false en caso contrario
bool jugadaJugador(char cCuadros[3][3],
                  char cNumeroCuadro,
                  char cCharJugador)
{
    //Recorre todo el gato y busca el caracter,
    //si lo encuentra lo reemplaza por el caracter
    //del jugador correspondiente
    for (int fila = 0; fila < FILA; fila++)
    {
        for (int columna = 0; columna < COLUMNA; columna++)
        {
            if (cCuadros[fila][columna] == cNumeroCuadro)
            {
                cCuadros[fila][columna] = cCharJugador;
                LIMPIAR_CONSOLA();
                imprimirGato(cCuadros);
                return true;
            } //if
        } //for
    } //for

    return false;
}

//Comprueba si algún jugador ha ganado
//retorna el número del jugador que ha ganado
//y retorna -1 si ninguno a ganado
int comprobarVictoria(const char cCuadros[3][3],
                      const char *cCharJugadores)
{
    enum JUGADOR
    {
        JUGADOR1,
        JUGADOR2
    };

    //Comprueba gatos horizontalmente
    for (int fila = 0; fila < FILA; fila++)
    {
        if (cCuadros[fila][0] == cCuadros[fila][1]
        && cCuadros[fila][1] == cCuadros[fila][2])
        {
            if (cCuadros[fila][0] == cCharJugadores[0])
                return JUGADOR1;
            else if (cCuadros[fila][0] == cCharJugadores[1])
                return JUGADOR2;
        }
    }

    //Comprueba gatos verticalmente
    for (int columna = 0; columna < COLUMNA; columna++)
    {
        if (cCuadros[0][columna] == cCuadros[1][columna]
        && cCuadros[1][columna] == cCuadros[2][columna])
        {
            if (cCuadros[0][columna] == cCharJugadores[0])
                return JUGADOR1;
            else if (cCuadros[0][columna] == cCharJugadores[1])
                return JUGADOR2;
        }
    }

    if (cCuadros[0][0] == cCuadros[1][1]
    && cCuadros[1][1] == cCuadros[2][2])
    {
        if (cCuadros[0][0] == cCharJugadores[0])
            return JUGADOR1;
        else if (cCuadros[0][0] == cCharJugadores[1])
            return JUGADOR2;
    }
    else if (cCuadros[0][2] == cCuadros[1][1]
    && cCuadros[1][1] == cCuadros[2][0])
    {
        if (cCuadros[0][2] == cCharJugadores[0])
            return JUGADOR1;
        else if (cCuadros[0][2] == cCharJugadores[1])
            return JUGADOR2;
    }

    return -1; //No encontrado
}

//Comprueba si han empatado
bool comprobarEmpate(const char cCuadros[3][3],
                    const char *cCharJugadores)
{
    //Si alguien ganó no hay empate
    if (comprobarVictoria(cCuadros, cCharJugadores) != -1)
        return false;

    for (int fila = 0; fila < FILA; fila++)
    {
        for (int columna = 0; columna < COLUMNA; columna++)
        {
            if (cCuadros[fila][columna] != cCharJugadores[0]
            && cCuadros[fila][columna] != cCharJugadores[1])
            {
                return false;
            }
        } //for
    } //for

    //Empate
    return true;
}


Muschas gracias!.
Espero que me puedan ayudar.


Responder | Citar | Moderar | Mensaje Privado
Training Channel
CHuLoYo


762 envíos
Desconectado

#1
RE: Saber sobre que plataforma se está compilando (C/C++)12-12-2009 a las 18:48:21

Deberás hacer un binario para windows y otro para linux, o eso es lo que tengo entendido. No es lo mismo un .exe (Que en linux se ejecutaría bajo wine, así que ya no sería multiplataforma) que un fichero binario linux con permisos de ejecución.

Saludos.

www.Esquio.net | Diseño y programación web profesional
Responder | Citar | Moderar | Mensaje Privado
TR4XER


13 envíos
Desconectado

#2
RE: Saber sobre que plataforma se está compilando (C/C++)12-12-2009 a las 19:04:37

Gracias por responder, pero...
Lo que quiero es que al compilar el compilador haga ciertas cosas cuando se trabaje en LINUX y otras en WINDOWS

asi como (EJEMPLO PARA SABER SI EL COMPILADOR ESTA EN LA CONFIGURACION DEBUG):
Código Fuente:
#include <iostream>
#ifdef _DEBUG
#include <cabecera_solo_debug.h>
#endif


Gracias.


Responder | Citar | Moderar | Mensaje Privado
wilmaforez


65 envíos
Desconectado

#3
RE: Saber sobre que plataforma se está compilando (C/C++)12-12-2009 a las 20:14:05

Buenas
Si no me equivoco:

Código Fuente:
#ifdef _WIN32
//loquesea
#else
//lootro
#endif


Saludos :D.


Responder | Citar | Moderar | Mensaje Privado
TR4XER


13 envíos
Desconectado

#4
RE: Saber sobre que plataforma se está compilando (C/C++)12-12-2009 a las 20:54:46

Muchas gracias!. Me resulto!
Pero también quisiera saber como es el comando de linux
_LINUX?

Salu2
Y de nuevo gracias


Responder | Citar | Moderar | Mensaje Privado
CHuLoYo


762 envíos
Desconectado

#5
RE: Saber sobre que plataforma se está compilando (C/C++)12-12-2009 a las 20:59:18

Según leí en este hilo: http://lists.kde.org/?l=kde-devel&m=96029457427097&w=2

Código Fuente: #ifdef _linux

si no funciona
Código Fuente: #ifdef linux

y si no
Código Fuente: #ifdef __linux__ afaik

www.Esquio.net | Diseño y programación web profesional
Responder | Citar | Moderar | Mensaje Privado
CHuLoYo


762 envíos
Desconectado

#6
RE: Saber sobre que plataforma se está compilando (C/C++)12-12-2009 a las 21:02:31

También en otra web he visto este ejemplo de código:

Código Fuente:#ifdef sparc
...
#endif
#ifdef linux
...
#endif
#ifdef __CYGWIN32
...
#endif
...
#if defined(linux) || defined(sparc)
...
#endif
...

www.Esquio.net | Diseño y programación web profesional
Responder | Citar | Moderar | Mensaje Privado
TR4XER


13 envíos
Desconectado

#7
RE: Saber sobre que plataforma se está compilando (C/C++)12-12-2009 a las 21:08:44

Gracias por las respuestas, en verdad me han ayudado.
Pero alguien que tenga linux podría probarlos y decir cuales funcionan ya que yo no tengo linux

Saludos


Responder | Citar | Moderar | Mensaje Privado
CHuLoYo


762 envíos
Desconectado

#8
RE: Saber sobre que plataforma se está compilando (C/C++)12-12-2009 a las 21:13:56

Yo tengo linux pero no sé como probarlo. En casi todas las páginas hablan del genérico ifdef linux o como mucho ifdef LINUX.

Prueba con windows en mayúsculas o minúsculas, y el que vaya lo utilizas para linux.

www.Esquio.net | Diseño y programación web profesional
Responder | Citar | Moderar | Mensaje Privado
TR4XER


13 envíos
Desconectado

#9
RE: Saber sobre que plataforma se está compilando (C/C++)12-12-2009 a las 21:20:46

Si pero si coloco _linux o otro no me funcionara ya que al trabajar en windows nunca se ejecutaran las lineas de codigo qu escriba dentro.

Un ejemplo de como los puedes probar:
Código Fuente:
#include <iostream>

using namespace std;

int main()
{
    #ifdef <_LINUX o otros>
    cout << "Estoy en LINUX!" << endl;
    #endif
   
    cin.sync();
    cin.get();
   
    return EXIT_SUCCESS;
}




Responder | Citar | Moderar | Mensaje Privado
CHuLoYo


762 envíos
Desconectado

#10
RE: Saber sobre que plataforma se está compilando (C/C++)12-12-2009 a las 21:28:54

Me funcionó con esto:

Código Fuente:#include <iostream>

using namespace std;

int main()
{
    #ifdef linux
    cout << "Estoy en LINUX!" << endl;
    #endif

    cin.sync();
    cin.get();

    return 0;
}


linux con minúsculas.
Ya lo tienes

www.Esquio.net | Diseño y programación web profesional
Responder | Citar | Moderar | Mensaje Privado
1 2 3