int verificarJugada(tJuego * juego) { int estado, jugada, argumentos, azulejosEliminados = 0; tPunto punto; enum {ERROR, ELIMINAR, MARTILLAZO, COLUMNA, HILERA, UNDO, SAVE, QUIT}; do { printf("Ingresar accion:\n"); jugada = pedirJugada(); } while (jugada == ERROR); switch(jugada) { case ELIMINAR: azulejosEliminados = eliminarWrapper(juego); break; case MARTILLAZO: azulejosEliminados = martillazoWrapper(juego); break; case COLUMNA: azulejosEliminados = columnaWrapper(juego); break; case HILERA: azulejosEliminados = hileraWrapper(juego); break; case UNDO: azulejosEliminados = columnaWrapper(juego); break; case SAVE: break; case QUIT: break; default: printf("Jugada no reconocida\n"); break; } printf("Azulejos eliminados: %d\n", azulejosEliminados); }
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 */ }