Conéctate para seguir esto  
Seguidores 0
Pacman

En Desarrollo
Juego batallas pokemon (no grafico, sino modo terminal) en C

7 posts en este tema

Hola a tod@s, hoy me he puesto con C y para aprender he hecho un programilla que simula batallas pokemon (a lo cutre) en C.

Para modificar los pokemons hay que editar las variables que estan comentadas en el codigo fuente, puedes editar, nombre de pokemon, nombre de ataques de cada pokemon, puntos de daño, puntos de poder, pociones de cada pokemon etc... lo he testeado bastante y funcionar funciona bien, aunque como he dicho, es bastante cutre, y la experiencia no es la misma que cuando juegas a pokemon XD.

 

Bueno dejo aquí el código fuente:

/*
 * Copyright (C) 2015 Francisco Domínguez Lerma
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>

void ayuda(void);
void atacar();
void pociones();
void informacion();
int azar(int);
void ganador();

typedef struct {
 
	char nombre[25];
	int pv;
	char *ataque[4];
	int pd[4];
	int pp[4];
	int pociones;
 
	} pokemon;
 
	pokemon pokemon1;
	pokemon pokemon2;
	int turno=1;
 
int main() {
	//rellenamos la informacion de cada pokemon(estos datos son modificables, adaptalos para crear batallas personalizadas)	
	//Nombre del pokemon
	strcpy(pokemon1.nombre, "pokemon1");
	//vida del pokemon
	pokemon1.pv=100;
	//nombre de los 4 ataques del pokemon
	pokemon1.ataque[0]="ataque1";pokemon1.ataque[1]="ataque2";pokemon1.ataque[2]="ataque3";pokemon1.ataque[3]="ataque4";
	//puntos de daño, el valor maximo de daño que causa cada ataque
  	pokemon1.pd[0]=15;pokemon1.pd[1]=32;pokemon1.pd[2]=53;pokemon1.pd[3]=21;
	//puntos de poder, las veces que podemos usar x ataque en una batalla
  	pokemon1.pp[0]=2;pokemon1.pp[1]=30;pokemon1.pp[2]=10;pokemon1.pp[3]=40;
	//numero de pociones que tiene el pokemon
	pokemon1.pociones=2;
 	//Igual que todo lo anterior pero con el segundo pokemon
	strcpy(pokemon2.nombre, "pokemon2");
	pokemon2.pv=100;
	pokemon2.ataque[0]="ataque1";pokemon2.ataque[1]="ataque2";pokemon2.ataque[2]="ataque3";pokemon2.ataque[3]="ataque4";
  	pokemon2.pd[0]=24;pokemon2.pd[1]=38;pokemon2.pd[2]=73;pokemon2.pd[3]=45;
  	pokemon2.pp[0]=25;pokemon2.pp[1]=30;pokemon2.pp[2]=70;pokemon2.pp[3]=15;
	pokemon2.pociones=3;
 
	char comando;
 
	ayuda();
 
	while (1) {
 
		if (turno==1)
			printf("[%s]", pokemon1.nombre);
		else
			printf("[%s]", pokemon2.nombre);
 
 
 
		printf("Introduce la orden...");
		comando = fgetc(stdin);
		while(fgetc(stdin) != '\n');
		switch ( comando ) {
 
			case 'h':
				ayuda();
				break;;
			case 'a':
				atacar();
				break;;
			case 'p':
				pociones();
				break;;
			case 'i':
				informacion();
				break;;
			case 'e':
				printf("Se cancelo la partida\n");
				exit(0);
			default:
				ayuda();
 
		}
	}
}
 
void ayuda() {
 
	printf("h -> Despliega esta ayuda\n");
	printf("a -> Ataca al pokemon enemigo\n");
	printf("p -> Cura a tu pokemon si tienes pociones\n");
 	printf("i -> Da información sobre tu pokemon, ataques, pociones y el pv enemigo\n");
	printf("e -> Cancelar la partida\n");
 
 
	}

void atacar() {
 
int dano;
char ataque;

printf("Elige el ataque a usar [1-4]\n");

ataque=fgetc(stdin);
while(fgetc(stdin) != '\n');

if (turno==1) {

		switch ( ataque ) {
 
			case '1':
				if (pokemon1.pp[0]==0){printf("no te quedan pp\n"); turno=2; break;;}
				dano=azar(pokemon1.pd[0]);
				printf("%s uso %s\n", pokemon1.nombre, pokemon1.ataque[0]);
				pokemon1.pp[0]--;
				printf("Le has quitado %d puntos de vida\n", dano);
				pokemon2.pv-=dano;
					if (pokemon2.pv<=0)
						ganador(); 
				turno=2;
				break;;
			case '2':
				if (pokemon1.pp[1]==0){printf("no te quedan pp\n"); turno=2; break;;}
				dano=azar(pokemon1.pd[1]);
				printf("%s uso %s\n", pokemon1.nombre, pokemon1.ataque[1]);
				pokemon1.pp[1]--;
				printf("Le has quitado %d puntos de vida\n", dano);
				pokemon2.pv-=dano;
					if (pokemon2.pv<=0)
						ganador(); 
				turno=2;
				break;;
			case '3':
				if (pokemon1.pp[2]==0){printf("no te quedan pp\n"); turno=2; break;;}
				dano=azar(pokemon1.pd[2]);
				printf("%s uso %s\n", pokemon1.nombre, pokemon1.ataque[2]);
				pokemon1.pp[2]--;
				printf("Le has quitado %d puntos de vida\n", dano);
				pokemon2.pv-=dano;
					if (pokemon2.pv<=0)
						ganador(); 
				turno=2;
				break;;
			case '4':
				if (pokemon1.pp[3]==0){printf("no te quedan pp\n"); turno=2; break;;}
				dano=azar(pokemon1.pd[3]);
				printf("%s uso %s\n", pokemon1.nombre, pokemon1.ataque[3]);
				pokemon1.pp[3]--;
				printf("Le has quitado %d puntos de vida\n", dano);
				pokemon2.pv-=dano;
					if (pokemon2.pv<=0)
						ganador(); 
				turno=2;
				break;;
			default:
				printf("no has elegido ninguna opcion, así que pierdes el turno\n");
				turno=2;
				break;;
 
		}

	}else{

		switch ( ataque ) {
 
			case '1':
				if (pokemon2.pp[0]==0){printf("no te quedan pp\n"); turno=1; break;;}
				dano=azar(pokemon2.pd[0]);
				printf("%s uso %s\n", pokemon2.nombre, pokemon2.ataque[0]);
				pokemon2.pp[0]--;
				printf("Le has quitado %d puntos de vida\n", dano);
				pokemon1.pv-=dano;
					if (pokemon1.pv<=0)
						ganador(); 
				turno=1;
				break;;
			case '2':
				if (pokemon2.pp[1]==0){printf("no te quedan pp\n"); turno=1; break;;}
				dano=azar(pokemon2.pd[1]);
				printf("%s uso %s\n", pokemon2.nombre, pokemon2.ataque[1]);
				pokemon2.pp[1]--;
				printf("Le has quitado %d puntos de vida\n", dano);
				pokemon1.pv-=dano;
					if (pokemon1.pv<=0)
						ganador(); 
				turno=1;
				break;;
			case '3':
				if (pokemon2.pp[2]==0){printf("no te quedan pp\n"); turno=1; break;;}
				dano=azar(pokemon2.pd[2]);
				printf("%s uso %s\n", pokemon2.nombre, pokemon2.ataque[2]);
				pokemon2.pp[2]--;
				printf("Le has quitado %d puntos de vida\n", dano);
				pokemon1.pv-=dano;
					if (pokemon1.pv<=0)
						ganador(); 
				turno=1;
				break;;
			case '4':
				if (pokemon2.pp[3]==0){printf("no te quedan pp\n"); turno=1; break;;}
				dano=azar(pokemon2.pd[3]);
				printf("%s uso %s\n", pokemon2.nombre, pokemon2.ataque[3]);
				pokemon2.pp[3]--;
				printf("Le has quitado %d puntos de vida\n", dano);
				pokemon1.pv-=dano;
					if (pokemon1.pv<=0)
						ganador(); 
				turno=1;
				break;;
		}

	}
 
 
}
 
void pociones() {
 
  if (turno==1){

	turno=2;
	if(pokemon1.pociones==0) {

	printf("no tienes pociones, así que pierdes el turno\n");

	} else {

		pokemon1.pociones-=1;
		pokemon1.pv+=60;
		if (pokemon1.pv>100) pokemon1.pv=100;
		printf("Poción activa, ahora tu pv es de %d\n", pokemon1.pv);

		}


  } else {

	turno=1;
	if(pokemon2.pociones==0) {

	printf("no tienes pociones, así que pierdes el turno\n");

	} else {

		pokemon2.pociones-=1;
		pokemon2.pv+=60;
		if (pokemon2.pv>100) pokemon2.pv=100;
		printf("Poción activa, ahora tu pv es de %d\n", pokemon2.pv);

		}


	}
 
}

void informacion() {

	
	if (turno==1){
		printf("**********\n");
		printf("%s\n", pokemon1.nombre);
		printf("pv:%d\n", pokemon1.pv);
		printf("\t-----ATAQUES-----\n");
		printf("\t%s pp:%d\n", pokemon1.ataque[0], pokemon1.pp[0]);
		printf("\t%s pp:%d\n", pokemon1.ataque[1], pokemon1.pp[1]);
		printf("\t%s pp:%d\n", pokemon1.ataque[2], pokemon1.pp[2]);
		printf("\t%s pp:%d\n", pokemon1.ataque[3], pokemon1.pp[3]);
		printf("\t-----------------\n");
		printf("Numero de pociones:%d\n", pokemon1.pociones);
		printf("pv enemigo:%d\n", pokemon2.pv);
		printf("**********\n");
}
	if (turno==2){
		printf("**********\n");
		printf("%s\n", pokemon2.nombre);
		printf("pv:%d\n", pokemon2.pv);
		printf("\t-----ATAQUES-----\n");
		printf("\t%s pp:%d\n", pokemon2.ataque[0], pokemon2.pp[0]);
		printf("\t%s pp:%d\n", pokemon2.ataque[1], pokemon2.pp[1]);
		printf("\t%s pp:%d\n", pokemon2.ataque[2], pokemon2.pp[2]);
		printf("\t%s pp:%d\n", pokemon2.ataque[3], pokemon2.pp[3]);
		printf("\t-----------------\n");
		printf("Numero de pociones:%d\n", pokemon2.pociones);
		printf("pv enemigo:%d\n", pokemon1.pv);
		printf("**********\n");

}

}

int azar(int maximo){
srand(time(NULL));
return rand() % (maximo+1);
} 

void ganador() {

if (turno==1) {
	printf("--------------------\n");
	printf("%s ha ganado la partida\n", pokemon1.nombre);
	printf("--------------------\n");
	exit(0);

} else {
	printf("--------------------\n");
	printf("%s ha ganado la partida\n", pokemon2.nombre);
	printf("--------------------\n");
	exit(0);

	}
}

Como habreis visto, esta licenciado bajo GPL3, así que haced lo que querais con el código mientras libereis los cambios claro, es más, me gustaría mucho que alguien lo mejorara, me gustaría verlo avanzar. Las instruciones de como se usa (ya que funciona con comandos simples) te las dice el juego nada más ejecutarlo.

 

Para compilarlo simplemente:

 

gcc pokemon.c -o pokemon

 

y para ejecutarlo, le dais permisos y:

 

./pokemon

 

Espero que os guste y sobretodo que podais aprender algo de C leyendo mi código.

 

Saludos.

jsbsan, elmoyer, Jaska y 6 otros le gusta esto

Compartir este post


Enlace al post
Compartir en otros sitios

Muy bueno! Como me gusta el switch :P :P yo pondría al principio un "menú" que permita elegir entre distintos pokemon hasta llegar a los 6 que se podía llevar(así la gente se quita de tener que descomentar y modificar lo que has escrito. Ya que das una lista con 10 por ejemplo y de ahí escogen 6). Luego también sería interesante que después de cada ataque que realizas el pokemon contrario también nos ataque(usando el método random dentro de sus ataques posibles).

 

Pero esta muy bien!

Rohlling, Pacman, Fransis y 3 otros le gusta esto

Compartir este post


Enlace al post
Compartir en otros sitios

Gracias a tod@s :)

 

Muy bueno! Como me gusta el switch :P :P yo pondría al principio un "menú" que permita elegir entre distintos pokemon hasta llegar a los 6 que se podía llevar(así la gente se quita de tener que descomentar y modificar lo que has escrito. Ya que das una lista con 10 por ejemplo y de ahí escogen 6). Luego también sería interesante que después de cada ataque que realizas el pokemon contrario también nos ataque(usando el método random dentro de sus ataques posibles).

 

Pero esta muy bien!

 

Es buena idea, yo lo que había pensado era, en  vez de meter pokemons a pelo en el código, separar todos esos datos en XMLs, así hariamos el juego más modular, el problema es que no he encontrado en google forma de extraer datos del XML para C puro, solo he encontrado para C++ y C# (sobre todo este último), lo de que nos ataque el otro pokemon, bueno es que yo esto lo he hecho pensando que es multijugador XD, pero si se puede hacer un juego single-player muy facilmente.

 

Saludos!!

Editado por Pacman
elmoyer, Fransis, dmrx921 y 3 otros le gusta esto

Compartir este post


Enlace al post
Compartir en otros sitios

Registra una cuenta o conéctate para comentar

Debes ser un miembro de la comunidad para dejar un comentario

Crear una cuenta

Regístrate en nuestra comunidad. ¡Es fácil!


Registrar una cuenta nueva

Iniciar Sesión

¿Ya tienes cuenta? Conéctate aquí.


Iniciar Sesión
Conéctate para seguir esto  
Seguidores 0