int main(int argc, char* argv[]){ /* NOTA: las variables están declaradas acá para evitar el warning: ISO C90 forbids mixed declarations and code [-pedantic] */ int error; FILE* parchivo; tcelda tablero[MAX_DIMENSION*MAX_DIMENSION]={0}; error=validarParametrosNumericos(argc, argv); if (error!=0) return error; if (argc < 4) parchivo=stdin; else if ((parchivo=fopen(argv[3], "r"))==NULL){ DEBUG_MSG("Error: archivo no existe o no se puede abrir.\n"); return ERROR_ARCHIVO_NO_ABRE; } inicializarDeArchivo(atoi(argv[1]), parchivo, tablero); if (IMPRIMIR_MATRIZ==1) imprimirTablero(atoi(argv[1]), tablero); correrProceso(atoi(argv[1]), atoi(argv[2]), tablero); if (argc==4) fclose(parchivo); return 0; }
/** Descripcion: procesa el tablero inicializado. */ void correrProceso(int n, int iteraciones, tcelda* tablero){ int i,j,k; tcelda vecino, contador_vivos, *celda; imprimirEnFormatoEntrada(n, tablero); for (k=0; k<iteraciones; k++){ for (i=0; i<n; i++){ for (j=0; j<n; j++){ contador_vivos=0; celda=getCelda(n, i,j,tablero); for (vecino=1; vecino<=8; vecino++){ if (estaVivo(n, vecino, i, j, tablero)==0) contador_vivos++; } setNuevoEstado(celda, analizarEstado(n, \ contador_vivos, i, j, tablero)); } } aplicarCambios(n, tablero); if (IMPRIMIR_MATRIZ==1){ printf("> Iteracion %d \n", k); imprimirTablero(n, tablero); } imprimirEnFormatoEntrada(n, tablero); } }
int juegoNuevo(tJuego * juego) { tPunto nPunto; juego->tablero = crearTablero(juego, 1); imprimirTablero(juego); while (1) // TODO: Reemplazar 1 por checkearTablero() { verificarJugada(juego); reacomodarTablero(juego); imprimirTablero(juego); } return 0; }
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 */ }
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 */ }