diff --git a/collisionDetection.c b/collisionDetection.c new file mode 100644 index 0000000..1a66768 --- /dev/null +++ b/collisionDetection.c @@ -0,0 +1,12 @@ +#include +struct Entity * collisionDetect(int objYpos, int objXpos){ + int i; + for(i=1; i +#include +#include +void drawScore(){ + werase(scoreWin); + box(scoreWin, 0, 0); + mvwprintw(scoreWin, 1, 1, "Current Weapon: %s",allEntities[0].weapons[allEntities[0].curWeapon].name); + mvwprintw(scoreWin, 2, 1, "Ammo: %d/%d",allEntities[0].weapons[allEntities[0].curWeapon].curCapacity,allEntities[0].weapons[allEntities[0].curWeapon].maxCapacity); + wnoutrefresh(scoreWin); +} + +void drawGameOverWin(){ + getmaxyx(stdscr,scrRows,scrCols); + gameOverWin=newwin(scrRows/2,scrCols/2,scrRows/4,scrCols/4); + nodelay(stdscr, FALSE); + box(gameOverWin,0,0); + wnoutrefresh(gameOverWin); + doupdate(); + getch(); + endwin(); + exit(0); +} + +void drawViewport(){ + box(viewportWin,0,0); + int i; + for(i=0; i +#include +#include +void gameLoop(){ + int lastPressed; + while(1) { + drawScore(); + drawViewport(); + //addZombie(); + moveProjectiles(); + moveZombies(); + doupdate(); + + int ch; + ch = getch(); + switch(ch){ + case 'w': + case 'W':{ + if(allEntities[0].curYpos > 1){ + allEntities[0].nextYpos--; + if(allEntities[0].nextYpos < 0){ + allEntities[0].nextYpos = 0; + } + } + break; + } + case 's': + case 'S':{ + if(allEntities[0].curYpos < viewportWinRows - 2){ + allEntities[0].nextYpos++; + if(allEntities[0].nextYpos > viewportWinRows-1){ + allEntities[0].nextYpos = viewportWinRows-1; + } + } + break; + } + case 'a': + case 'A':{ + if(allEntities[0].curXpos > 1){ + allEntities[0].nextXpos--; + if(allEntities[0].nextXpos < 0){ + allEntities[0].nextXpos = 0; + } + } + break; + } + case 'd': + case 'D':{ + if(allEntities[0].curXpos < scrCols-2){ + allEntities[0].nextXpos++; + if(allEntities[0].nextXpos > viewportWinCols-1){ + allEntities[0].nextXpos = viewportWinCols-1; + } + } + break; + } + case 'z': + case 'Z':{ + addZombie(); + break; + } + case KEY_UP:{ + if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ + fireWeapon(&allEntities[0].weapons[allEntities[0].curWeapon], "up"); + } + break; + } + case KEY_LEFT:{ + if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ + fireWeapon(&allEntities[0].weapons[allEntities[0].curWeapon], "left"); + } + break; + } + case KEY_DOWN:{ + if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ + fireWeapon(&allEntities[0].weapons[allEntities[0].curWeapon], "down"); + } + break; + } + case KEY_RIGHT:{ + if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ + fireWeapon(&allEntities[0].weapons[allEntities[0].curWeapon], "right"); + } + break; + } + + default: + if (ch != ERR) {lastPressed=ch;}; + break; + } + struct Entity * hitEntity = (struct Entity *)collisionDetect(allEntities[0].curYpos, allEntities[0].curXpos); + if(hitEntity){ + if(!strcmp(hitEntity->type,"zombie")){ + allEntities[0].isAlive=0; + mvwaddch(viewportWin, allEntities[0].curYpos, allEntities[0].curXpos, ' '); + drawGameOverWin(); + } + } + } +} diff --git a/getPos.c b/getPos.c new file mode 100644 index 0000000..3f35934 --- /dev/null +++ b/getPos.c @@ -0,0 +1,84 @@ +#include +#include +#include +int getOpenPos(){ + int chooseAnother=1; + while(chooseAnother){ + spaceExists: + openPos.y=(rand()%(viewportWinRows-1)+1); + openPos.x=(rand()%(viewportWinCols-1)+1); + if(mvwinch(viewportWin,openPos.y,openPos.x)==' '){ + int i; + for(i=1;i0){ + dx1 = 1; + } + if (h<0){ + dy1 = -1; + } + else if(h>0){ + dy1 = 1; + } + if (w<0){ + dx2 = -1; + } + else if(w>0){ + dx2 = 1; + } + int longest = abs(w); + int shortest = abs(h); + if (!(longest>shortest)) { + longest = abs(h); + shortest = abs(w); + if (h<0){ + dy2 = -1; + } + else if (h>0){ + dy2 = 1; + } + dx2 = 0; + } + int numerator = longest >> 1; + numerator += shortest; + if (!(numerator +#include +#include +#include +#include + + +void initializeWorld() { + struct Entity player = {.type="player",.symbol='@', .curYpos=1, .curXpos=1, .nextYpos=1, .nextXpos=1 ,.isAlive=1}; + struct Weapon pistol = {.name="Pistol", .range=3, .maxCapacity=12, .curCapacity=12, .symbols="-\\|/-\\|/"}; + + srand(time(NULL)); + initscr(); + curs_set(0); + cbreak(); + nodelay(stdscr, TRUE); + keypad(stdscr, TRUE); + noecho(); + getmaxyx(stdscr,scrRows,scrCols); + viewportWin=newwin(scrRows-10,scrCols,0,0); + getmaxyx(viewportWin,viewportWinRows,viewportWinCols); + scoreWin=newwin(10,scrCols,scrRows-10,0); + + allEntities[0]=player; + allEntities[0].curYpos=(rand()%(viewportWinRows-2))+1; + allEntities[0].curXpos=(rand()%(viewportWinCols-2))+1; + allEntities[0].nextYpos=allEntities[0].curYpos; + allEntities[0].nextXpos=allEntities[0].curXpos; + allEntities[0].weapons[0]=pistol; + allEntities[0].curWeapon=0; + + +} + diff --git a/nZombies.c b/nZombies.c index 1da9ab0..4d7bf5a 100644 --- a/nZombies.c +++ b/nZombies.c @@ -1,439 +1,4 @@ -#include -#include -#include -#define MAX_PROJECTILES 2 -#define MAX_ZOMBIES 1000 -#define MAX_ALIVE 10 - -int scrRows,scrCols; -int viewportWinRows,viewportWinCols; -int lastPressed; - -WINDOW* viewportWin; - -WINDOW* scoreWin; - -struct Projectile{ - int isAlive; - char symbol; - int curXpos; - int curYpos; - int prevYpos; - int prevXpos; - int nextYpos; - int nextXpos; - int range; - char direction; - int distanceTraveled; -}; -struct Projectile projectiles[MAX_PROJECTILES]; - -struct Weapon{ - char name[10]; - int range; - int maxCapacity; - int curCapacity; - char projectileSymbol; - char symbols[8]; -}; - -struct Entity { - char *type; - char symbol; - int curYpos, curXpos; - int nextYpos, nextXpos; - struct Weapon weapons[8]; - int curWeapon; - int isAlive; -}; - - -struct Entity player = {.type="player",.symbol='@', .curYpos=1, .curXpos=1, .nextYpos=1, .nextXpos=1 ,.isAlive=1}; -struct Entity allEntities[MAX_ALIVE]; - -struct Weapon pistol = {.name="Pistol", .range=3, .maxCapacity=12, .curCapacity=12, .symbols="-\\|/-\\|/"}; - - -struct Entity * collisionDetect(int objYpos, int objXpos){ - int i; - for(i=1; itype,"zombie")){ - projectiles[i].isAlive=0; - hitEntity->isAlive=0; - mvwaddch(viewportWin, allEntities[i].curYpos, allEntities[i].curXpos, ' '); - } - } - if(mvwinch(viewportWin,projectiles[i].prevYpos, projectiles[i].prevXpos)==projectiles[i].symbol){ - mvwaddch(viewportWin, projectiles[i].prevYpos, projectiles[i].prevXpos, ' '); - } - if(projectiles[i].distanceTraveled>=projectiles[i].range || projectiles[i].curYpos > viewportWinRows || projectiles[i].curYpos < 0 || projectiles[i].curXpos > viewportWinCols || projectiles[i].curXpos < 0){ - projectiles[i].isAlive=0; - mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, ' '); - } - usleep(30000); - } - else{ - mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, ' '); - } - } -} - -void fireWeapon(struct Weapon *weaponRef, char *direction){ - struct Projectile projectile; - if (!strcmp(weaponRef->name,"Pistol")){ - projectile.range=20; - } - projectile.isAlive=1; - projectile.distanceTraveled=0; - projectile.curYpos=allEntities[0].curYpos; - projectile.curXpos=allEntities[0].curXpos; - if(!strcmp(direction,"up")){ - projectile.range*=.4; - projectile.direction='w'; - projectile.symbol=weaponRef->symbols[2]; - } - if(!strcmp(direction,"left")){ - projectile.direction='a'; - projectile.symbol=weaponRef->symbols[0]; - } - if(!strcmp(direction,"down")){ - projectile.range*=.4; - projectile.direction='s'; - projectile.symbol=weaponRef->symbols[6]; - } - if(!strcmp(direction,"right")){ - projectile.direction='d'; - projectile.symbol=weaponRef->symbols[4]; - } - int i; - for(i=0;i0){ - dx1 = 1; - } - if (h<0){ - dy1 = -1; - } - else if(h>0){ - dy1 = 1; - } - if (w<0){ - dx2 = -1; - } - else if(w>0){ - dx2 = 1; - } - int longest = abs(w); - int shortest = abs(h); - if (!(longest>shortest)) { - longest = abs(h); - shortest = abs(w); - if (h<0){ - dy2 = -1; - } - else if (h>0){ - dy2 = 1; - } - dx2 = 0; - } - int numerator = longest >> 1; - numerator += shortest; - if (!(numeratorviewportWinRows-2){ - allEntities[i].nextYpos = allEntities[i].curYpos; - } - if(allEntities[i].nextXpos < 1 || allEntities[i].nextXpos>viewportWinCols-2){ - allEntities[i].nextXpos = allEntities[i].curXpos; - } - } - } - } -} - int main() { - srand(time(NULL)); - initscr(); - cbreak(); - keypad(stdscr, TRUE); - noecho(); initializeWorld(); - nodelay(stdscr, TRUE); - int ch; - allEntities[0].weapons[0]=pistol; - allEntities[0].curWeapon=0; - while(1) { - drawScore(); - drawViewport(); - //addZombie(); - moveProjectiles(); - moveZombies(); - doupdate(); - - ch = getch(); - switch(ch){ - case 'w': - case 'W':{ - if(allEntities[0].curYpos > 1){ - allEntities[0].nextYpos--; - if(allEntities[0].nextYpos < 0){ - allEntities[0].nextYpos = 0; - } - } - break; - } - case 's': - case 'S':{ - if(allEntities[0].curYpos < viewportWinRows - 2){ - allEntities[0].nextYpos++; - if(allEntities[0].nextYpos > viewportWinRows-1){ - allEntities[0].nextYpos = viewportWinRows-1; - } - } - break; - } - case 'a': - case 'A':{ - if(allEntities[0].curXpos > 1){ - allEntities[0].nextXpos--; - if(allEntities[0].nextXpos < 0){ - allEntities[0].nextXpos = 0; - } - } - break; - } - case 'd': - case 'D':{ - if(allEntities[0].curXpos < scrCols-2){ - allEntities[0].nextXpos++; - if(allEntities[0].nextXpos > viewportWinCols-1){ - allEntities[0].nextXpos = viewportWinCols-1; - } - } - break; - } - case 'z': - case 'Z':{ - addZombie(); - break; - } - case KEY_UP:{ - if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ - fireWeapon(&pistol, "up"); - } - break; - } - case KEY_LEFT:{ - if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ - fireWeapon(&pistol, "left"); - } - break; - } - case KEY_DOWN:{ - if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ - fireWeapon(&pistol, "down"); - } - break; - } - case KEY_RIGHT:{ - if(allEntities[0].weapons[allEntities[0].curWeapon].curCapacity>0){ - fireWeapon(&pistol, "right"); - } - break; - } - - default: - if (ch != ERR) {lastPressed=ch;}; - break; - } - struct Entity * hitEntity = collisionDetect(allEntities[0].curYpos, allEntities[0].curXpos); - if(hitEntity){ - if(!strcmp(hitEntity->type,"zombie")){ - mvwprintw(viewportWin,1,10,"TEST"); - allEntities[0].isAlive=0; - mvwaddch(viewportWin, allEntities[0].curYpos, allEntities[0].curXpos, ' '); - } - } - - } - return 0; + gameLoop(); } diff --git a/weaponsSystem.c b/weaponsSystem.c new file mode 100644 index 0000000..9451343 --- /dev/null +++ b/weaponsSystem.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +void moveProjectiles(){ + int i; + for(i=0; itype,"zombie")){ + projectiles[i].isAlive=0; + hitEntity->isAlive=0; + mvwaddch(viewportWin, allEntities[i].curYpos, allEntities[i].curXpos, ' '); + } + } + if(mvwinch(viewportWin,projectiles[i].prevYpos, projectiles[i].prevXpos)==projectiles[i].symbol){ + mvwaddch(viewportWin, projectiles[i].prevYpos, projectiles[i].prevXpos, ' '); + } + if(projectiles[i].distanceTraveled>=projectiles[i].range || projectiles[i].curYpos > viewportWinRows || projectiles[i].curYpos < 0 || projectiles[i].curXpos > viewportWinCols || projectiles[i].curXpos < 0){ + projectiles[i].isAlive=0; + mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, ' '); + } + usleep(30000); + } + else{ + mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, ' '); + } + } +} + +void fireWeapon(struct Weapon *weaponRef, char *direction){ + struct Projectile projectile; + if (!strcmp(weaponRef->name,"Pistol")){ + projectile.range=20; + } + projectile.isAlive=1; + projectile.distanceTraveled=0; + projectile.curYpos=allEntities[0].curYpos; + projectile.curXpos=allEntities[0].curXpos; + if(!strcmp(direction,"up")){ + projectile.range*=.4; + projectile.direction='w'; + projectile.symbol=weaponRef->symbols[2]; + } + if(!strcmp(direction,"left")){ + projectile.direction='a'; + projectile.symbol=weaponRef->symbols[0]; + } + if(!strcmp(direction,"down")){ + projectile.range*=.4; + projectile.direction='s'; + projectile.symbol=weaponRef->symbols[6]; + } + if(!strcmp(direction,"right")){ + projectile.direction='d'; + projectile.symbol=weaponRef->symbols[4]; + } + int i; + for(i=0;i +#include +#include + +void addZombie(){ + if(getOpenPos()){ + int i; + for(i=0;iviewportWinRows-2){ + allEntities[i].nextYpos = allEntities[i].curYpos; + } + if(allEntities[i].nextXpos < 1 || allEntities[i].nextXpos>viewportWinCols-2){ + allEntities[i].nextXpos = allEntities[i].curXpos; + } + } + } + } +}