buenas estoy haciendo un juego de rol donde una de las condiciones es que no se pueda utilizar 2 poderes iguales por el mismo jugador, y no logro dar con el code adecuado
aqui una muetra de lo que hice pero esta mal debido a que el valor que ingrese lo almacena pero despues en el for caigo en decir que esta repetido aunque en realidad solo esta en una sola posicion
ayudenme gracias
scanf("%d",&res2);
poderj1[indice]=res2;
for(int cc=0;cc<=res2;cc++)
{
if(poderj1[cc]==res2)
{
printf("\n no puedes utilizar dos poderes iguales!!!\n");
getch();
}
}
indice=indice+1;
has un contador que inicie en 0 que se incremente uno cuando entra al if.
luego con otro if compruebas el contador y si es mayor a uno si entro al if mas de una vez
entonces esta repetido
Una solución posible seria hacer un vector de igual tamaño que el vector de los poderes y ir guardando ahí los poderes usados, cada vez que el usuario elige un poder puedes comprobar si está repetido recorriendo el vector de poderes usados.
Algo así:
#include <stdio.h>
int main(void) {
int poderes[100];
int usados[100];
int i,poderElegido,x;
for(i=0; i<100;i++) //Lleno el array de poderes del 0 al 99
poderes[i] = i;
for(i=0;i<100;i++) //lleno el array de usados de '-1'
usados[i] = -1;
i = 0;
while(i<5) { //Pido un poder y lo voy guardando en el array 'usados'
printf("Elige un poder: ");
scanf("%d",&poderElegido);
for(x=0;x<100;x++) {
if(usados[x] == poderElegido) {
printf("Ya has elegido este poder");
i = 5; //salimos del bucle si ya hemos usado ese poder
}
}
usados[i] = poderElegido;
i++;
}
return 0;
}
Intuyo que estás usando C++... comprobar valores duplicados es tan sencillo como:
opción 1:
std::vector< int > poderesUsados;
int poder;
// Comprobar si ya está usado el poder
// std::find esta en el include "algorithm"
auto it = std::find( poderesUsados.begin( ), poderesUsados.end( ), poder );
if ( it == poderesUsados.end( ) )
{
// No se ha usado el poder todavía
// marcamos el poder como usado
poderesUsados.push_back( poder );
}
opción 2:
std::set< int > poderesUsados;
// da igual que usemos el mismo poder 20 veces... al final solo quedará un solo uso por cada poder:
poderesUsados.insert( 1 );
poderesUsados.insert( 2 );
poderesUsados.insert( 1 );
poderesUsados.insert( 1 );
// Imprimira: 1 2
for( auto it = poderesUsados.begin( ); it != poderesUsados.end( ); ++it )
cout << *it << " ";
Opción 3:
Hay infinitas formas, yo te he mostrado dos diferentes.
Cita de: Risketo en 25 Junio 2014, 21:54 PM
#include <stdio.h>
int main(void) {
int poderes[100];
int usados[100];
int i,poderElegido,x;
for(i=0; i<100;i++) //Lleno el array de poderes del 0 al 99
poderes[i] = i;
for(i=0;i<100;i++) //lleno el array de usados de '-1'
usados[i] = -1;
i = 0;
while(i<5) { //Pido un poder y lo voy guardando en el array 'usados'
printf("Elige un poder: ");
scanf("%d",&poderElegido);
for(x=0;x<100;x++) {
if(usados[x] == poderElegido) {
printf("Ya has elegido este poder");
i = 5; //salimos del bucle si ya hemos usado ese poder
}
}
usados[i] = poderElegido;
i++;
}
return 0;
}
Puedes quitar todos los bucles for que has puesto, y si te fijas, poderes[100], no lo utilizas para nada, asi que malgastas memoria, este codigo es mas simple#include <stdio.h>
int main()
{
int usados[100] = {0};
int i=0, poderElegido=0;
while(i<5)
{
//Pido un poder y lo voy guardando en el array 'usados'
printf("Elige un poder: ");
scanf("%d",&poderElegido);
if(poderElegido>=0 && poderElegido<100)
{
if(usados[poderElegido] != 0)
{
printf("Ya has elegido este poder");
i = 5; //salimos del bucle si ya hemos usado ese poder
}
else
{
usados[poderElegido] = 1;
}
i++;
}
else
{
printf("Poder invalido\n");
}
}
return 0;
}
Saludos