One of my first programming projects. I tried to learn C and use curses...it is quite embarrassing looking back at it now :D
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

272 lines
6.0 KiB

#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;
}