#include #include #define MAX_PROJECTILES 2 #define MAX_ZOMBIES 1000 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 Player { char symbol; int curYpos, curXpos; int nextYpos, nextXpos; struct Weapon weapons[8]; int curWeapon; int isAlive; }; struct Player player = {.symbol='@', .curYpos=1, .curXpos=1, .nextYpos=1, .nextXpos=1 ,.isAlive=1}; struct Player zombies[MAX_ZOMBIES]; struct Player zombie = {.symbol='Z', .curYpos=5, .curXpos=5, .nextYpos=5, .nextXpos=5 ,.isAlive=1}; struct Weapon pistol = {.name="Pistol", .range=3, .maxCapacity=12, .curCapacity=12, .symbols="-\\|/-\\|/"}; void collisionDetect(int objYpos, int objXpos){ } void movePlayer(struct Player *playerRef); void moveProjectiles(){ int i; for(i=0; i=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); } } } 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=player.curYpos; projectile.curXpos=player.curXpos; if(direction=="up"){ projectile.range*=.4; projectile.direction='w'; projectile.symbol=weaponRef->symbols[2]; } if(direction=="left"){ projectile.direction='a'; projectile.symbol=weaponRef->symbols[0]; } if(direction=="down"){ projectile.range*=.4; projectile.direction='s'; projectile.symbol=weaponRef->symbols[6]; } if(direction=="right"){ projectile.direction='d'; projectile.symbol=weaponRef->symbols[4]; } int i; for(i=0;icurYpos, playerRef->curXpos, ' '); mvwaddch(viewportWin, playerRef->nextYpos, playerRef->nextXpos, playerRef->symbol); playerRef->curYpos = playerRef->nextYpos; playerRef->curXpos = playerRef->nextXpos; wnoutrefresh(viewportWin); } void initializeWorld() { curs_set(0); getmaxyx(stdscr,scrRows,scrCols); viewportWin=newwin(scrRows-10,scrCols,0,0); getmaxyx(viewportWin,viewportWinRows,viewportWinCols); scoreWin=newwin(10,scrCols,scrRows-10,0); mvwaddch(viewportWin, player.curYpos, player.curXpos, player.symbol); mvwaddch(viewportWin, zombie.curYpos, zombie.curXpos, zombie.symbol); } int main() { initscr(); cbreak(); keypad(stdscr, TRUE); noecho(); initializeWorld(); nodelay(stdscr, TRUE); int ch; player.weapons[0]=pistol; player.curWeapon=0; while(1) { drawScore(); drawViewport(); moveProjectiles(); doupdate(); ch = getch(); switch(ch){ case 'w': case 'W':{ if(player.curYpos > 1){ player.nextYpos--; if(player.nextYpos < 0){ player.nextYpos = 0; } movePlayer(&player); } break; } case 's': case 'S':{ if(player.curYpos < viewportWinRows - 2){ player.nextYpos++; if(player.nextYpos > viewportWinRows-1){ player.nextYpos = viewportWinRows-1; } movePlayer(&player); } break; } case 'a': case 'A':{ if(player.curXpos > 1){ player.nextXpos--; if(player.nextXpos < 0){ player.nextXpos = 0; } movePlayer(&player); } break; } case 'd': case 'D':{ if(player.curXpos < scrCols-2){ player.nextXpos++; if(player.nextXpos > viewportWinCols-1){ player.nextXpos = viewportWinCols-1; } movePlayer(&player); } break; } case KEY_UP:{ if(player.weapons[player.curWeapon].curCapacity>0){ fireWeapon(&pistol, "up"); } break; } case KEY_LEFT:{ if(player.weapons[player.curWeapon].curCapacity>0){ fireWeapon(&pistol, "left"); } break; } case KEY_DOWN:{ if(player.weapons[player.curWeapon].curCapacity>0){ fireWeapon(&pistol, "down"); } break; } case KEY_RIGHT:{ if(player.weapons[player.curWeapon].curCapacity>0){ fireWeapon(&pistol, "right"); } break; } default: if (ch != ERR) {lastPressed=ch;}; break; } } return 0; }