Advertisement
alvaro_93

Load All

Jun 21st, 2015
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.52 KB | None | 0 0
  1. /*
  2.  * File:   main.c
  3.  * Author: Alvaro
  4.  *
  5.  * Created on 20 de junio de 2015, 10:55 AM
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #define MAX 30
  12. #define MAXCAD 20
  13.  
  14. /*
  15.  *
  16.  */
  17. typedef struct arma{
  18.     int atack;
  19.     int defense;
  20.     int speed;
  21. }TWpn;
  22.  
  23. typedef struct consumible{//son las pociones
  24.     int consumible;
  25. }TUse;
  26.  
  27.  
  28. typedef struct item{//es la clase a la que pertenecen las armas y los consumibles    
  29.     int id;
  30.     char name[30];
  31.     int peso;
  32.     TWpn *arma;
  33.     TUse *consumible;        
  34. }TItem;
  35.  
  36.  
  37.  
  38. typedef struct nodo{//nodo para la mochila (pila) y tambien nodo para la correa(lista doblemente enlazada)
  39.     struct nodo *sig;
  40.     struct nodo *ant;
  41.     TItem *elemento;  
  42.     int capacidad;
  43. }TNodo;
  44.  
  45. typedef struct Monstruo{//es el tipo mounstruo
  46.     char name[30];
  47.     int health;
  48.     int atack;
  49.     int defense;
  50.     int speed;
  51. }TMonst;
  52.  
  53. typedef struct cinturon{//es la correa que se usa como lista doblemente enlazada y usa punteros a nodos para el head y tail
  54.     int max;
  55.     int cant;
  56.     TNodo *head;
  57.     TNodo *tail;
  58. }TBelt;
  59.  
  60. typedef struct mochila{// es la mochila que se usa como pila y usa puntero a nodo para su cima
  61.     TNodo *cima;
  62. }TBag;
  63.  
  64. typedef struct hero{ //es el heroe y además de sus caracteristicas puede poseer una mochila y un cinturon
  65.     char name[30];
  66.     int health;
  67.     int healthMax;
  68.     int atack;
  69.     int defense;
  70.     int speed;    
  71.     TBag *mochila;
  72.     TBelt *cinturon;    
  73. }THero;
  74.  
  75. typedef struct objeto{ //Tipo objeto es la clase que alberga a los heroes mounstruos e items
  76.     int id;
  77.     THero *hero;
  78.     TMonst *monstruo;
  79.     TItem *item;  
  80.    
  81. }TObject;
  82.  
  83. void crearArma(TObject *A,char nombre[],int peso, int atack, int defense, int speed){
  84.     A->id = 3;
  85.     A->hero = NULL;
  86.     A->monstruo = NULL;
  87.     TItem *Item = malloc(sizeof(TItem));
  88.         Item->id = 1;
  89.         strcpy(Item->name,nombre);
  90.         Item->peso = peso;
  91.         Item->consumible = NULL;
  92.         TWpn *arma = malloc(sizeof(TWpn));
  93.         arma->atack = atack;
  94.         arma->defense = defense;
  95.         arma->speed = speed;
  96.         Item->arma = arma;
  97.     A->item =Item;
  98. }
  99.  
  100.  
  101. void crearConsumible(TObject *C,char nombre[],int peso,int cura){
  102.     C->id=3;//se le coloca el tipo de objeto que será en este caso es un item]
  103.     C->hero = NULL;//no es heroe
  104.     C->monstruo = NULL;//no es monstruo
  105.     TItem *Item = malloc(sizeof(TItem));//creo un nuevo item en la memorio
  106.         Item->id = 2;//al cual le asignare el tipo poción
  107.         strcpy(Item->name,nombre);//le pongo el nombre
  108.         Item->peso = peso;//y el peso que son campos para los items en general
  109.         Item->arma = NULL;//al campo que podria apuntar a un arma naturalmente lo coloco en 0
  110.         TUse *usable = malloc(sizeof(TUse));//creo un espacio en la memoria para una pocion que tiene nombre de usable
  111.             usable->consumible = cura;//esa subcatergoria de item tiene un campo llamado consumible y le doy
  112.                                       // el valor del parametro cura  
  113.         Item->consumible = usable;//finalmente hago que el campoco consumible(pocion) apunte al nuevo consumible creado
  114.     C->item = Item;// y que el campo puntero a item del objeto apunte al item creado al inicio
  115. }
  116.  
  117. void eliminarItem(TObject *I){//Este eliminarItem funciona tanto para el arma como para el consumible
  118.     if(I->id==3){
  119.         TItem *Item; TUse *User;
  120.         TWpn *weapon;
  121.         Item = I->item;
  122.         User = Item->consumible;
  123.         weapon = Item->arma;
  124.         free(weapon);
  125.         free(User);
  126.         free(Item);
  127.         I->item = NULL;
  128.         I->id = 0;
  129.     }    
  130. }
  131.  
  132.  
  133.  
  134. void crearMonstruo(TObject *M, char nombre[],int vida,int atacke, int defensa, int velocidad){
  135.     M->id = 2;
  136.     M->hero = NULL;
  137.     M->item = NULL;
  138.    
  139.     TMonst *monstruo = malloc(sizeof(TMonst));
  140.         strcpy(monstruo->name,nombre);
  141.         monstruo->health =vida;  // puede ser de 30 a 150
  142.         monstruo->atack = atacke; // de 50 a 70
  143.         monstruo->defense = defensa; // 20 a 80
  144.         monstruo->speed = velocidad; // 10 a 30
  145.    
  146.     M->monstruo = monstruo;
  147.    
  148. }
  149.  
  150. void eliminarMonstruo(TObject *M){
  151.     if(M->id==2){
  152.         TMonst *monstruo;
  153.         monstruo = M->monstruo;
  154.         free(monstruo);
  155.         M->monstruo = NULL;
  156.         M->id = 0;        
  157.     }
  158. }
  159.  
  160. ///////////////////////// Funciones de Mochilas ////////////////////
  161. void crearMochila(TBag *M){
  162.     M->cima=NULL;    
  163. }
  164.  
  165. int esMochilaVacia(TBag *M){
  166.     return (M->cima == NULL);
  167. }
  168.  
  169. void apilarItem(TBag *M, TItem *Item){//Esta funcion es solo para mochila
  170.     TNodo *neoNodo = malloc(sizeof(TNodo));
  171.     neoNodo->elemento = Item;
  172.     neoNodo->capacidad = 100; //en la mochila no hay capacidad de peso
  173.     neoNodo->ant = NULL; // no se usa
  174.     neoNodo->sig = M->cima;
  175.     M->cima = neoNodo;
  176. }
  177.  
  178.  
  179. TItem* desapilarItem(TBag *M){ //Retira los objetos de la mochila y devuelve un puntero al item que acabas de sacar la mochila
  180.     TItem *Item;
  181.     TNodo *ptrNodo;
  182.     if(!esMochilaVacia(M)){
  183.         ptrNodo = M->cima;
  184.         Item = ptrNodo->elemento;
  185.         M->cima = ptrNodo->sig;
  186.         free(ptrNodo);
  187.         return Item;
  188.     }
  189.     return NULL;
  190. }
  191.  
  192. void finalizarMochila(TBag *M){
  193.   while (!esMochilaVacia(M)){
  194.       desapilarItem(M);
  195.   }  
  196. }
  197. ////////////////////////Funciones de cinturon///////////////////
  198. void crearNodos(TBelt *B){//crea nodos necesarios para el cinturon
  199.     int i;
  200.     for(i=1;i <= B->max;i++){
  201.         TNodo *neoNodo = malloc(sizeof(TNodo));
  202.         neoNodo->elemento = NULL;
  203.         neoNodo->capacidad = rand() % 11 + 10;///// el peso tendra valor aleatorio entre 10 y 20
  204.         neoNodo->ant = NULL;
  205.         neoNodo->sig = NULL;
  206.         if (i==1){
  207.             B->head = neoNodo;
  208.             B->tail = neoNodo;
  209.         }
  210.         else {
  211.             B->tail->sig = neoNodo;
  212.             neoNodo->ant = B->tail;
  213.             B->tail = neoNodo;
  214.         }        
  215.            
  216.     }
  217. } //creo todos los nodos que deberá tener el cinturon con su capacidad aleatoria
  218.  
  219.  
  220. void eliminarNodo(TBelt *B){ //eliminando nodos de la correa
  221.     int i;
  222.     for(i=B->max;i>0;(i--)){
  223.         TNodo *ptrNodo;
  224.         ptrNodo = B->tail;
  225.         B->tail = B->tail->ant;
  226.         free(ptrNodo);
  227.     }
  228. }
  229.  
  230. void crearCinturon(TBelt *B){
  231.    
  232.     B->cant= 0;
  233.     B->max = rand() % 8 + 3 ;
  234.     B->head= NULL;
  235.     B->tail= NULL;
  236.     crearNodos(B); // verificar punteros
  237. };
  238.  
  239. void finalizarCinturon(TBelt *B){    
  240.     eliminarNodo(B);  //verificar puntero too  
  241.     B->cant= 0;
  242.     B->max = 0;
  243.     B->head= NULL;
  244.     B->tail= NULL;
  245. }
  246.  
  247. int agregarCinturon(TBelt *B,TItem *Item,int pos){ //devuelve 1 si es un exito o cero si no es posible agregar
  248.    
  249.     if(pos > B->max) return 0;
  250.     TNodo *ptrNodo;
  251.     ptrNodo = B->head; // ir hasta la posicion deseada
  252.     int i;
  253.     for(i = pos;i > 1;(i--)){
  254.         ptrNodo = ptrNodo->sig;
  255.     }
  256.     if((ptrNodo->capacidad < Item->peso) ||(ptrNodo->elemento != NULL) )
  257.         return 0; //si la capacidad del nodo es menor al peso o si el nodo esta lleno no se puede agregar
  258.     else{
  259.         ptrNodo->elemento = Item;
  260.         return 1;
  261.     }
  262. }
  263.  
  264. TItem *quitarCinturon(TBelt *B,int pos){
  265.     if(pos > B->max) return NULL;
  266.     TNodo *ptrNodo;
  267.     ptrNodo = B->head; // ir hasta la posicion deseada
  268.     int i;
  269.     for(i = pos;i > 1;(i--)){
  270.         ptrNodo = ptrNodo->sig;
  271.     }
  272.     if(ptrNodo->elemento == NULL) return NULL;
  273.     else{
  274.         TItem *ptrItem;
  275.         ptrItem = ptrNodo->elemento;
  276.         ptrNodo->elemento = NULL;
  277.         return(ptrItem);
  278.     }
  279.    
  280. } //saca un item del cinturon, dejando vacio un espacio y devuelve el item sacado
  281.  //si no se puede sacer ya esa por posicion mal dada o nodo vacio devuenve NULL
  282.  
  283.  
  284. void crearHeroe(TObject *H,char nombre[]){ //recibe el nombre del heroe
  285.     H->id = 1;
  286.     H->item = NULL;
  287.     H->monstruo = NULL;
  288.     THero *heroe= malloc(sizeof(THero));
  289.         strcpy(heroe-> name, nombre);
  290.         heroe->healthMax= 100;
  291.         heroe->health = 100;
  292.         heroe->atack = rand() % 11 + 30;  //Rand() trae un numero entre 200000 random
  293.         heroe->defense = rand() % 11 + 30;//para que saque del 0 al 10 se hace mod 11
  294.         heroe->speed = rand()% 11 + 10;
  295.         TBag *mochila;
  296.         TBelt *cinturon;
  297.         crearMochila(mochila); // estare pasando bien?
  298.         crearCinturon(cinturon); //
  299.         heroe->mochila = mochila;
  300.         heroe->cinturon = cinturon;
  301.        
  302.         H->hero = heroe;
  303. }
  304. void eliminarHeroe(TObject *H){
  305.    
  306.     if(H->id == 1){
  307.         THero *heroe;
  308.         heroe = H->hero;
  309.         finalizarMochila(heroe->mochila);
  310.         finalizarCinturon(heroe->cinturon);
  311.         free(heroe);
  312.         H->hero = NULL;
  313.         H->id = 0;
  314.     }
  315. }
  316.  
  317. /*
  318.  *                  PROCEDIMIENTOS DE ALVARO
  319. Estos procedimientos fueron creados por Alvaro, asi que no es perra de nadie
  320. */
  321.  
  322. void cargarMonstruosGen(){
  323.    
  324.     FILE* archivo;
  325.     TObject obj_Mon[MAX];//creo un arreglo de tipos de objeto
  326.     char name[30];//le asigno una capacidad maxima a name
  327.     int health,atack,defense,speed,i;
  328.     i=0;//inicializo contador
  329.    
  330.     archivo=fopen("monstruos.txt","r");//abro el archivo que usare
  331.     if (archivo!=NULL)
  332.         while (fscanf(archivo, "%s %d %d %d %d", name, &health,&atack,&defense,&speed) == 5){   //leo cada registro
  333.             crearMonstruo(&obj_Mon[i], name,health,atack, defense, speed);                      // uso el procedimiento creado por Neil
  334.             //notese que envio el elemtno objeto del arreglo con ampersan para que el procedimiento
  335.             //reciba un puntero a tipo objeto
  336.             i++;//incremento el contador para seguir recorriendo el arreglo
  337.                  
  338.         }    
  339.            
  340.    
  341.    
  342. }
  343.  
  344. void cargarPocionesGen(){
  345.     FILE* archivo;
  346.     TObject obj_Item[MAX];//creo un arreglo de tipos de objeto
  347.     char name[30];//le asigno una capacidad maxima a name
  348.     int peso,consumible,i;
  349.     i=0;//inicializo contador
  350.    
  351.     archivo=fopen("pociones.txt","r");//abro el archivo que usare
  352.     if (archivo!=NULL)
  353.         while (fscanf(archivo, "%s %d %d", name, &peso,&consumible) == 3){//leo cada registro
  354.             crearConsumible(&obj_Item[i],name,peso,consumible);// uso el procedimiento creado por Neil
  355.             //notese que envio el elemtno objeto del arreglo con ampersan para que el procedimiento
  356.             //reciba un puntero a tipo objeto
  357.             i++;//incremento el contador para seguir recorriendo el arreglo
  358.                  
  359.         }    
  360. }
  361.  
  362. void cargarArmasGen(){
  363.    
  364.     FILE* archivo;
  365.     TObject obj_Item[MAX];  //creo un arreglo de tipos de objeto
  366.     char name[30];          //le asigno una capacidad maxima a name
  367.     int peso,atack,defense,speed,i;
  368.     i=0;//inicializo contador
  369.    
  370.     archivo=fopen("armas.txt","r");//abro el archivo que usare
  371.     if (archivo!=NULL)
  372.         while (fscanf(archivo, "%s %d %d %d %d", name, &peso,&atack,&defense,&speed) == 5){//leo cada registro
  373.             crearArma(&obj_Item[i],name,peso,atack,defense,speed);
  374. /*
  375.             uso el procedimiento creado por Neil
  376.             notese que envio el elemetno objeto del arreglo con ampersan para que el procedimiento
  377.             reciba un puntero a tipo objeto
  378. */
  379.             i++;//incremento el contador para seguir recorriendo el arreglo
  380.                  
  381.         }        
  382. }    
  383.  
  384. int main(int argc, char** argv){
  385.    
  386.  
  387.  
  388.    
  389.     cargarMonstruosGen();
  390.     cargarPocionesGen();
  391.     cargarArmasGen();
  392.  
  393.     return (EXIT_SUCCESS);
  394. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement