Bueno, para este juego suponemos que existe una caja con una cantidad N de pelotitas. El primer jugador debe sacar un mínimo de 1 pelota y un máximo de N-1 pelotas. El segundo jugador debe sacar un mínimo de 1 pelota y un máximo igual al doble del numero sacado por el jugador anterior. Para el segundo turno del jugador 1 se aplican las mismas reglas que para el jugador 2 y así sucesivamente. Por ejemplo:
Hay 9 pelotas en la caja.
Jugador 1: (min=1 y max=8) saca 2 pelotas. Quedan 7.
Jugador 2: (min=1 y max=4) saca 3 pelotas. Quedan 4.
Jugador 1: (min=1 y max=6) saca 4 pelotas. Quedan 0.
Gana el jugador que saca la ultima pelota de la caja. En el ejemplo ningún jugador esta jugando de manera optima. Se pide crear un programa que juegue de manera optima.
El siguiente código es una posible solución. Si alguien tiene otra solución seria bueno que la publique.
NOTA: El juego no lo invente yo (me refiero a las reglas) solo la solución (me refiero al código).
#include <iostream.h>
#include <conio.c>
void jugar(int *n, int *lim, int j, int tj);
int menu1(int n);
int menu2();
int maquina(int n, int lim);
void main(){
int j1, j2, lim, n, nj=0;
j1=menu1(1);
j2=menu1(2);
n=menu2();
lim=n-1;
clrscr();
do{
jugar(&n, &lim, 1, j1);
if(n!=0){jugar(&n, &lim, 2, j2);}
}while(n>0);
system("pause");
}
int menu1(int n){
int op;
do{
clrscr();
cout<<"-------------------------------------"<<endl;
cout<<"ELIJA AL JUGADOR "<<n<<" :"<<endl;
cout<<"-------------------------------------"<<endl;
cout<<"OPCIONES:"<<endl;
cout<<" [1] Hombre. "<<endl;
cout<<" [2] Maquina."<<endl;
cout<<"-------------------------------------"<<endl;
cout<<" Ingrese una opcion: ( ) "<<endl;
cout<<"-------------------------------------"<<endl;
gotoxy(27, 8); cin>>op;
}while(op<1 || op>2);
return op;
}
int menu2(){
int op;
do{
clrscr();
cout<<"-------------------------------------"<<endl;
cout<<"Ingrese el numero de pelotas: ( )"<<endl;
cout<<"-------------------------------------"<<endl;
gotoxy(33, 2); cin>>op;
}while(op<2);
return op;
}
void jugar(int *n, int *lim, int j, int tj){
int b;
cout<<"------------------------------------------"<<endl;
cout<<"TURNO DEL JUGADOR "<<j<<"."<<endl;
cout<<"Actualmente hay "<<*n<<" pelotas en la caja."<<endl;
cout<<"Como maximo puede tomar "<<*lim<<" pelotas."<<endl;
do{
cout<<"Cuantas pelotas desea tomar? ";
if(tj==1){cin>>b;} else{b=maquina(*n, *lim); cout<<b<<endl;}
if(b>*lim){cout<<"ERROR! No puede sacar mas de "<<*lim<<"."<<endl;}
if(*n-b<0){cout<<"ERROR! Solo hay "<<*n<<" pelotas en la caja."<<endl;}
if(b==0){cout<<"ERROR! Debe sacar por lo menos 1 pelota."<<endl;}
}while(b>*lim || *n-b<0 || b==0);
*lim=2*b;
*n=*n-b;
if(*n==0){cout<<"\nEL JUGADOR "<<j<<" HA GANADO EL JUEGO!"<<endl;}
}
int maquina(int n, int lim){
bool sgmt=false;
if(n>13){n%=13; sgmt=true;}
if(lim>=n && !sgmt){return n;}
if(n>0 && n<7 && lim>=n){return n;}
if(n>8 && n<12 && n-8<=lim){return n-8;}
if(n>5 && n<8){return n-5;}
if(n==4){return 1;}
if(n>0 && n<3){return n;}
return 1;
}