Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * File: main.c
- * Author: owner
- *
- * Created on 12 de junio de 2015, 12:52 AM
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include<conio.h>
- #include <windows.h>
- #include "juego.h"
- #define N 38
- #define E 20
- #define Factor 2//factor para calcular la cantidad de enemigos
- #define MAX 30
- /*
- * PROCEDIMIENTOS DE ALVARO
- Estos procedimientos fueron creados por Alvaro, asi que no es perra de nadie
- */
- void cargarMonstruosGen(TObject arrMonst [MAX]){
- FILE* archivo;
- char name[30];//le asigno una capacidad maxima a name
- int health,atack,defense,speed,i;
- i=0;//inicializo contador
- archivo=fopen("monstruos.txt","r");//abro el archivo que usare
- if (archivo!=NULL)
- while (fscanf(archivo, "%s %d %d %d %d", name, &health,&atack,&defense,&speed) == 5){ //leo cada registro
- crearMonstruo(&arrMonst[i], name,health,atack, defense, speed); // uso el procedimiento creado por Neil
- //notese que envio el elemtno objeto del arreglo con ampersan para que el procedimiento
- //reciba un puntero a tipo objeto
- i++;//incremento el contador para seguir recorriendo el arreglo
- }
- }
- void cargarPocionesGen(TObject arrPociones[MAX]){
- FILE* archivo;
- char name[30];//le asigno una capacidad maxima a name
- int peso,consumible,i;
- i=0;//inicializo contador
- archivo=fopen("pociones.txt","r");//abro el archivo que usare
- if (archivo!=NULL)
- while (fscanf(archivo, "%s %d %d", name, &peso,&consumible) == 3){//leo cada registro
- crearConsumible(&arrPociones[i],name,peso,consumible);// uso el procedimiento creado por Neil
- //notese que envio el elemtno objeto del arreglo con ampersan para que el procedimiento
- //reciba un puntero a tipo objeto
- i++;//incremento el contador para seguir recorriendo el arreglo
- }
- }
- void cargarArmasGen(TObject arrArmas[MAX]){
- FILE* archivo;
- char name[30]; //le asigno una capacidad maxima a name
- int peso,atack,defense,speed,i;
- i=0;//inicializo contador
- archivo=fopen("armas.txt","r");//abro el archivo que usare
- if (archivo!=NULL)
- while (fscanf(archivo, "%s %d %d %d %d", name, &peso,&atack,&defense,&speed) == 5){//leo cada registro
- crearArma(&arrArmas[i],name,peso,atack,defense,speed);
- /*
- uso el procedimiento creado por Neil
- notese que envio el elemetno objeto del arreglo con ampersan para que el procedimiento
- reciba un puntero a tipo objeto
- */
- i++;//incremento el contador para seguir recorriendo el arreglo
- }
- }
- /////////////////////////////FIN DE PROCEDIMIENTOS DE ALVARO/////////////////////////////////
- void gotoxy(int x,int y){
- HANDLE hcon;
- hcon = GetStdHandle(STD_OUTPUT_HANDLE);
- COORD dwPos;
- dwPos.X = x;
- dwPos.Y= y;
- SetConsoleCursorPosition(hcon,dwPos);
- }
- void actualizarItem(TObject *hero){ //actualiza todos los items (armas) que el heroe tiene equipado
- TNodo *ptrnodo; //degrada las armas para que se vuelvan inservibles
- ptrnodo = hero->hero->cinturon->head; //apunta al primer nodo del cinturon
- int i;
- for(i = 1;i <= hero->hero->cinturon->max; i++){
- if(ptrnodo->elemento != NULL && ptrnodo->elemento->id == 1){ //solo cuando es un arma y el elemnto no es null
- if(ptrnodo->elemento->arma->atack > 0){
- ptrnodo->elemento->arma->atack = ptrnodo->elemento->arma->atack -3;
- } else ptrnodo->elemento->arma->atack = 0;
- if(ptrnodo->elemento->arma->defense > 0){
- ptrnodo->elemento->arma->defense = ptrnodo->elemento->arma->defense -3;
- } else ptrnodo->elemento->arma->defense = 0;
- if(ptrnodo->elemento->arma->speed > 0){
- ptrnodo->elemento->arma->speed = ptrnodo->elemento->arma->speed -3;
- } else ptrnodo->elemento->arma->speed = 0;
- ptrnodo = ptrnodo->sig; //avanza al siguiente nodo
- }else ptrnodo = ptrnodo->sig;
- }
- }
- void actualizarHeroe(TObject *hero){ //segun lo que lleve el heroe se actualiza los stats del heroe
- TNodo *ptrnodo;
- ptrnodo = hero->hero->cinturon->head; //apunta al primer nodo del cinturon
- int i;
- for(i = 1;i <= hero->hero->cinturon->max; i++){
- if(ptrnodo->elemento != NULL && ptrnodo->elemento->id == 1){ //solo cuando es un arma y el elemnto no es null
- hero->hero->atack = hero->hero->atack + ptrnodo->elemento->arma->atack;
- hero->hero->defense = hero->hero->defense + ptrnodo->elemento->arma->defense;
- hero->hero->speed = hero->hero->speed + ptrnodo->elemento->arma->speed;
- ptrnodo = ptrnodo->sig; //avanza al siguiente nodo
- } else ptrnodo = ptrnodo->sig;
- }
- }
- void refrescarHeroe(TObject *hero){ //se actulaiza el heroe a su condicion original sin items
- TNodo *ptrnodo;
- ptrnodo = hero->hero->cinturon->head; //apunta al primer nodo del cinturon
- int i;
- for(i = 1;i <= hero->hero->cinturon->max; i++){
- if(ptrnodo->elemento != NULL && ptrnodo->elemento->id == 1){ //solo cuando es un arma y el elemnto no es null
- hero->hero->atack = hero->hero->atack - ptrnodo->elemento->arma->atack;
- hero->hero->defense = hero->hero->defense - ptrnodo->elemento->arma->defense;
- hero->hero->speed = hero->hero->speed - ptrnodo->elemento->arma->speed;
- ptrnodo = ptrnodo->sig; //avanza al siguiente nodo
- } else ptrnodo = ptrnodo->sig;
- }
- } //hace lo contrario a actualizarHeroe
- void usarPocion (TObject *hero, TItem *pocion){ //usa la pocion y destruye el item, recibe un item sacado con desapilar item o quitarcinturon
- if (pocion->id == 2){ //verifica si de verdad es una pocion
- hero->hero->health = hero->hero->health + pocion->consumible->consumible;
- if(hero->hero->health > hero->hero->healthMax) hero->hero->health = hero->hero->healthMax;
- TObject *poc = malloc(sizeof(TObject));
- poc->item = pocion;
- eliminarItem(poc); //esto fue estupidamente redundante
- free(poc);
- }
- }
- void moverHeroe(int i,int j){//estos deben ser pasado como punteros a enteros
- //cambio de movimiento
- //cabeza
- gotoxy(i,j);
- printf("%c",254);
- //brazos
- gotoxy(i-1,j+1);
- printf("%c",200);
- gotoxy(i,j+1);
- printf("%c",177);
- gotoxy(i+1,j+1);
- printf("%c",188);
- //piernas
- gotoxy(i,j+2);
- printf("%c",186);
- //elimianr el anterior
- i=i-4;
- //cabeza
- gotoxy(i,j);
- printf(" ");
- //brazos
- gotoxy(i-1,j+1);
- printf(" ");
- gotoxy(i,j+1);
- printf(" ");
- gotoxy(i+1,j+1);
- printf(" ");
- //piernas
- gotoxy(i,j+2);
- printf(" ");
- }
- void pintar(char nombre[],int nivel,int *animacion){
- int i;
- gotoxy(0,0);
- printf(" JUEGO DE AVENTURA \n");
- printf("Nombre del Jugador: %s",nombre);
- printf(" Nivel :%d\n",nivel);
- //Lineas horizontales
- for (i=2;i<78;i++){
- gotoxy(i,3);
- printf("%c",205);
- gotoxy(i,23);
- printf("%c",205);
- }
- //Lineas Verticales
- for (i=4;i<23;i++){
- gotoxy(2,i);
- printf("%c",186);
- gotoxy(77,i);
- printf("%c",186);
- }
- //Esquinas
- gotoxy(2,3); printf("%c",201);
- gotoxy(2,23); printf("%c",200);
- gotoxy(77,3); printf("%c",187);
- gotoxy(77,23); printf("%c",188);
- //Pasto
- for (i=3;i<77;i++){
- gotoxy(i,21);
- printf("%c",176);
- gotoxy(i,22);
- printf("%c",177);
- }
- //Nubes
- int n; i=7;
- for (n=20;n<26;n++){
- gotoxy(n,i);
- printf("%c",64);
- gotoxy(n,i+1);
- printf("%c",64);
- gotoxy(n,i+2);
- printf("%c",64);
- }
- for (n=20+20;n<26+20;n++){
- gotoxy(n,i);
- printf("%c",64);
- gotoxy(n,i+1);
- printf("%c",64);
- gotoxy(n,i+2);
- printf("%c",64);
- }
- //arbol
- int k,a;
- if (*animacion==0){
- for (k=60;k<67;k++){
- gotoxy(k,15);
- printf("%c",177);
- gotoxy(k,16);
- printf("%c",177);
- gotoxy(k,17);
- printf("%c",177);
- if (k==62 || k==63 || k==64){
- gotoxy(k,18);
- printf("%c",186);
- gotoxy(k,19);
- printf("%c",186);
- gotoxy(k,20);
- printf("%c",186);
- }
- }
- }else if ((*animacion)<3){
- srand(time(NULL));//randomize
- int arbol=176,tronco=179;
- for(a=0;a<=(*animacion);a++){
- for (k=60-a*10;k<67-a*10;k++){
- gotoxy(k,15);
- printf("%c",arbol);//178,177,176
- gotoxy(k,16);
- printf("%c",arbol);
- gotoxy(k,17);
- printf("%c",arbol);
- if (k==(62-a*10) || k==(63-a*10) || k==(64-a*10)){
- gotoxy(k,18);
- printf("%c",tronco);//186,240,169,179
- gotoxy(k,19);
- printf("%c",tronco);
- gotoxy(k,20);
- printf("%c",tronco);
- }
- }
- int t[4]={240,169,179,186};
- int r=rand() % 4;
- tronco=t[r];
- if (arbol==178 ) arbol=176;
- else arbol++;
- }
- /*if (*animacion!=0)
- (*animacion)=0;*/
- } else if ((*animacion)>=3 && (*animacion)<5 ){
- int t=16,p,b=30,g;
- //cueva
- for (g=0;g<2;g++){
- int cont=1;
- gotoxy(b,t);
- printf("%c",176);
- for (p=t;p<22;p++){
- gotoxy(b-cont,p);
- printf("%c",176);
- gotoxy(b+cont,p);
- printf("%c",176);
- cont++;
- }
- b=b+40;
- }
- //arbol
- for (k=50;k<57;k++){
- gotoxy(k,15);
- printf("%c",177);
- gotoxy(k,16);
- printf("%c",177);
- gotoxy(k,17);
- printf("%c",177);
- if (k==52 || k==53 || k==54){
- gotoxy(k,18);
- printf("%c",186);
- gotoxy(k,19);
- printf("%c",186);
- gotoxy(k,20);
- printf("%c",186);
- }
- }
- }
- else if (*animacion==5){
- (*animacion)=0;
- //aves
- //203,40,41
- gotoxy (60,6);
- printf("%c",157);
- gotoxy(54,10);
- printf("%c",157);
- gotoxy(68,8);
- printf("%c",157);
- gotoxy(60,15);
- printf("%c",157);
- gotoxy(60,12);
- printf("%c",157);
- gotoxy(55,14);
- printf("%c",157);
- gotoxy(65,13);
- printf("%c",157);
- }
- }
- void eliminarMapa(TObject mapa[E]){
- int i;
- for (i=0;i<E;i++){
- free(mapa[i].hero);
- free(mapa[i].item);
- free(mapa[i].monstruo);
- }
- }
- ///colocarObjeto soporta cualquier arreglo por lo que se tiene que colocar bien los arreglos correspondiente al objeto
- int colocarObjeto(TObject *objeto,int nivel,TObject arr[]){ /// desde el arreglo cargado desde
- //los archivos se seleccinan aleatoriamente dependiendo el nivel
- int lmtInf, lmtSup ;
- int random;
- if(objeto->id != 0) return 0; //esta lleno el espacio y no se puede agregar nada
- lmtInf = (nivel-2)*3;
- if (lmtInf < 0) {
- lmtInf = 0;
- lmtSup = 2;
- } else lmtSup = lmtInf + 5; /// se selecciona en nivel 1 del 0 al 3, nivel 2 del 0 a 5
- // nivel 3 del 3 al 8 , nivel 4 del 6 a 11 , nivel 5 del 9 a 14
- random = lmtInf + (rand() % (lmtSup - lmtInf));
- objeto = arr[random];
- return 1;
- }
- void crearMapasAleatorios(TObject mapaxnivel[E],int nivel,char heroe[],TObject* Hero ){
- srand(time(NULL));//randomize
- int e,p,o,pos;//enemigos y posiciones
- TObject *mapa[E] = malloc((E+1)*sizeof(TObject));//E cantidad de espacios en el mapa, creando un mapa con punteros a objetos en cada posicion
- int i;
- for(i=0;i<E;i++){
- if (i==0) {
- crearHeroe(Hero,heroe);//El heroe debe estar en el primer bloque //correguir
- mapa[i]= Hero;
- }else {
- mapa[i]->id=0; //cada parte del mapa lo inicializamos como vacio
- mapa[i]->hero=NULL;
- mapa[i]->item=NULL;
- mapa[i]->monstruo=NULL;
- }
- }
- /// soporta solo hasta 5 niveles
- //Cantidad de enemigos
- e=(rand() % 2*Factor) + 2*nivel; // aumentar ratio de aparcion
- //Posiones
- p = (10 - nivel) + (rand() % Factor) ; //disminuye el ratio de aparicion ,
- //colocar enemigos
- // cantidad de armas
- o = (10 - nivel) - (rand() % 2*Factor);
- ////////////////////////////////
- TObject arrMonst[MAX];
- cargarMonstruosGen(arrMonst);
- int j=0; int verif;
- while (j<e){//aqui coloco a los mounstruos en el mapa
- pos= (rand() % (E-2) ) + 2 ;
- verif = colocarObjeto(mapa[pos],nivel,arrMonst); // si existe lo carga a mapa[pos]]
- if(verif==1)j++; //si verif 0 entonces no se coloco satisfactoriamente y se vuelve a ha
- // invocar el mismo bucle
- }
- j=0;
- //colocar posiones
- TObject arrPociones[MAX];//Anderson puso esto porque me salia error
- cargarPocionesGen(arrPociones);
- while (j<p){// coloco las pociones en el mapa
- pos= (rand() % (E-2) ) + 2 ;
- verif = colocarObjeto(mapa[pos],nivel,arrPociones);//sacar del archivo
- if(verif==1)j++;
- }
- // agregamos items
- TObject arrArmas[MAX];//Anderson puso esto porque me salia error
- cargarArmasGen(arrArmas);
- while (j<o){//coloca las armas en el mapa
- pos= (rand() % (E-2) ) + 2 ;
- verif = colocarObjeto(mapa[pos],nivel,arrArmas);//sacar del archivo
- if(verif==1)j++;
- }
- //generamos el mapa
- i=0;
- for (i=0;i<E;i++){
- mapaxnivel[i].id = mapa[i]->id;
- mapaxnivel[i].hero = mapa[i]->hero;
- mapaxnivel[i].item = mapa[i]->item;
- mapaxnivel[i].monstruo = mapa[i]->monstruo;
- }
- }
- void iniciarBatalla(THero* hero,TMonst* mons ){
- int turno;
- //graficamos los dibujitos del heroe y el moustruo
- // graficaCabecera(hero,mons);//grafica la vida de los contrincates y sus demas skills
- if (hero->speed > mons->speed)
- turno=0;//pares para que ataque heroe
- else
- turno=1;//impares para que ataque monstruo
- while(hero->health > 0 && mons->health>0 ){
- if (turno % 2==0){
- }
- else{
- };
- turno++;
- }
- }
- int main(int argc, char** argv) {
- TObject mapa[E];// es un arreglo de estructuras tipo objetos con maximo E
- int r;
- for (r=0;r<E;r++){//aca empieza a reservar espacio para los apuntadores de cada elemento del arreglo ya que pueden ir cualquiera de los 3
- mapa[r].hero=malloc(sizeof(THero));
- mapa[r].item=malloc(sizeof(TItem));
- mapa[r].monstruo=malloc(sizeof(TMonst));
- }
- TObject *Hero = malloc(sizeof(TObject));
- char C;
- char nombre[N];
- int i=4,j=18,nivel=1;//comenzamos en el nivel 1
- int animacion=0;//Le da animacion al campo
- printf("Ingrese el nombre del jugador :");
- gets(nombre);//obtenemos el nombre
- system("cls");
- //pintar(nombre,nivel);
- gotoxy(i,j);
- moverHeroe(i,j);
- int estadoJuego=1;//1 vivo 0 muerto
- int mov=0;//movimiento del arreglo a medida que el jugador se mueve
- crearMapasAleatorios(mapa,nivel,nombre,Hero);//iniciamos el juego
- pintar(nombre,nivel,&animacion);
- while (estadoJuego){
- //pintar(nombre,nivel,&animacion); //se nota un poco la impresion pero no debria notarse
- C = getch();
- //system("cls");
- if (C==77){//DERECHA
- mov++;
- i=i+4;//para moverse mas
- if (i<76){
- gotoxy(i,j);
- moverHeroe(i,j);
- }else {
- animacion++;
- gotoxy(4,j);
- moverHeroe(4,j);
- i=4;
- /*gotoxy(75,j);
- moverHeroe(75,j);
- i=75;*/
- }
- if (mov != E){
- if (mapa[mov].id==0){//vaci0
- estadoJuego=1;//no hace nada
- }else if (mapa[mov].id==2){//Enemigo
- //Manda mensaje a la pantalla auxiliar que empezara el dududuelo,se usa gotoxy
- iniciarBatalla(Hero,mapa[mov].monstruo);
- }else if (mapa[mov].id==3){//Consumible o Arma
- //elige entre tres opciones para cargar en la mochila, en la correa o no hacer nada
- }
- if (estadoJuego){//Si continua y todavia no pierde
- mapa[mov].id=mapa[mov-1].id;//Nos movemos
- mapa[mov].hero=mapa[mov-1].hero;
- mapa[mov].item=mapa[mov-1].item;
- mapa[mov].monstruo=mapa[mov-1].monstruo;
- mapa[mov-1].id=0;//el casillero anterior queda vacio
- mapa[mov-1].hero=NULL;
- //
- }else{
- //eliminarMapa(mapa);
- system("cls");
- gotoxy(36,12);
- printf("GAME OVER\n");
- gotoxy(36,15);
- printf("Deseas jugar de nuevo ? (S/N)");
- char g=getchar();
- if (g=='s' || g=='S'){
- estadoJuego=1;
- nivel=1;
- mov=0;
- }else {
- estadoJuego=0;//fin del juego
- }
- }
- }else {
- estadoJuego=1;
- nivel++;
- //eliminarMapa(mapa);
- mov=0;
- system("cls");
- gotoxy(36,12);
- printf("Nivel %d\n",nivel);
- pintar(nombre,nivel,&animacion);//Si pongo la impresion aca , cuando el personaje pasa se borra un poco el arbol pqeo el movimiento es mejor
- i=4;
- j=18;
- //crearMapasAleatorios(&mapa[E],nivel,nombre);//iniciamos el juego
- }
- } /*else
- if (C==75) {//IZQUIERDA
- i=i-2;//para moverse mas
- if (i>3){
- gotoxy(i,j);
- moverHeroe(i,j);
- }else {
- gotoxy(4,j);
- moverHeroe(4,j);
- i=4;
- }
- } else
- if (C==72) {//ARRIBA
- j=j-2;//para moverse mas
- if (j>3){
- gotoxy(i,j);
- moverHeroe(i,j);
- }else {
- gotoxy(i,4);
- moverHeroe(i,4);
- j=4;
- }
- }else
- if (C==80) {//ABAJO
- j=j+2;//para moverse mas
- if (j<19){
- gotoxy(i,j);
- moverHeroe(i,j);
- }else {
- gotoxy(i,18);
- moverHeroe(i,18);
- j=18;
- }
- }*/else
- if (C==27){
- eliminarMapa(mapa);
- system("cls");
- break;
- } else {
- gotoxy(i,j);
- moverHeroe(i,j);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement