wumpus#

wumpus.c - On 26 Jun,2011.


/* Hunt the Wumpus Game */
#include<stdio.h>
#include<stdlib.h>

/* Program Constants Defined here */
#define MAPWIDTH 7
#define MAPHEIGHT 7
#define NUM_PITS 4

/* Function Prototypes Defined here */

void initMap(char [MAPWIDTH][MAPHEIGHT]);
void printMap(char [MAPWIDTH][MAPHEIGHT]);
int move(int,int,int,int,char [MAPWIDTH][MAPHEIGHT]);
void smell(int,int,char [MAPWIDTH][MAPHEIGHT]);
int shoot(int,int,int,int,int,char [MAPWIDTH][MAPHEIGHT]);

int main(void)
{
    int num_arrows = 3; /* Total Number of Arrows */
    char map[MAPWIDTH][MAPHEIGHT];  /* Map of Territory */
    int choice;         /* Users Input Command */
    int x,y;            /* Current Position of Player */
    int dx,dy;          /* Change in Direction */
    int flag;           /* Generic Error Flag */
    int action;         /* Action 1: -> Move */
                    /* Action 2: -> Shoot */

    int debug = 1;

    /* Intialize Map */
    
    srand(time(NULL));
    initMap(map);
    
    /* Place Player at Random Location */
    /* Make sure you dont place a Player on Wumpus or a in a Pit! */

    flag = 1;
    while(flag == 1)
    {
        x = (rand() % 5) + 1;
        y = (rand() % 5) + 1;
    
        if(map[x][y] == '.')
        {
            map[x][y] = '@';
            flag = 0;
        }
    }

    printf("Welcome to 'Hunt the Wumpus' \n");
    
    if(debug)
        printMap(map);

    smell(x,y,map);

    /* Keep prompting for user input */
    do  
    {
        printf("Enter a Command: ");
        fflush(stdout);
        choice = getc(stdin);
        printf("\n");

        /* Clearing stdin manually */
        if(choice != '\n')
            while(getchar() != '\n')
                ; /* empty statement */

        switch(choice)
        {
            /* Movement options */
            case 'n':
                    dx = 0;
                    dy = -1;
                    action = 1;
                    break;
            case 's':
                    dx = 0;
                    dy = +1;
                    action =1;
                    break;
            case 'e':
                    dx = +1;
                    dy = 0;
                    action =1;
                    break;
            case 'w':
                    dx = -1;
                    dy = 0;
                    action =1;
                    break;

            /* Shoot Options */
            
            case 'N':
                    dx = 0;
                    dy = -1;
                    action = 2;
                    break;
            case 'S':
                    dx = 0;
                    dy = +1;
                    action = 2;
                    break;
            case 'E':
                    dx = +1;
                    dy = 0;
                    action = 2;
                    break;
            case 'W':
                    dx = -1;
                    dy = 0;
                    action = 2;
                    break;

            default:
                    printf("You cannot do that!\n");
                    action = 0;
                    break;

        }

    /* Move Player */

    if(action == 1)
    {
        flag = move(x,y,dx,dy,map);
        if(flag == 1)
        {
            map[x][y] ='.';
            x = x + dx;
            y = y + dy;
            map[x][y]='@';

        }
        else if(flag == -1)
            break;
    }

    /* Shoot */
    else if(action == 2)
    {
        flag = shoot(num_arrows--,x,y,dx,dy,map);
        if(flag == -1)
            break;
    }

    if(debug)
        printMap(map);
    smell(x,y,map);
}while(choice != 'Q' || choice !='q');

printf("Press any key to exit..");
getchar();

return 0;
}

/* Intialize Map with randomly placed Pits and Randomly placed Wumpus */

void initMap(char map[MAPWIDTH][MAPHEIGHT])
{
    int i,j;
    int x,y;

    /* First create a Clean Slate */
    
    for(j=0;j<MAPHEIGHT;j++)
        for(i=0;i<MAPWIDTH;i++)
            map[i][j]='.';

    /* Create walls around perimeter of map */
    
    for(i=0;i<MAPWIDTH;i++)
    {
        map[i][0]='#';
        map[i][MAPHEIGHT-1]='#';
    }
    
    for(j=1;j<MAPHEIGHT-1;j++)
    {
        map[0][j]='#';
        map[MAPWIDTH-1][j]='#';
    }

    /* Create Bottomless Pits at Random Locations */
    
    for(i=0;i<NUM_PITS;i++)
    {
        x = (rand() % 5) + 1;
        y = (rand() % 5) + 1;
        map[x][y] = 'P';
    }

    /* Create Wumpus at Random Location */

    x = (rand() % 5) + 1;
    y = (rand() % 5) + 1;
    
    map[x][y] = 'W';

}

/* This is a debug function that prints the entire map at any one time */

void printMap(char map[MAPWIDTH][MAPHEIGHT])
{
    int i,j;

    for(j=0;j<MAPHEIGHT;j++)
    {
        for(i=0;i<MAPWIDTH;i++)
            printf("%c",map[i][j]);
        printf("\n");
    }
}


/* Moves the Player to a new room */
/* This may Result in an untimely death */

int move(int x,int y,int dx,int dy,char map[MAPWIDTH][MAPHEIGHT])
{
    x = x + dx;
    y = y + dy;

    if(map[x][y] == '#')
    {
        printf("You try to move in that direction,");
        printf("but you bump into that wall.\n");
        return 0;
    }
    else if(map[x][y] == 'P')
    {
        printf("Yikes! You have fallen into a bottomless pit!");
        printf("Better Luck next time.\n");
        return -1;
    }
    else if(map[x][y] == 'W')
    {
        printf("Munch..Munch..\n");
        printf("The Wumpus has just had you for Lunch.\n");
        return -1;
    }
    else
        return 1;
}

/* This function provides the player with feedback about what might be in any of the adjoining rooms */

void smell(int x,int y,char map[MAPWIDTH][MAPHEIGHT])
{
    int pit_flag = 0;
    int wumpus_flag = 0;
    int i,j;

    /* First check West to East */
    for(i=x-1;i<=x+1;i++)
    {
        if(map[i][y]=='P')
            pit_flag = 1;
        else if(map[i][y]=='W')
            wumpus_flag =1;
    }
    
    /* Then check North to South */
    for(j=y-1;j<=y+1;j++)
    {
        if(map[x][j]=='P')
            pit_flag = 1;
        else if(map[x][j] == 'W')
            wumpus_flag = 1;
    }

    printf("You are in a dark room.\n");

    if(wumpus_flag == 1)
        printf("You smell the distinctive odor of a Wumpus.\n");
    if(pit_flag == 1)
        printf("You feel a cool breeze.\n");
}


/* Shoots an arrow in the indicated direction */

int shoot(int num_arrows,int x,int y,int dx,int dy,char map[MAPWIDTH][MAPHEIGHT])
{
    x = x + dx; 
    y = y + dy;

    if(num_arrows > 0)
    {
        printf("You shoot your arrow into the dark...\n");
        
        if(map[x][y] == 'W')
        {
            printf("\a You have slain a Wumpus!\n");
            return -1;
        }
        else
        {
            printf("And, you can hear it fall to the ground in the next room \n");
            return 0;
        }
    }
    else 
    {
        printf("You dont have any more arrows!\n");
        return 0;
    }
}