2
« en: Miércoles 4 de Mayo de 2011, 17:25 »
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();
}