hola buenas tardes acabo e terminar un domino con grafos pero crece hacia arriba y no se como hacerle para que en igual de que creesca hacia arriba cresca para los lados me gustaria saber si me pueden ayudar por favor me urge de verdad mi correo es
belen_scare@yahoo.com.mxde verdad me urge ojala me puedan ayudar por que ahora si que ya no se que hacer
aqui les mando el codigo del domino que tengo
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <graphics.h>
#include <dos.h>
/* Estructuras */
/* Estructura para determinar donde estan puestas las fichas */
struct posf
{
int izq;
int der;
int arr;
int ab;
};
typedef struct posf POSFICHA;
/* Estructura de Directorios */
struct NodoDir
{
char vert[3];
int fichas;
int tipo;
/* cordenadas de la ficha */
int x;
int y;
int sent;
POSFICHA fpos;
struct NodoLy *lady;
struct NodoDir *sig;
};
/* Estructura de la Lista */
struct NodoLy
{
struct NodoDir *ptrv;
struct NodoLy *sig;
};
/* Variables Globales */
struct NodoDir *MulaActiva = NULL;
struct NodoDir *UltimaFicha = NULL;
int Pmula=0;
int ancho = 30;
int alto = 10;
int pfposx = 100;
int pfposy = 250;
int Retardo = 2000;
/* Dibuja la ficha en la pantalla */
void Dficha(int x,int y,char d1,char d2,int sentido)
{
char dt[256];
delay(Retardo);
/* Dibuja la ficha Horizontal */
setcolor(WHITE);
if(sentido == 0)
{
setcolor(DARKGRAY);
bar(x,y,x+ancho,y+alto);
setfillstyle(SOLID_FILL,WHITE);
rectangle(x,y,x+ancho,y+alto);
setcolor(DARKGRAY);
line(x+ancho/2+3,y+2,x+ancho/2+3,y+alto-2);
setcolor(LIGHTGRAY);
line(x+ancho/2+2,y+2,x+ancho/2+2,y+alto-2);
line(x,y,x,y+alto);
line(x,y,x+ancho,y);
setcolor(BROWN);
sprintf(dt,"%c",d1);
outtextxy(x+ancho/4,y+2,dt);
sprintf(dt,"%c",d2);
outtextxy(x+(ancho/4)*3,y+2,dt);
}
/* Dibuja la ficha Vertical */
else
{
setcolor(DARKGRAY);
bar(x,y,x+alto,y+ancho);
setfillstyle(SOLID_FILL,WHITE);
rectangle(x,y,x+alto,y+ancho);
setcolor(DARKGRAY);
line(x+2,y+ancho/2+3,x+alto-2,y+ancho/2+3);
setcolor(LIGHTGRAY);
line(x+2,y+ancho/2+2,x+alto-2,y+ancho/2+2);
line(x,y,x+alto,y);
line(x,y,x,y+ancho);
setcolor(BROWN);
sprintf(dt,"%c",d1);
outtextxy(x+2,y+ancho/4,dt);
sprintf(dt,"%c",d2);
outtextxy(x+2,y+(ancho/4)*3,dt);
}
}
/* Determina la posicion de la ficha */
void PonerFicha(struct NodoDir *fant,struct NodoDir *fnueva,char Dt)
{
int cx=0,cy=0,sentido=0,fp=0;
int Bandera = 0;
char C1='\0';
char C2='\0';
if(fant->tipo == 0)
{
if(fant->sent == 0)
{
if(fnueva->tipo == 0)
{
if(fant->fpos.izq == 0 && fant->fpos.der == 0)
{
fant->fpos.der = 1;
goto IZQ;
}
if(fant->fpos.izq == 1)
{
IZQ:
cx = fant->x+ancho+1;
cy = fant->y;
fp = 0;
sentido = 0;
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
else
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
}
if(fant->fpos.der == 1)
{
cx = fant->x-(ancho+1);
cy = fant->y;
sentido = 0;
fp = 1;
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
else
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
}
}
if(fnueva->tipo == 1)
{
if(fant->fpos.izq == 0 && fant->fpos.der == 0)
{
fant->fpos.der = 1;
Bandera = 1;
goto IZQM;
}
if(fant->fpos.izq == 1)
{
IZQM:
cx = fant->x+ancho+1;
sentido = 1;
cy = fant->y-(ancho-alto)/2;
fp=0;
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
if(fant->fpos.der == 1 && Bandera == 0)
{
cx = fant->x-(alto+1);
sentido = 1;
cy = fant->y-(ancho-alto)/2;
fp = 1;
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
}
}
if(fant->sent == 1)
{
if(fnueva->tipo == 0)
{
if(fant->fpos.ab == 1)
{
cx = fant->x;
sentido = 1;
cy = fant->y-(ancho+1);
fp = 3;
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
else
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
}
if(fant->fpos.arr == 1)
{
cx = fant->x;
sentido = 1;
fp = 2;
cy = fant->y+(ancho+1);
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
else
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
}
}
if(fnueva->tipo == 1)
{
if(fant->fpos.ab == 1)
{
cx = fant->x-(ancho-alto)/2;
sentido = 0;
fp = 3;
cy = fant->y-(alto+1);
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
if(fant->fpos.arr == 1)
{
cx = fant->x-(ancho-alto)/2;
sentido = 0;
fp = 2;
cy = fant->y+(ancho+1);
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
}
}
}
if(fant->tipo == 1)
{
if(fant->sent == 1)
{
if(fant->fpos.izq == 0)
{
cx = fant->x-(ancho+1);
cy = fant->y+(ancho-alto)/2;
sentido = 0;
fp = 1;
fant->fpos.izq = 1;
Bandera = 1;
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
else
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
}
if(fant->fpos.izq == 1 && fant->fpos.ab == 0 && Bandera == 0)
{
cx = fant->x;
cy = fant->y+(ancho+1);
sentido = 1;
fp = 2;
fant->fpos.ab = 1;
Bandera = 1;
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
else
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
}
if(fant->fpos.izq == 1 && fant->fpos.ab == 1 && fant->fpos.der == 0 && Bandera == 0)
{
cx = fant->x+(alto+1);
cy = fant->y+(ancho-alto)/2;
sentido = 0;
fp = 0;
fant->fpos.der = 1;
Bandera = 1;
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
else
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
}
if(fant->fpos.izq == 1 && fant->fpos.ab == 1 && fant->fpos.der == 1 && fant->fpos.arr == 0 && Bandera == 0)
{
cx = fant->x;
cy = fant->y-(ancho+1);
sentido = 1;
fp = 3;
fant->fpos.arr = 1;
Bandera = 1;
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
else
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
}
}
if(fant->sent == 0)
{
if(fant->fpos.izq == 0)
{
cx = fant->x-(ancho+1);
cy = fant->y;
sentido = 0;
fp = 1;
fant->fpos.izq = 1;
Bandera = 1;
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
else
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
}
if(fant->fpos.izq == 1 && fant->fpos.ab == 0 && Bandera == 0)
{
cx = fant->x+(ancho-alto)/2;
cy = fant->y+alto+1;
sentido = 1;
fp = 2;
fant->fpos.ab = 1;
Bandera = 1;
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
else
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
}
if(fant->fpos.izq == 1 && fant->fpos.ab == 1 && fant->fpos.der == 0 && Bandera == 0)
{
cx = fant->x+ancho+1;
cy = fant->y;
sentido = 0;
fp = 0;
fant->fpos.der = 1;
Bandera = 1;
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
else
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
}
if(fant->fpos.izq == 1 && fant->fpos.ab == 1 && fant->fpos.der == 1 && fant->fpos.arr == 0 && Bandera == 0)
{
cx = fant->x+(ancho-alto)/2;
cy = fant->y-(ancho+1);
sentido = 1;
fp = 3;
fant->fpos.arr = 1;
Bandera = 1;
if(fnueva->vert[0] == Dt)
{
C1 = fnueva->vert[1];
C2 = fnueva->vert[0];
}
else
{
C1 = fnueva->vert[0];
C2 = fnueva->vert[1];
}
}
}
}
fnueva->x = cx;
fnueva->y = cy;
fnueva->sent = sentido;
if(fp == 0)
fnueva->fpos.izq = 1;
else
if(fp == 1)
fnueva->fpos.der = 1;
else
if(fp == 2)
fnueva->fpos.arr = 1;
else
if(fp == 3)
fnueva->fpos.ab = 1;
Dficha(cx,cy,C1,C2,sentido);
}
/* Regresa la direccion del Vertice */
struct NodoDir *direccion(struct NodoDir *G,char dato[2])
{
char dt[3];
struct NodoDir *b=NULL,*c=NULL;
dt[0]=dato[1];
dt[1]=dato[0];
dt[2]='\0';
c=G;
while(b == NULL && c != NULL)
{
if(strcmp(c->vert,dato) == 0 || strcmp(c->vert,dt) == 0)
b=c;
else
c=c->sig;
}
return (
;
}
/* Determina si existe un arco de v a v1 */
/* Regresa */
/* -1 = Alguno de los Nodos No existe */
/* 0 = No hay Arco de v a v1 */
/* 1 = Si hay arco de v a v1 */
int adyacente(struct NodoDir *G,char v[2],char v1[2])
{
struct NodoDir *i=NULL,*j=NULL;
struct NodoLy *k=NULL;
int sw=0;
i=direccion(G,v);
j=direccion(G,v1);
if(i != NULL && j != NULL)
if(i != NULL && sw == 0)
{
k=i->lady;
while(k != NULL && sw == 0)
{
if(k->ptrv == j)
sw=1;
else
{
sw=0;
k=k->sig;
}
}
return(sw);
}
else
return(0);
else
return(-1);
}
/* Crea Vertice */
struct NodoDir *crearvt(char dato[2])
{
struct NodoDir *v=NULL;
v = malloc(sizeof(struct NodoDir));
strcpy(v->vert,dato);
if(v->vert[0]==v->vert[1])
v->tipo = 1;
else
v->tipo = 0;
v->fichas = 0;
v->sent = 0;
v->x = 0;
v->y = 0;
v->fpos.arr = 0;
v->fpos.ab = 0;
v->fpos.izq = 0;
v->fpos.der = 0;
v->lady=NULL;
v->sig=NULL;
return(v);
}
/* Regresa la direccion del ultimo nodo en el directorio */
struct NodoDir *ultimo_dir(struct NodoDir * G)
{
if(G != NULL)
while(G->sig != NULL)
G = G->sig;
return(G);
}
/* Agrega Nuevo vertice al grafo y regresa un apuntardor
al principio de la lista */
struct NodoDir *nuevo_vertice(struct NodoDir *G,char dato[2])
{
struct NodoDir *a=NULL;
if(G != NULL)
{
a = ultimo_dir(G);
a->sig = crearvt(dato);
}
else
{
G = crearvt(dato);
return(G);
}
}
/* Crea el Nodo Adyacente */
struct NodoLy *creanodoady(struct NodoDir *e)
{
struct NodoLy *d=NULL;
d = malloc(sizeof(struct NodoLy));
d->ptrv = e;
d->sig = NULL;
return(d);
}
/* Regresa la direccion del ultimo nodo en la lista adyacente */
struct NodoLy *ultimo_ver(struct NodoLy *lista)
{
if(lista != NULL)
while(lista -> sig != NULL)
lista = lista -> sig;
return (lista);
}
/* Crea arco o camino entre v1 y v2 */
void unionver(struct NodoDir *G,char v1[2],char v2[2])
{
struct NodoDir *f=NULL,*g=NULL;
struct NodoLy *h=NULL;
f=direccion(G,v1);
g=direccion(G,v2);
if(f != NULL && g != NULL)
{
if(f->lady == NULL)
f->lady = creanodoady(g);
else
{
h=ultimo_ver(f->lady);
h->sig = creanodoady(g);
}
f->fichas+=1;
}
else
{
clrscr();
printf("Alguno de los Nodos Dados No existe.");
getch();
}
}
/* Crea Las fichas de domino y regresa el principio de la lista*/
struct NodoDir *CrearFichas(struct NodoDir *Grafo)
{
char *dato,aux[256],aux2[256];
int cont=0,cont2;
while(cont <= 6 )
{
for(cont2=cont;cont2<=6;cont2++)
{
sprintf(aux,"%d",cont);
sprintf(aux2,"%d",cont2);
dato = strcat(aux,aux2);
if(Grafo == NULL)
Grafo = nuevo_vertice(Grafo,dato);
else
nuevo_vertice(Grafo,dato);
aux[0]='\0';
aux2[0]='\0';
}
cont++;
}
return(Grafo);
}
/* Dibuja la lista de Adyacencia */
void DibujaAdy(struct NodoLy *l,int posx,int posy)
{
while(l != NULL)
{
setcolor(RED);
setfillstyle(SOLID_FILL,WHITE);
bar(posx,posy,posx+25,posy+11);
rectangle(posx,posy,posx+25,posy+11);
setcolor(BLUE);
outtextxy(posx+2,posy+2,l->ptrv->vert);
if(l->sig != NULL)
{
setcolor(RED);
line(posx+26,posy+6,posx+36,posy+6);
rectangle(posx+20,posy,posx+25,posy+11);
}
else
{
setfillstyle(SOLID_FILL,RED);
bar(posx+20,posy,posx+25,posy+11);
}
posx+=35;
l=l->sig;
}
}
/* Dibuja la lista de Directorio */
void DibujarDir(struct NodoDir *G)
{
int x=5,y=5;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
setbkcolor(LIGHTGRAY);
setcolor(BLUE);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
outtextxy(420,200,"G R A F O S");
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(400,250,"Lista de Adyacencia");
outtextxy(340,270,"Todas las mulas pueden tener 4 fichas");
while(G != NULL)
{
setcolor(RED);
setfillstyle(SOLID_FILL,GREEN);
bar(x,y,x+25,y+11);
rectangle(x,y,x+25,y+11);
setcolor(WHITE);
outtextxy(x+2,y+2,G->vert);
if(G->lady == NULL)
{
setfillstyle(SOLID_FILL,RED);
bar(x+20,y,x+25,y+11);
}
else
{
setcolor(RED);
line(x+26,y+6,x+36,y+6);
rectangle(x+20,y,x+25,y+11);
DibujaAdy(G->lady,x+35,y);
}
if(G->sig != NULL)
{
setcolor(RED);
line(x+12,y+12,x+12,y+16);
}
y+=17;
G=G->sig;
}
}
/* Inicio del juegos */
void inicio(struct NodoDir *G)
{
char n1,n2;
char ficha1[3];
char ficha2[3];
int gdriver=DETECT,gmode;
struct NodoDir *First;
struct NodoDir *Sec;
inicio:
clrscr();
gotoxy(1,1);printf(" <- Ficha Inicial -> ");
gotoxy(1,9); printf("ÉÍÍÍÍÍËÍÍÍÍÍ»");
gotoxy(1,10);printf("º º º");
gotoxy(1,11);printf("ÈÍÍÍÍÍÊÍÍÍÍͼ");
textcolor(YELLOW);
fflush(stdin);
gotoxy(4,10);scanf("%c",&n1);
fflush(stdin);
gotoxy(10,10);scanf("%c",&n2);
ficha1[0]=n1;
ficha1[1]=n2;
ficha1[2]='\0';
if(direccion(G,ficha1) != NULL)
{
initgraph(&gdriver,&gmode,"");
setbkcolor(CYAN);
First = direccion(G,ficha1);
First->x = pfposx;
First->y = pfposy;
First->sent = 0;
Dficha(pfposx,pfposy,First->vert[0],First->vert[1],First->sent);
if(n2 > n1)
{
ficha2[0]=n2;
ficha2[1]=n2;
ficha2[2]='\0';
}
else
{
ficha2[0]=n1;
ficha2[1]=n1;
ficha2[2]='\0';
}
if(strcmp(ficha1,ficha2) != 0)
{
unionver(G,ficha1,ficha2);
unionver(G,ficha2,ficha1);
MulaActiva = direccion(G,ficha2);
}
else
{
if(ficha1[1] != '0')
ficha2[0]='0';
else
ficha2[1]='1';
unionver(G,ficha1,ficha2);
unionver(G,ficha2,ficha1);
MulaActiva = direccion(G,ficha1);
}
Sec =direccion(G,ficha2);
if(First->tipo == 1)
PonerFicha(First,Sec,First->vert[0]);
else
PonerFicha(First,Sec,Sec->vert[0]);
}
else
{
clrscr();
printf("Esa Ficha no existe");
getch();
goto inicio;
}
}
/* Hace los movimientos de las Mulas */
void Mulas(struct NodoDir * G)
{
struct NodoDir *Naux;
Naux = G;
while(MulaActiva != NULL)
if((MulaActiva->fichas < 4))
{
while(Naux != NULL)
{
if(Naux->vert[0] == MulaActiva->vert[0] || Naux->vert[0] == MulaActiva->vert[1] || Naux->vert[1] == MulaActiva->vert[0] || Naux->vert[1] == MulaActiva->vert[1])
{
if(strcmp(Naux->vert,MulaActiva->vert) != 0)
if(adyacente(G,MulaActiva->vert,Naux->vert) == 0)
{
if(Naux->fichas < 4 && Naux->lady == NULL)
{
unionver(G,MulaActiva->vert,Naux->vert);
unionver(G,Naux->vert,MulaActiva->vert);
UltimaFicha = Naux;
PonerFicha(MulaActiva,Naux,MulaActiva->vert[0]);
}
}
}
if((MulaActiva->fichas >= 4 ))
goto cerrar;
Naux=Naux->sig;
}
goto cerrar;
}
else
{
cerrar:
Pmula=1;
MulaActiva = NULL;
}
}
/* Determian que numero de la ficha es el que esta libre */
char Suelta(struct NodoDir *Fi)
{
if(Fi->vert[0] == Fi->lady->ptrv->vert[0] || Fi->vert[0] == Fi->lady->ptrv->vert[1])
return(Fi->vert[1]);
else
return(Fi->vert[0]);
}
/* Selecciona la ficha que sea Mayor */
struct NodoDir *BusMay(struct NodoDir *G,int *Igual,char *libre)
{
struct NodoDir *F=NULL,*Sel=NULL;
char sueltas[4];
char suelta1;
char suelta2;
int x=0;
F=G;
while(F != NULL)
{
if(F->lady != NULL && F->fichas < 2)
{
if(Sel == NULL)
{
Sel = F;
sueltas
*libre = sueltas
x+=1;
}
else
{
suelta1 = Suelta(Sel);
suelta2 = Suelta(F);
sueltas
x+=1;
if(suelta2 > suelta1)
{
*libre = suelta2;
Sel = F;
}
}
}
F = F->sig;
}
if(sueltas[0] == sueltas[1] && sueltas[0] == sueltas[2] && sueltas[0] == sueltas[3])
*Igual = 1;
return(Sel);
}
/* Busca la Ficha que se va a poner Regresa a FIN si se cierra o se terminan las Fichas */
char *BusFi(struct NodoDir *G,char libre)
{
struct NodoDir *N=NULL;
N=G;
while(N != NULL)
{
if(N->lady == NULL)
if(libre == N->vert[0] || libre == N->vert[1])
return(N->vert);
N=N->sig;
}
return("FIN");
}
/* Dibuja Las Fichas Sobrantes */
void FSobr(struct NodoDir *G)
{
int x=10,y=430;
while(G != NULL)
{
if(G->lady == NULL)
{
Dficha(x,y,G->vert[0],G->vert[1],0);
x+=70;
if(x > 600)
{
y+=30;
x=10;
}
}
G=G->sig;
}
}
/* Simula el Juego de Domino */
void Juego(struct NodoDir *G)
{
int Eq=0;
struct NodoDir *FSel;
struct NodoDir *Fnu;
char Libre,*Nfi;
char Fmula[3];
inicio(G);
while('?')
{
if(MulaActiva != NULL)
{
Mul:
Mulas(G);
}
FSel = BusMay(G,&Eq,&Libre);
Fmula[0] = Libre;
Fmula[1] = Libre;
Fmula[2] = '\0';
MulaActiva = direccion(G,Fmula);
if(MulaActiva->fichas == 0)
{
unionver(G,FSel->vert,Fmula);
unionver(G,Fmula,FSel->vert);
PonerFicha(FSel,MulaActiva,Libre);
goto Mul;
}
Nfi=BusFi(G,Libre);
/* Termina el bucle y sale de la funcion */
if(strcmp(Nfi,"FIN") == 0)
break;
Fnu = direccion(G,Nfi);
randomize();
if(Eq == 0)
{
unionver(G,Nfi,FSel->vert);
unionver(G,FSel->vert,Nfi);
UltimaFicha = Fnu;
PonerFicha(FSel,Fnu,Libre);
}
else
{
unionver(G,Nfi,UltimaFicha->vert);
unionver(G,UltimaFicha->vert,Nfi);
PonerFicha(UltimaFicha,Fnu,Libre);
UltimaFicha = Fnu;
}
if(Fnu->tipo == 1)
{
MulaActiva = direccion(G,Nfi);
goto Mul;
}
}
outtextxy(200,400,"FICHAS SOBRANTES");
}
/* Modulo Principal */
void main(void)
{
struct NodoDir *GRAFO=NULL;
clrscr();
GRAFO = CrearFichas(GRAFO);
Juego(GRAFO);
Retardo = 100;
FSobr(GRAFO);
getch();
}