• Miércoles 15 de Mayo de 2024, 18:15

Autor Tema:  s.o.s juego domino...  (Leído 1562 veces)

jotacorredo

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
s.o.s juego domino...
« en: Miércoles 4 de Mayo de 2011, 17:25 »
0
estoy tratando de realizar un domino en c, pero necesito la ayuda de ustedes, el programa debe jugar domino contra la maquina, normal no necesita ser inteligente, solo que juegue, mi pregunta es la siguiente: ¿hay forma de eliminar las librerias windows.h y #define max fichas??? solo q utilic stdio.h,stdlib.h y time.h???... Gracias.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define MAXFICHASXJUGADOR 21
 
struct ficha {
  int numder;
  struct ficha *der;
  int numizq;
  struct ficha *izq;
};
typedef struct ficha FICHA;
typedef struct ficha *PTRFICHA;
 
FICHA Ficha[28];
PTRFICHA Jugador[4][MAXFICHASXJUGADOR], Monton[28], cabeza, cola;
HANDLE hConsoleOut, hConsoleIn;
 
void randomize ()
{
  srand (time (NULL));
}
 
int random (int num)
{
  return rand () % num;
}
 
void clrscr ()
{
  AllocConsole();
  hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
  hConsoleIn = GetStdHandle(STD_INPUT_HANDLE);
}
 
void gotoxy (int x, int y)
{
  COORD coordScreen;
  coordScreen.X = x - 1;
  coordScreen.Y = y - 1;
  SetConsoleCursorPosition (hConsoleOut, coordScreen);
}
void InicializaFichas ()
{
  int i, j;
 
  for (i = 0; i < 7; i++)
     for (j = i; j < 7; j++) {
        int k, m;
        for (k = m = 0; m < i; m++)
           k += 7 - m;
        Ficha[k + j - i].numder = i;
        Ficha[k + j - i].numizq = j;
        Ficha[k + j - i].der = Ficha[k + j - i].izq = NULL;
     }
  randomize ();
}
 
void NuevoJuego ()
{
  int i, j;
 
  for (i = 0; i < 28; i++) {
      Ficha.der = Ficha.izq = NULL;
     Monton = Ficha + i;
  }
  for (i = 0; i < 4; i++)
     for (j = 0; j < 7; j++)
        Jugador[j] = NULL;
  cabeza = cola = NULL;
}
 
PTRFICHA EscogeFicha ()
{
  int i, bandera;
  PTRFICHA p;
 
  for (bandera = i = 0; i < 28; i++)
     if (Monton != NULL) {
        bandera = 1;
        break;
     }
  if (!bandera)   /* no hay fichas en el monton */
     return NULL;
 
  while (1) {
     i = random (28);
     if (Monton != NULL) {
        p = Monton;
        Monton = NULL;
        return p;
     }
  }
}
 
void ReparteFichas (int numjugador)
{
  int i;
  for (i = 0; i < 7; i++)
     Jugador[numjugador] = EscogeFicha ();
}
 
void ImprimeFichasJugador (int numjugador, int pantalla)
{
  int i, startcol;
 
  startcol = !pantalla ? 1 : 41;
  gotoxy (startcol + 11, 5 + numjugador*4);
  for (i = 0; i < MAXFICHASXJUGADOR; i++)
     if (Jugador[numjugador] != NULL)
        printf ("%d ", Jugador[numjugador]->numizq);
  gotoxy (startcol, 5 + numjugador*4 + 1);
  printf ("Jugador #%d ", numjugador + 1);
  for (i = 0; i < MAXFICHASXJUGADOR; i++)
     if (Jugador[numjugador] != NULL)
        printf ("- ");
  gotoxy (startcol + 11, 5 + numjugador*4 + 2);
  for (i = 0; i < MAXFICHASXJUGADOR; i++)
     if (Jugador[numjugador] != NULL)
        printf ("%d ", Jugador[numjugador]->numder);
}
 
void ImprimeMonton (int pantalla)
{
  int i, startcol;
 
  startcol = !pantalla ? 1 : 41;
  gotoxy (startcol + 11, 21);
  for (i = 0; i < 28; i++)
     if (Monton != NULL)
        printf ("%d ", Monton->numizq);
  gotoxy (startcol, 22);
  printf ("Mont¢n     ");
  for (i = 0; i < 28; i++)
     if (Monton != NULL)
        printf ("- ");
  gotoxy (startcol + 11, 23);
  for (i = 0; i < 28; i++)
     if (Monton != NULL)
        printf ("%d ", Monton->numder);
}
 
void ImprimeJuego ()
{
  int i;
  PTRFICHA ptr;
 
  gotoxy (12, 1);
  for (ptr = cabeza; ptr != NULL; ptr = ptr->der)
     printf ("%d ", ptr->numizq);
  gotoxy (1, 2);
  printf ("Juego      ");
  for (ptr = cabeza; ptr != NULL; ptr = ptr->der)
     printf ("- ");
  gotoxy (12, 3);
  for (ptr = cabeza; ptr != NULL; ptr = ptr->der)
     printf ("%d ", ptr->numder);
}
 
