Error en ejercicio de clase

Iniciado por foreground, 14 Octubre 2012, 14:44 PM

0 Miembros y 1 Visitante están viendo este tema.

foreground

Buenos días otra vez! Resulta que tengo que hacer un juego para un ejercicio de clase de Programación I y tengo un problema que no logro resolver. El juego consiste en retirar fichas de 1 en 1 de 2 en 2 o de 3 en 3, hasta llegar a 0, el programa actual es tan solo un borrador ya que si le meto valores negativos me suma fichas entre otros errores, no obstante me preocupa el echo de que una vez que retiro todas las fichas en vez decirme quedan 0 fichas el programa me genera un espacio en blanco (quedan fichas) se me ralla y me dicen que quedan -3 o -2.

El código en cuestión es:

Código (cpp) [Seleccionar]
#include <stdio.h>
int main(){
int fquitahombre,fquitamaquina,ftotales;
char c;
printf("Bienvenido al juego de las fichas.\n");
printf("Este juego consiste en ir retirando fichas, de un total de 17, el que retire la ultima ficha pierde.\n");
printf("En cada turno puedes retirar 1,2 o 3 fichas.\n");
printf("Empieza el juego:\n");
ftotales=17;
while(ftotales>=0){
printf("Retira las fichas que desees:");
scanf("%d",&fquitahombre);
ftotales=ftotales-fquitahombre;
printf("Quedan %0.d fichas\n",ftotales);
while(ftotales>0){
fquitamaquina=4-fquitahombre;
printf("La maquina quita %.0d\n",fquitamaquina);
break;
}
ftotales=ftotales-fquitamaquina;
printf("Quedan %0.d fichas\n",ftotales);
}

printf("Has retirado la ultima ficha, por lo tanto, has perdido.");
c=getchar();
c=getchar();
}


El error

http://s2.subirimagenes.com/imagen/8056853sin-ttulo.png

leosansan

He respetado en lo posible el "formato" de tu código, ya que yo lo hubiera hecho diferente. Pero bueno, tienes corregido lo de valores negativos y que el usuario no pueda entrar valores que no sean entre 1 y 3. Además no me gusta perder siempre, con lo que le he puesto una variante a la máquina:quita fichas de forma aleatoria, así puedo ganar yo. Puedes desactivar esa opción eliminando el rand y activando la otra opción:
Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
    int main(){
    int fquitahombre=0,fquitamaquina=0,ftotales=0;
    char c;
    srand(time(0));
    printf("Bienvenido al juego de las fichas.\n");
    printf("Este juego consiste en ir retirando fichas, de un total de 17, el que retire la ultima ficha pierde.\n");
    printf("En cada turno puedes retirar 1,2 o 3 fichas.\n");
    printf("Empieza el juego:\n");
    ftotales=17;
    while(ftotales>0){
        printf("Retira las fichas que desees entre 1 y 3:");
        scanf("%d",&fquitahombre);
        while(fquitahombre > 3  || fquitahombre < 0){
        printf("Te dije entre 1 y 3:");
        scanf("%d",&fquitahombre);
        }
        ftotales=ftotales-fquitahombre;
        if (ftotales<=0)
            {
                printf("Quedan 0 fichas\n");
                printf("Has retirado la ultima ficha, por lo tanto, has perdido.");
                break;
            }
        /*fquitamaquina=4-fquitahombre;*/ /*<==tu opcion para perder siempre*/
        fquitamaquina=1+rand() % 3 ; /*mi opcion aleatorio, para poder ganar*/
        ftotales=ftotales-fquitamaquina;
        if (ftotales<=0)
            {
                printf("Quedan 0 fichas\n");
                printf("Has ganado.");
                break;
            }
        printf("La maquina quita %.0d\n",fquitamaquina);
        printf("Quedan %0.d fichas\n",ftotales);
    }
    c=getchar();
    c=getchar();
    return 0;
}

do-while

#2
¡buenas!

De hecho el que empieza deberia de perder siempre:

Pierded el que coge la ultima. (Hay 17 fichas)
Gana el que coger la penultima. (Reducimos a 16 fichas)
Entre una jugada y la.siguente siempre se pueden suma 4 fichas
Si el segundo jugador conoce las reglas siempre cogera la 16° ficha y perdera el.que empieza.

sibquieres dar una oportunidad al que empieza añade una ficha, o aumenta a 4 el numero maximo de fichas que se puedan coger. Asi si el que empieza conoce el algoritmo para ganar podra hacerlo y sino, es mas que posible que pierda.

¡saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

bemone

#3
En realidad se puede ganar sin que saque random pero depende de la cantidad de fichas que hay en total, si se puede sacar de 3 fichas hay que tratar de obtener la ventaja de ganar.
Si queda 1, perdemos.
Si quedan 5 tambien perdemos. Entonces es ciclico, hay una lista de valores con la que si caemos obtendremos la desventaja los cuales son:
vector[0] = 1;
vector = vector[i-1] + 4;
1 5 9 13 17 20 24 28  y asi susesivamente.
Si el oponente cae en algunos de esos numeros de la desventaja siempre hay que tratar de descontar 4 fichas para que siga en ese vector de desventajas.
Ponele que las fichas que quedan son 17 y le toca sacar a el.
El saca 3 por lo que 17-3 = 14. Te toca tu turno y tendrias que sacar 1 para que el vuelva a caer en esa lista de desventaja. Entonces 14-1 = 13 y le vuelve a tocar su turno.
Odio los tipos de variable de Windows.