#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/******************************************************************************/
/******************* Se sustituyó <conio.h> por este encabezado ***************/
#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;
/******************************************************************************/
/******************* Código que se agregó *************************************/
HANDLE hConsoleOut, hConsoleIn;
void randomize ()
{
srand (time (NULL));
}
int random (int num)
{
return rand () % num;
}
void clrscr ()
{
/* Obtiene una consola para esta aplicación */
AllocConsole();
/* Obtiene manejadores para la entrada y salida de la consola */
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[i].der = Ficha[i].izq = NULL;
Monton[i] = Ficha + i;
}
for (i = 0; i < 4; i++)
for (j = 0; j < 7; j++)
Jugador[i][j] = NULL;
cabeza = cola = NULL;
}
PTRFICHA EscogeFicha ()
{
int i, bandera;
PTRFICHA p;
for (bandera = i = 0; i < 28; i++)
if (Monton[i] != NULL) {
bandera = 1;
break;
}
if (!bandera) /* no hay fichas en el monton */
return NULL;
while (1) {
i = random (28);
if (Monton[i] != NULL) {
p = Monton[i];
Monton[i] = NULL;
return p;
}
}
}
void ReparteFichas (int numjugador)
{
int i;
for (i = 0; i < 7; i++)
Jugador[numjugador][i] = 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][i] != NULL)
printf ("%d ", Jugador[numjugador][i]->numizq);
gotoxy (startcol, 5 + numjugador*4 + 1);
printf ("Jugador #%d ", numjugador + 1);
for (i = 0; i < MAXFICHASXJUGADOR; i++)
if (Jugador[numjugador][i] != NULL)
printf ("- ");
gotoxy (startcol + 11, 5 + numjugador*4 + 2);
for (i = 0; i < MAXFICHASXJUGADOR; i++)
if (Jugador[numjugador][i] != NULL)
printf ("%d ", Jugador[numjugador][i]->numder);
}
void ImprimeMonton (int pantalla)
{
int i, startcol;
startcol = !pantalla ? 1 : 41;
gotoxy (startcol + 11, 21);
for (i = 0; i < 28; i++)
if (Monton[i] != NULL)
printf ("%d ", Monton[i]->numizq);
gotoxy (startcol, 22);
printf ("Mont¢n ");
for (i = 0; i < 28; i++)
if (Monton[i] != NULL)
printf ("- ");
gotoxy (startcol + 11, 23);
for (i = 0; i < 28; i++)
if (Monton[i] != NULL)
printf ("%d ", Monton[i]->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...");
/******************************************************************************/
/******************* Código que se modificó ***********************************/
getchar ();
/******************************************************************************/
/******************************************************************************/
}
int Ganador (int numjugadores)
{
int i, j, bandera;
for (i = 0; i < numjugadores; i++) {
for (bandera = j = 0; j < MAXFICHASXJUGADOR; j++)
if (Jugador[i][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;
/* El juego va a comenzar. El jugador tiene 7 fichas iniciales */
/* se toma la £ltima ficha de las 7 como la que va a comenzar la */
/* partida. Se pod¡a haber escogido una al azar pero se hace as¡ */
/* por simplicidad. Los apuntadores cabeza y cola apuntan a este */
/* elemento */
if (cabeza == NULL) {
cola = cabeza = Jugador[jugadoractual][6];
Jugador[jugadoractual][6] = NULL;
return;
}
/* Si el flujo del programa contin£a hasta aqu¡ es que ya comenz¢ */
/* la partida. Se recorren las fichas del jugador actual para ver */
/* si alguna de ellas encaja en uno de los extremos. En caso de */
/* que si, entonces se escoje esta ficha y se inserta en la lista */
for (i = 0; i < MAXFICHASXJUGADOR; i++)
/******************************************************************************/
/******************* Código que se agregó *************************************/
if (Jugador[jugadoractual][i] == NULL)
continue;
/******************************************************************************/
/******************************************************************************/
else if (Jugador[jugadoractual][i]->numder == cabeza->numizq ||
Jugador[jugadoractual][i]->numizq == cabeza->numizq) {
if (Jugador[jugadoractual][i]->numizq == cabeza->numizq) {
int intercambio = Jugador[jugadoractual][i]->numizq;
Jugador[jugadoractual][i]->numizq = Jugador[jugadoractual][i]->numder;
Jugador[jugadoractual][i]->numder = intercambio;
}
cabeza->izq = Jugador[jugadoractual][i];
Jugador[jugadoractual][i]->der = cabeza;
cabeza = Jugador[jugadoractual][i];
Jugador[jugadoractual][i] = NULL;
return;
} else if (Jugador[jugadoractual][i]->numizq == cola->numder ||
Jugador[jugadoractual][i]->numder == cola->numder) {
if (Jugador[jugadoractual][i]->numder == cola->numder) {
int intercambio = Jugador[jugadoractual][i]->numder;
Jugador[jugadoractual][i]->numder = Jugador[jugadoractual][i]->numizq;
Jugador[jugadoractual][i]->numizq = intercambio;
}
cola->der = Jugador[jugadoractual][i];
Jugador[jugadoractual][i]->izq = cola;
cola = Jugador[jugadoractual][i];
Jugador[jugadoractual][i] = NULL;
return;
}
/* No se encontraron fichas en el jugador actual que encajaran, */
/* entonces se escogen fichas del mont¢n hasta que una de ellas */
/* encaje en la lista o hasta que se agote el mont¢n */
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][i] == NULL) {
Jugador[jugadoractual][i] = 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¢");
/******************************************************************************/
/******************* Código que se agregó *************************************/
getchar();
/******************************************************************************/
/******************************************************************************/
}