void ImprimeEstadoDelJuego (int numjugadores, int paso)
{
  int i, j, startcol;
  static int mitad_pantalla = 0;
 
  for (i = 3; i < 24; i++) {
     gotoxy (40, i + 1);
     printf ("³");
  }
  startcol = !mitad_pantalla ? 1 : 41;
  for (i = 3; i < 24; i++) {
     gotoxy (startcol, i + 1);
     for (j = 0; j < 39; j++) printf (" ");
  }
  gotoxy (startcol, 4);
  for (i = 0; i < 14; i++) printf ("#");
  printf (" Paso: %3d ", paso);
  for (i = 0; i < 14; i++) printf ("#");
  if (numjugadores < 4)
     ImprimeMonton (mitad_pantalla);
  for (i = 0; i < numjugadores; i++)
     ImprimeFichasJugador (i, mitad_pantalla);
  ImprimeJuego ();
  mitad_pantalla = !mitad_pantalla;
  gotoxy (1, 25);
  printf ("tpresiones una tecla para continuar...");
  getchar ();
}
 
int Ganador (int numjugadores)
{
  int i, j, bandera;
 
  for (i = 0; i < numjugadores; i++) {
     for (bandera = j = 0; j < MAXFICHASXJUGADOR; j++)
        if (Jugador[j] != NULL) {
           bandera = 1;
           break;
        }
     if (!bandera)
        return i + 1;
  }
  return 0;
}
 
int JuegoCerrado ()
{
  int contador;
  PTRFICHA ptr;
 
  if (cabeza == NULL || cabeza->numizq != cola->numder)
     return 0;
  contador = 0;
  for (ptr = cabeza; ptr != NULL; ptr = ptr->der) {
     if (ptr->numizq == cabeza->numizq)
        contador++;
     if (ptr->numder == cabeza->numizq)
        contador++;
  }
  return contador == 8;
}
 
void Juega (int jugadoractual)
{
  int i;
  PTRFICHA ptr;
  if (cabeza == NULL) {
     cola = cabeza = Jugador[jugadoractual][6];
     Jugador[jugadoractual][6] = NULL;
     return;
  }
  for (i = 0; i < MAXFICHASXJUGADOR; i++)
     if (Jugador[jugadoractual] == NULL)
        continue;
     else if (Jugador[jugadoractual]->numder == cabeza->numizq ||
         Jugador[jugadoractual]->numizq == cabeza->numizq) {
        if (Jugador[jugadoractual]->numizq == cabeza->numizq) {
           int intercambio = Jugador[jugadoractual]->numizq;
           Jugador[jugadoractual]->numizq = Jugador[jugadoractual]->numder;
           Jugador[jugadoractual]->numder = intercambio;
        }
        cabeza->izq = Jugador[jugadoractual];
        Jugador[jugadoractual]->der = cabeza;
        cabeza = Jugador[jugadoractual];
        Jugador[jugadoractual] = NULL;
        return;
     } else if (Jugador[jugadoractual]->numizq == cola->numder ||
                Jugador[jugadoractual]->numder == cola->numder) {
        if (Jugador[jugadoractual]->numder == cola->numder) {
           int intercambio = Jugador[jugadoractual]->numder;
           Jugador[jugadoractual]->numder = Jugador[jugadoractual]->numizq;
           Jugador[jugadoractual]->numizq = intercambio;
        }
        cola->der = Jugador[jugadoractual];
        Jugador[jugadoractual]->izq = cola;
        cola = Jugador[jugadoractual];
        Jugador[jugadoractual] = NULL;
        return;
     }
 
  while (1) {
     if ((ptr = EscogeFicha ()) == NULL)
        return;
     if (ptr->numder == cabeza->numizq || ptr->numizq == cabeza->numizq) {
        if (ptr->numizq == cabeza->numizq) {
           int intercambio = ptr->numizq;
           ptr->numizq = ptr->numder;
           ptr->numder = intercambio;
        }
        cabeza->izq = ptr;
        ptr->der = cabeza;
        cabeza = ptr;
        return;
     } else if (ptr->numizq == cola->numder || ptr->numder == cola->numder) {
        if (ptr->numder == cola->numder) {
           int intercambio = ptr->numder;
           ptr->numder = ptr->numizq;
           ptr->numizq = intercambio;
        }
        cola->der = ptr;
        ptr->izq = cola;
        cola = ptr;
        return;
     }
     for (i = 0; i < MAXFICHASXJUGADOR; i++)
        if (Jugador[jugadoractual] == NULL) {
           Jugador[jugadoractual] = ptr;
           break;
        }
  }
}
 
int main ()
{
  int i, paso = 0, jugadoractual, numjugadores = 2;
 
  clrscr ();
  InicializaFichas ();
  NuevoJuego ();
 
  for (i = 0; i < numjugadores; i++)
     ReparteFichas (i);
  ImprimeEstadoDelJuego (numjugadores, paso);
  jugadoractual = random (numjugadores);
  while (1) {
     if (Ganador(numjugadores) || JuegoCerrado())
        break;
     Juega (jugadoractual);
     if (jugadoractual < numjugadores - 1)
        jugadoractual++;
     else
        jugadoractual = 0;
     paso++;
     ImprimeEstadoDelJuego (numjugadores, paso);
  }
  if (Ganador(numjugadores))
     printf ("nEl ganador es el jugador #%d", Ganador(numjugadores));
  else if (JuegoCerrado())
     printf ("nEl juego se cerr¢");
  getchar();
}