void pedirCadena (tMovimiento *mov) { tFlag esValido = 1; char str[STR_DIM2]; char nuevoStr[15]; /* tamaño suficiente para evaluar si el usuario introdujo de más */ int fo, co; int n; fo = ++(mov->coordOrig.fil); /* sumamos 1 a las coordenadas, pues leerCoord les resta 1 */ co = ++(mov->coordOrig.col); printf("Puede encadenar una movimiento!\n"); printf("Ingrese solo la coordenada de la casilla a la que desea moverse y el tipo de captura si es necesario\n"); printf("Se imprimira su nueva casilla de origen.\n"); do { imprimirError(esValido); /* en una primer instancia no imprimirá nada, pues esValido es mayor a 0 */ printf("> M [%d,%d]", fo, co); n = getlinea(nuevoStr, 15); if (n >= MIN_STR2 && n <= MAX_STR2) { sprintf(str, "M [%d,%d]%s", fo, co, nuevoStr); esValido = validarMovFormato (str, mov); /* devuelve menor a 0 en caso de error */ } else esValido = ERR_FMT_MOV1; } while (esValido < 0); /* si es menor a cero es error */ return; }
void operacionMKDISK(parametros *listaParametros){ int path = verificarPath(listaParametros->path,"dsk"); int size = transformarSize(listaParametros); imprimirError(path,"PATH"); if(path==1 && size==1) crearDisco(listaParametros); //imprimirError(size,"SIZE"); }
int main(int argc, char *argv[]) { /*Manejo de Señales*/ signal(SIGCHLD, levantaMuertos); /*Fin manejo de señales*/ /*Variables*/ int s, e; int nivel=1; int childPid; FILE *archivoSalida; /*Fin variables* /*Validación de Parametros*/ if(argc == 2 && strcmp(argv[1],"-h") == 0) { help(); exit(0); } if(argc != 3) { imprimirError(0); } s = atoi(argv[1]); e = atoi(argv[2]); if (s <= 0) { imprimirError(1); } if (strcmp(argv[2],"0") != 0 && e <= 0) { imprimirError(2); } /*Fin validación de Parametros*/ //guarda el momento en el que la ejecución debería terminar time_t tiempoFin = time(NULL) + s; while(difftime(tiempoFin, time(NULL)) >= 0) { //loop while la diferencia de la hora actual y el tiempo de fin calculado sea mayor a cero childPid=fork(); if (childPid == -1) { imprimirError(3); } else { //luego de lanzar un hijo el proceso duerme e double dif=difftime(tiempoFin, time(NULL)); /*Si la diferencia entre el tiempo actual y el tiempo de finalización calculado es menor a "e", se agregan 10 seg más a la ejecución*/ dif<e ? sleep(dif+10) : sleep(e); if (childPid == 0) { nivel++; //incrementa el nivel de los hijos } } } archivoSalida = fopen("SALIDA.txt", "a"); if(!archivoSalida) { imprimirError(4); } if(childPid==0) { printf("Nivel alcanzado: %d PID: %d\n", nivel, getpid()); fprintf(archivoSalida, "Nivel alcanzado: %d PID: %d\n", nivel, getpid()); } fclose(archivoSalida); }
int jugar(tPartida partida){ tMovimiento mov; char nombre[MAX_NOM]; tFlag quiereGuardar=0, quiereCambiar, quiereUndo, hayGanador=0, calcularEstado=1; enum tJugada jugada = START; int captura; imprimirTablero(partida); while (!hayGanador && jugada != QUIT) { if (calcularEstado) { hayGanador = estadoJuego(partida); calcularEstado = 0; } if (!hayGanador) { if ( hayCadena(partida) && ( jugadorActual(partida) == BLANCO || modoJuego(partida) == PVP)) /* si hay cadena y no es la computadora */ mov = pedirCadena(partida); else if (jugadorActual(partida) == BLANCO || modoJuego(partida) == PVP){ /* si no es la computadora */ printf("\nTurno del jugador %s\n", jugadorActual(partida) ? "negro" : "blanco"); jugada = pedirJugada(&mov, nombre); } else{ /*Mueve la computadora */ printf("\nMueve la computadora:"); if(calcularMovCompu(&mov, partida) != 0){ imprimirError(ERR_MEM_COMPU); exit(1); } } if (jugada == MOV) { captura = mover(partida, &mov); if (captura == AMBIGUO) { /*Hay que pedirle que especifique*/ mov.tipoMov = pedirCaptura(); captura = mover (partida, &mov); } if (captura >= 0) { /* si el movimiento fue válido */ imprimirMov (&mov); imprimirTablero(partida); if (!hayCadena(partida)) { /* cambiamos de turno */ cambiarTurno (partida); calcularEstado=1; } } else imprimirError(captura); } else if (jugada == UNDO) { quiereUndo = undo(partida); if( quiereUndo == OK ){ imprimirTablero(partida); calcularEstado = 1; /*Tiene que volver a chequear el tablero */ } else imprimirError(quiereUndo); } else if (jugada == QUIT) { printf("Desea guardar su juego antes de salir?\n"); quiereGuardar = leerSN(); if (quiereGuardar) pedirNombre(nombre); } if (jugada == SAVE || quiereGuardar) { do { printf("Desea guardar su juego con el nombre '%s'?\n", nombre); quiereCambiar = !leerSN(); if (quiereCambiar) pedirNombre(nombre); } while (quiereCambiar); if (guardarPartida(partida, nombre) != ERROR) printf("Se ha guardado su juego con el nombre '%s'\n", nombre); else imprimirError(ERR_SAVE); } } } return hayGanador; /* si se salió por QUIT, hayGanador vale 0 */ }
/* main crea la partida según las especificaciones del usuario ** y llama a jugar con dicha partida. */ int main(void){ int opcion; int modo; tPartida partida; char nombre[MAX_NOM]; tFlag ganador; int filas, columnas; printf("\n\t\t=*=*=*=*=*=*=*=*=*==FANORONA==*=*=*=*=*=*=*=*=*=*="); printf("\n\t\t=*=*=*=*=*=*=*=*=FUTURAMA EDITION=*=*=*=*=*=*=*=*=\n\n"); printf("\n\t\t=*=*=*=*=*=*=*==NOTAS SOBRE EL JUEGO=*=*=*=*=*=*=*=\n"); printf("\n\t\t\t\tLa captura es obligatoria\n"); printf("\n\t\tLas casillas fuertes se marcan con letras mayusculas\n"); printf("\t\ty las debiles oon minuscula"); printf("\n\n\t\tEl formato de movida es \"M [Fo,Co][Fd,Cd][w]\", o bien\n"); printf("\t\t\"M [Fo,Co][Fd,Cd][a]\", siendo Fo,Co Fd,Cd las coordenadas\n"); printf("\t\tde origen y destino, y w/a el tipo de movida (WITHDRAWAL \n"); printf("\t\t o APPROACH)\n\n"); printf("\t\t=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n\n"); printf("\tElija una opcion:\n\n"); printf("\t\t1. Juego nuevo: vs PC\n"); printf("\t\t2. Juego nuevo: dos jugadores\n"); printf("\t\t3. Cargar partida de archivo\n"); printf("\t\t4. Salir\n\n"); do{ opcion=getint("Ingrese un numero de opcion > "); }while(opcion<1 || opcion>4); if(opcion == 1 || opcion == 2){ modo = opcion == 1 ? PVE : PVP; /* 1 es juego contra la computadora, 2 es dos jugadores*/ pedirDimensiones(&filas, &columnas); partida=generarPartida(filas,columnas, modo); if(partida == NULL){ imprimirError(ERR_MEM_COMPU); return 1; } } else if(opcion == 3){ /*Cargar partida*/ printf("Ingrese el nombre del archivo:\n > "); leerLinea(nombre, MAX_NOM); partida=cargarPartida(nombre); /*modo cambia al correspondiente (0 o 1)*/ if(partida == NULL){ printf("\nError al intentar abrir el archivo \"%s\". Abortando...\n\n", nombre); return 1; } printf("\nMODO DE JUEGO: %s\n", modoJuego(partida)?"DOS JUGADORES":"JUGADOR VS COMPUTADORA"); printf("TURNO DEL JUGADOR %s\n", jugadorActual(partida)?"NEGRO":"BLANCO"); printf("DIMENSIONES DEL TABLERO: %dx%d\n\n", numFilas(partida),numCols(partida)); } else{ /* Salir */ printf("\n\t\t¡Adios!\n\n"); return 0; } ganador = jugar(partida); switch(ganador) { case GANADOR_BLANCO: printf("\a\n\n\t===========GANADOR: BLANCO==========\n\n"); break; case EMPATE: printf("\a\n\n\t===========EMPATE===========\n\n"); break; case GANADOR_NEGRO: printf("\a\n\n\t==========GANADOR: NEGRO===========\n\n"); break; } eliminarPartida(partida); return 0; }
int jugar2(tTablero tablero, int modo, int jugador){ enum tDireccion dir=NULA; tMovimiento mov; char nombre[MAX_NOM]; tFlag jugada=START, quiereGuardar=0, hayCadena=0, quiereCambiar, hayGanador=0, calcularGanador=1, primerUndo=1; int captura; int a,b; /*TEMP*/ int estado = SEGUIR; tFlag hayPaika; tCasilla ** tableroAuxiliar; if(modo==PVE){ tableroAuxiliar = generarMatrizTablero(tablero.filas, tablero.cols); copiarTablero(&tablero, tableroAuxiliar); } imprimirTablero(&tablero); while (!hayGanador && jugada != QUIT) { if (calcularGanador) { hayGanador = estadoPostJugada(&tablero, jugador, &hayPaika); calcularGanador = 0; } if (!hayGanador) { if (hayCadena && (jugador == BLANCO || modo == PVP)) /* si hay cadena y no es la computadora */ pedirCadena(&mov); else if (jugador == BLANCO || modo == PVP) /* si no es la computadora */ jugada = pedirJugada(&mov, nombre); else{ /*Mueve la computadora */ if(calcularMovCompu(&mov, &tablero, hayPaika, hayCadena, dir) != 0){ imprimirError(ERR_MEM_COMPU); exit(1); } } if (jugada == MOV) { captura = mover(jugador, modo, &tablero, tableroAuxiliar, &mov, &dir, hayPaika, &hayCadena); if (captura == AMBOS) { /*Hay que pedirle que especifique*/ mov.tipoMov = pedirCaptura(); captura = mover (jugador, modo, &tablero, tableroAuxiliar, &mov, &dir, hayPaika, &hayCadena); } if (captura >= 0) { /* si el movimiento fue válido */ imprimirTablero(&tablero); if (!hayCadena) { /* cambiamos de turno */ cambiarTurno (&jugador, &tablero, &dir); primerUndo=1; calcularGanador=1; printf("Cambio!\nLe toca al jugador %s\n", jugador ? "negro" : "blanco"); } } else imprimirError(captura); } else if (jugada == UNDO) { if (modo == PVE) { if(primerUndo){ intercambiarTableros(&tablero, &tableroAuxiliar); imprimirTablero(&tablero); primerUndo=0; calcularGanador = 1; /*Tiene que volver a chequear el tablero */ } else imprimirError(ERR_UNDO_DOBLE); } else imprimirError(ERR_UNDO); /* aca va lo del error del undo */ } else if (jugada == QUIT) { printf("Desea guardar su juego antes de salir?\n"); quiereGuardar = leerSN(); if (quiereGuardar) pedirNombre(nombre); } if (jugada == SAVE || quiereGuardar) { do { printf("Desea guardar su juego con el nombre '%s'?\n", nombre); quiereCambiar = !leerSN(); if (quiereCambiar) pedirNombre(nombre); } while (quiereCambiar); if (guardarPartida(&tablero, modo, jugador, nombre) != ERROR) printf("Se ha guardado su juego con el nombre '%s'\n", nombre); else printf("Error: no se ha podido guardar su juego.\n"); } } } return hayGanador; /* si se salió por QUIT, hayGanador vale 0 */ }
int jugar(tTablero tablero, int modo, int jugador){ enum tDireccion dir=NULA; tMovimiento mov; char nombre[MAX_NOM]; tFlag jugada=START, quiereGuardar=0, hayCadena=0, quiereCambiar, hayGanador=0, calcularGanador=1, primerUndo=1; int captura; int a,b; /*TEMP*/ int estado = SEGUIR; tFlag hayPaika; tCasilla ** tableroAuxiliar; if(modo==PVE) tableroAuxiliar = generarMatrizTablero(tablero.filas, tablero.cols); imprimirTablero(&tablero); while (!hayGanador && jugada != QUIT) { if (calcularGanador) { hayGanador = estadoPostJugada(&tablero, jugador, &hayPaika); calcularGanador = 0; } if (!hayGanador) { if (hayCadena && (jugador == BLANCO || modo == PVP)) /* si hay cadena y no es la computadora */ pedirCadena(&mov); else if (jugador == BLANCO || modo == PVP) /* si no es la computadora */ jugada = pedirJugada(&mov, nombre); else{ /*Mueve la computadora */ jugada=MOV; if(calcularMovCompu(&mov, &tablero, hayPaika, hayCadena, dir) != 0){ imprimirError(ERR_MEM_COMPU); exit(1); } } if (jugada == MOV) { if(modo==PVE && jugador==BLANCO){ /*Copia el tablero al auxiliar solo antes de que juegue el usuario ** (siempre es BLANCO) y solo si el juego es vs. Computadora*/ copiarTablero(&tablero, tableroAuxiliar); primerUndo=1; } if (jugador == BLANCO || jugador == NEGRO) { captura = validarMovimiento(jugador, &tablero, mov, &dir, hayPaika); if (captura == AMBOS) /* ambiguedad en la jugada*/ mov.tipoMov = pedirCaptura(); else if (captura == APPROACH || captura == WITHDRAWAL) mov.tipoMov = captura; imprimirError(captura); /* en caso de movimiento valido, no imprime nada */ } if (captura >= 0) { /* el movimiento es válido */ actualizarTablero(&tablero, dir, mov); imprimirTablero(&tablero); hayCadena = 0; if (captura != NINGUNO) /* si no fue PAIKA, busca una posible cadena */ hayCadena = jugadaObligada(&tablero, jugador, mov.coordDest, dir); if (hayCadena) { /* al haber cadena, el origen es el nuevo destino */ mov.coordOrig.fil = mov.coordDest.fil; mov.coordOrig.col = mov.coordDest.col; } else { /* cambio de turno */ printf("Cambio!\n"); jugador = !jugador; /* Cambia */ printf("\nLe toca al jugador %s\n", jugador ? "negro" : "blanco"); dir = NULA; /* Ninguna */ calcularGanador = 1; /* calculamos un posible ganador */ limpiarTocadas(&tablero); } } } else if (jugada == UNDO) { if (modo == PVE) { if(primerUndo){ intercambiarTableros(&tablero, &tableroAuxiliar); primerUndo=0; } else imprimirError(ERR_UNDO_DOBLE); imprimirTablero(&tablero); } else imprimirError(ERR_UNDO); /* aca va lo del error del undo */ } else if (jugada == QUIT) { printf("Desea guardar su juego antes de salir?\n"); quiereGuardar = leerSN(); if (quiereGuardar) pedirNombre(nombre); } if (jugada == SAVE || quiereGuardar) { do { printf("Desea guardar su juego con el nombre '%s'?\n", nombre); quiereCambiar = !leerSN(); if (quiereCambiar) pedirNombre(nombre); } while (quiereCambiar); guardarPartida(&tablero, modo, jugador, nombre); printf("Se ha guardado su juego con el nombre '%s'\n", nombre); } } } return hayGanador; /* si se salió por QUIT, hayGanador vale 0 */ }