commit
8e877539fb
1 changed files with 272 additions and 0 deletions
@ -0,0 +1,272 @@ |
|||||||
|
#include <ncurses.h> |
||||||
|
#include <string.h> |
||||||
|
|
||||||
|
#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<MAX_PROJECTILES; i++){ |
||||||
|
if(projectiles[i].isAlive){ |
||||||
|
projectiles[i].prevYpos=projectiles[i].curYpos; |
||||||
|
projectiles[i].prevXpos=projectiles[i].curXpos; |
||||||
|
|
||||||
|
switch(projectiles[i].direction){ |
||||||
|
case 'w':{ |
||||||
|
projectiles[i].curYpos--; |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
case 'a':{ |
||||||
|
projectiles[i].curXpos--; |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
case 's':{ |
||||||
|
projectiles[i].curYpos++; |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
case 'd':{ |
||||||
|
projectiles[i].curXpos++; |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
projectiles[i].distanceTraveled++; |
||||||
|
collisionDetect(projectiles[i].curYpos, projectiles[i].curXpos);
|
||||||
|
mvwaddch(viewportWin, projectiles[i].curYpos, projectiles[i].curXpos, projectiles[i].symbol); |
||||||
|
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); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
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;i<MAX_PROJECTILES;i++){ |
||||||
|
if(projectiles[i].isAlive==0 && projectiles[i+1].isAlive==0){ |
||||||
|
projectiles[i]=projectile; |
||||||
|
player.weapons[player.curWeapon].curCapacity--; |
||||||
|
break; |
||||||
|
} |
||||||
|
}
|
||||||
|
} |
||||||
|
|
||||||
|
void drawScore(){ |
||||||
|
werase(scoreWin); |
||||||
|
box(scoreWin, 0, 0); |
||||||
|
mvwprintw(scoreWin, 1, 1, "Current Weapon: %s",player.weapons[player.curWeapon].name); |
||||||
|
mvwprintw(scoreWin, 2, 1, "Ammo: %d/%d",player.weapons[player.curWeapon].curCapacity,player.weapons[player.curWeapon].maxCapacity); |
||||||
|
wnoutrefresh(scoreWin); |
||||||
|
} |
||||||
|
|
||||||
|
void drawViewport(){ |
||||||
|
box(viewportWin,0,0); |
||||||
|
wnoutrefresh(viewportWin); |
||||||
|
} |
||||||
|
|
||||||
|
void movePlayer( struct Player *playerRef) { |
||||||
|
mvwaddch(viewportWin, playerRef->curYpos, 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;
|
||||||
|
} |
Loading…
Reference in new issue