diff --git a/.gitignore b/.gitignore index cd531cf..17c3639 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,5 @@ Module.symvers Mkfile.old dkms.conf +# Binario +elefantes diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..fef3b57 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +CC=gcc +NAME=elefantes + +compile: + $(CC) -o $(NAME) main.c distancia.c screen.c -L/usr/include/ -lm -lncurses diff --git a/README.md b/README.md index 32942fc..518ae0f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # elefantes -Juego de pastorear elefantes. -Moviendo el pastor con las flechas del teclado hay que llevar a los elefantes a dentro del cercado. \ No newline at end of file +Juego de pastorear elefantes. + +Moviendo el pastor con las flechas del teclado hay que llevar a los elefantes a dentro del cercado. diff --git a/defs.h b/defs.h new file mode 100644 index 0000000..9c6ac77 --- /dev/null +++ b/defs.h @@ -0,0 +1,5 @@ +/* coordenada */ +struct coord { + int x; + int y; +}; diff --git a/distancia.c b/distancia.c new file mode 100644 index 0000000..7214fea --- /dev/null +++ b/distancia.c @@ -0,0 +1,53 @@ +#include "defs.h" +#include +#include + +/* colle duas coordenadas e calcula a distancia */ +double distancia(struct coord c, struct coord e) { + int cat1 = c.x - e.x; + int cat2 = c.y - e.y; + + return sqrt(pow(cat1, 2) + pow(cat2, 2)); +} + +/* devolve a nova coordenada á que moverse o elefante cando fuxe */ +struct coord fuxir(struct coord c, struct coord e) { + /* definese velocidade por si o dia de mañá queremos acelerar o fuxir */ + int velocidade = 1; + + /* vector imaxinario */ + float X = e.x - c.x; + float Y = e.y - c.y; + + /* loxitude vector imaxinario */ + float lonxitude = sqrtf(X*X + Y*Y); + + /* printf("Vector imaxinario\n"); */ + /* printf("X: %f\n", X); */ + /* printf("Y: %f\n", Y); */ + /* printf("Lonxitude: %f\n", lonxitude); */ + + /* usamos a lonxitude para normalizar o vector imaxinario */ + X = X / lonxitude; + Y = Y / lonxitude; + + /* redondease o modificador ó int máis cercano */ + int dX = (int)(X < 0 ? (X - 0.5) : (X + 0.5)); + int dY = (int)(Y < 0 ? (Y - 0.5) : (Y + 0.5)); + + /* aplicase a velocidade ó vector imaxinario */ + dX = dX * velocidade; + dY = dY * velocidade; + + /* printf("Modif. X: %f\n", X); */ + /* printf("Modif. Y: %f\n", Y); */ + /* printf("Modif. dX: %i\n", dX); */ + /* printf("Modif. dY: %i\n", dY); */ + + /* aplicase o vector imaxinario de movemento ó elefante para desplazalo */ + e.x = e.x + dX; + e.y = e.y + dY; + + return e; +} + diff --git a/main.c b/main.c new file mode 100644 index 0000000..809f5b2 --- /dev/null +++ b/main.c @@ -0,0 +1,30 @@ +#include +#include "defs.h" + +double distancia(struct coord c, struct coord e); +struct coord fuxir(struct coord c, struct coord e); +int screen(); + +int main(void) { + /* printf("Iniciando.\n"); */ + + /* struct coord cazador = {1,1}; */ + /* struct coord elefante = {3,3}; */ + + /* double d = distancia(cazador, elefante); */ + /* printf("Distancia: %lf\n", d); */ + + /* struct coord nova; */ + /* nova = fuxir(cazador, elefante); */ + + /* printf("Nova localización do elefante:\n"); */ + /* printf("x %i\n", nova.x); */ + /* printf("y %i\n", nova.y); */ + /* double novaD = distancia(cazador, nova); */ + /* printf("Nova Distancia: %lf\n", novaD); */ + + screen(); + + + return 0; +} diff --git a/screen.c b/screen.c new file mode 100644 index 0000000..40abec2 --- /dev/null +++ b/screen.c @@ -0,0 +1,153 @@ +#include +#include +#include "defs.h" + +#define ELEFANTES 8 + +double distancia(struct coord c, struct coord e); +struct coord fuxir(struct coord c, struct coord e); + +void cuadra(WINDOW * win, int width, int height){ + int medioX = width/2; + int medioY = height/2; + + int anchoCaja = 5; + int altoCaja = 2; + + int bordeL = medioX - anchoCaja; + int bordeR = medioX + anchoCaja; + int bordeU = medioY - altoCaja; + int bordeD = medioY + altoCaja; + + /* bordesuperior */ + for(int i = bordeL; i <= bordeR; i++){ + mvwprintw(win, bordeU, i, "*"); + } + /* borde inferior */ + for(int i = bordeL; i <= bordeR; i++){ + mvwprintw(win, bordeD, i, "*"); + } + /* borde izquierdo */ + for(int i = bordeU; i <= bordeD; i++){ + mvwprintw(win, i, bordeL, "*"); + } + /* borde dereito */ + for(int i = bordeU; i <= bordeD; i++){ + mvwprintw(win, i, bordeR, "*"); + } + /* porta */ + mvwprintw(win, height/2+altoCaja, width/2, " "); + mvwprintw(win, height/2+altoCaja, width/2-1, " "); + mvwprintw(win, height/2+altoCaja, width/2+1, " "); + + wrefresh(win); +} + +void generarElefantes(struct coord *buff){ + for(int i = 0; i < ELEFANTES; ++i) { + int nMax=40; + int nMin=10; + int rX = rand() % ((nMax+1)-nMin) + nMin; + int rY = rand() % ((nMax+1)-nMin) + nMin; + + struct coord elefante = {rX+2,rY+2}; + buff[i] = elefante; + } +} + +int screen() { + initscr(); + noecho(); + curs_set(0); //cursor invisible + + int height, width, start_y, start_x; + height = 40; + width = 80; + start_y = 0; + start_x = 0; + + WINDOW * win = newwin(height, width, start_y, start_x); + keypad(win, TRUE); //para ter as flechas + refresh(); + + box(win, 0, 0); + cuadra(win, width, height); + + struct coord cazador = {height/3,width/2}; + mvwprintw(win, cazador.x, cazador.y, "^"); + + struct coord elefantes[ELEFANTES] = {0}; + generarElefantes(elefantes); + + for(int i = 0; i < ELEFANTES; i++){ + mvwprintw(win, elefantes[i].x, elefantes[i].y, "?"); + } + + while(true){ + int c = wgetch(win); + switch(c){ + case KEY_UP: + /* mvwprintw(win, 1, 1, "up"); */ + if (mvwinch(win, cazador.x-1, cazador.y) == ' '){ + mvwprintw(win, cazador.x, cazador.y, " "); + cazador.x = cazador.x - 1; + mvwprintw(win, cazador.x, cazador.y, "^"); + wrefresh(win); + } + break; + case KEY_DOWN: + /* mvwprintw(win, 1, 1, "down"); */ + if (mvwinch(win, cazador.x+1, cazador.y) == ' '){ + mvwprintw(win, cazador.x, cazador.y, " "); + cazador.x = cazador.x + 1; + mvwprintw(win, cazador.x, cazador.y, "^"); + wrefresh(win); + } + break; + case KEY_RIGHT: + /* mvwprintw(win, 1, 1, "right"); */ + if (mvwinch(win, cazador.x, cazador.y+1) == ' '){ + mvwprintw(win, cazador.x, cazador.y, " "); + cazador.y = cazador.y + 1; + mvwprintw(win, cazador.x, cazador.y, "^"); + wrefresh(win); + } + break; + case KEY_LEFT: + /* mvwprintw(win, 1, 1, "left"); */ + if (mvwinch(win, cazador.x, cazador.y-1) == ' '){ + mvwprintw(win, cazador.x, cazador.y, " "); + cazador.y = cazador.y - 1; + mvwprintw(win, cazador.x, cazador.y, "^"); + wrefresh(win); + } + break; + } + + // IA :D + for(int i = 0; i < ELEFANTES; i++){ + struct coord elefante = elefantes[i]; + + double d = distancia(cazador, elefante); + if (d < 3) { + struct coord nova; + nova = fuxir(cazador, elefante); + + if (mvwinch(win, nova.x, nova.y) == ' '){ + mvwprintw(win, elefante.x, elefante.y, " "); + elefante = nova; + elefantes[i] = nova; //garda no array a posicion deste elefante + mvwprintw(win, elefante.x, elefante.y, "?"); + wrefresh(win); + } + } + } + + + } + + endwin(); // dealocate memory and end ncurses + + return 0; +} +