added more code
This commit is contained in:
@ -0,0 +1,290 @@
|
||||
#include <ncurses.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
WINDOW *initscr(void);
|
||||
int start_color(void);
|
||||
int cbreak(void);
|
||||
int noecho(void);
|
||||
int nodelay(WINDOW *win, bool bf);
|
||||
int keypad(WINDOW *win, bool bf);
|
||||
int curs_set(int visibility);
|
||||
/*void getmaxyx(WINDOW *win, int y, int x); */
|
||||
int init_pair(short pair, short f, short b);
|
||||
/*int attron(int attrs);
|
||||
int COLOR_PAIR(int n);
|
||||
int wmove(WINDOW *win, int y, int x);
|
||||
nothing*/
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
FILE* mazeFile; /* Maze Input File */
|
||||
unsigned int row = 0; /* Holds number of rows for input from file */
|
||||
unsigned int col = 0; /* Holds number of cols for input from file */
|
||||
unsigned int pcol = 0;
|
||||
unsigned int prow = 0;
|
||||
char shold[2000]; /* Holds lines for input from file */
|
||||
unsigned int l = 0;
|
||||
unsigned int k = 0;
|
||||
char **maze; /* array for maze */
|
||||
unsigned int c1 = 0;
|
||||
unsigned int c2 = 0;
|
||||
unsigned int i = 0;
|
||||
unsigned int j = 0;
|
||||
unsigned int x = 0;
|
||||
unsigned int y = 0;
|
||||
int deltaRow, deltaCol; /* Change in row-column position based on key input */
|
||||
unsigned int score = 0;
|
||||
|
||||
|
||||
WINDOW* W = 0; /* Curses Window handle */
|
||||
int rowLimit,colLimit; /* Num of rows and columns in terminal window */
|
||||
/* Initialize ncurses -- you will want to use the following settings */
|
||||
|
||||
|
||||
|
||||
/* check to see if argument */
|
||||
if (argc != 2)
|
||||
{
|
||||
/*printw("An error has ocurred no input file was given.\n");*/
|
||||
return 1;
|
||||
}
|
||||
mazeFile = fopen(argv[1], "r");
|
||||
if (mazeFile == NULL)
|
||||
{
|
||||
/*printw("Error in opening the file.\n");*/
|
||||
return 1;
|
||||
}
|
||||
fgets(shold, 2, mazeFile);
|
||||
while ( feof(mazeFile) == 0 )
|
||||
{
|
||||
|
||||
|
||||
switch(shold[0])
|
||||
{
|
||||
case 'M':
|
||||
/* read array values, dynamically allocate array */
|
||||
fscanf(mazeFile, "%3u %3u", &row, &col);
|
||||
maze = (char**)malloc(row * 8);
|
||||
for(i = (unsigned) 0; i < row; i++)
|
||||
{
|
||||
if (maze==NULL)
|
||||
{
|
||||
break;
|
||||
}
|
||||
maze[i] = malloc(col * 8);
|
||||
}
|
||||
for (x = (unsigned) 0; x < row; x++)
|
||||
{
|
||||
for (j = (unsigned) 0; j < col; j++)
|
||||
{
|
||||
fscanf(mazeFile, "%c", &maze[x][j]);
|
||||
if (maze[x][j] == '\n')
|
||||
{
|
||||
fscanf(mazeFile, "%c", &maze[x][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'P':
|
||||
fscanf(mazeFile, "%3u %3u", &k, &l);
|
||||
/* check maze bounds */
|
||||
if(k>= row || l>= col){
|
||||
break;
|
||||
}
|
||||
maze[k][l] = 'P';
|
||||
break;
|
||||
|
||||
case 'Z':
|
||||
fscanf(mazeFile, "%3u %3u", &k, &l);
|
||||
/* check maze bounds */
|
||||
if(k>= row || l>= col){
|
||||
break;
|
||||
}
|
||||
maze[k][l] = 'Z';
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
fscanf(mazeFile, "%3u %3u", &k, &l);
|
||||
/* check maze bounds */
|
||||
if(k>= row || l>= col){
|
||||
break;
|
||||
}
|
||||
maze[k][l] = 'T';
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
fgets(shold, 2, mazeFile);
|
||||
if (feof(mazeFile) != 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fclose(mazeFile);
|
||||
W = initscr(); /* Determine terminal type and initialize curses data structures */
|
||||
start_color(); /* Enable use of color with ncurses */
|
||||
cbreak(); /* Disable line buffering and make char inputs immediately accessible to program */
|
||||
noecho(); /* Disable echo printing of chars type by user */
|
||||
nodelay(W, true); /* Make getch( ) a non-blocking call */
|
||||
keypad(W, true); /* Enable keypad and arrow keys */
|
||||
curs_set(0); /* Set cursor to be invisible - 0 */
|
||||
getmaxyx(W, rowLimit, colLimit); /* Query terminal dimensions */
|
||||
|
||||
/* Define color pallete foreground-background color pairs */
|
||||
/* PairID#, Foreground Color, Background Color */
|
||||
/* Foreground color == Background color ==> solid color block */
|
||||
init_pair(1, COLOR_BLACK, COLOR_BLACK); /* Black text on Black background */
|
||||
init_pair(2, COLOR_GREEN, COLOR_GREEN); /* Red text on Black background */
|
||||
init_pair(3, COLOR_WHITE, COLOR_WHITE); /* White text on Blue background */
|
||||
init_pair(4, COLOR_RED, COLOR_RED); /* Yellow text on Yellow background */
|
||||
init_pair(5, COLOR_YELLOW, COLOR_YELLOW); /* Yellow text on Yellow background */
|
||||
|
||||
|
||||
for (c1 =(unsigned)0; c1 < row; c1++)
|
||||
{
|
||||
/*printw ("\n");*/
|
||||
for (c2=(unsigned)0; c2 < col; c2++)
|
||||
{
|
||||
if (maze==NULL)
|
||||
{
|
||||
break;
|
||||
}
|
||||
switch(maze[c1][c2])
|
||||
{
|
||||
case '#':
|
||||
/* read array values, dynamically allocate array*/
|
||||
attron(COLOR_PAIR(2));
|
||||
wmove(W, c1,c2);
|
||||
waddch(W,'#');
|
||||
attroff(COLOR_PAIR(2));
|
||||
break;
|
||||
case ' ':
|
||||
wmove(W, c1,c2);
|
||||
waddch(W,' ');
|
||||
break;
|
||||
case 'P':
|
||||
wmove(W, c1,c2);
|
||||
waddch(W,'P');
|
||||
prow=c1;
|
||||
pcol=c2;
|
||||
break;
|
||||
case 'Z':
|
||||
attron(COLOR_PAIR(4));
|
||||
wmove(W, c1,c2);
|
||||
waddch(W,'Z');
|
||||
attroff(COLOR_PAIR(4));
|
||||
break;
|
||||
case 'T':
|
||||
attron(COLOR_PAIR(5));
|
||||
wmove(W, c1,c2);
|
||||
waddch(W,'T');
|
||||
attroff(COLOR_PAIR(5));
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
};
|
||||
/*printw("%c", maze[c1][c2]);*/
|
||||
}
|
||||
}
|
||||
|
||||
deltaRow =0;
|
||||
deltaCol =0;
|
||||
|
||||
|
||||
|
||||
do{
|
||||
|
||||
int kb = wgetch(W); /* Grab keypress */
|
||||
|
||||
/* Support player movement via WASD, IJKL, and arrow keys */
|
||||
if (kb == (int)'a' || kb == (int)'j' || kb == KEY_LEFT)
|
||||
{
|
||||
/* Move Left */
|
||||
deltaRow =0;
|
||||
deltaCol =-1;
|
||||
}
|
||||
else if (kb == (int)'d' || kb == (int)'l' || kb == KEY_RIGHT)
|
||||
{
|
||||
/* Move Right */
|
||||
deltaRow =0;
|
||||
deltaCol =1;
|
||||
}
|
||||
else if (kb == (int)'w' || kb == (int)'i' || kb == KEY_UP)
|
||||
{
|
||||
/* Move Up */
|
||||
deltaRow =-1;
|
||||
deltaCol =0;
|
||||
}
|
||||
else if (kb == (int)'s' || kb == (int)'k' || kb == KEY_DOWN)
|
||||
{
|
||||
/* Move Down */
|
||||
deltaRow =1;
|
||||
deltaCol =0;
|
||||
}
|
||||
else if (kb == (int)'q')
|
||||
{
|
||||
/* q to exit player movement loop */
|
||||
break;
|
||||
};
|
||||
|
||||
attron(COLOR_PAIR(1));
|
||||
wmove(W,prow,pcol);
|
||||
waddch(W, 'P');
|
||||
attroff(COLOR_PAIR(1));
|
||||
|
||||
if((((int)prow + deltaRow) > row) || (((int)pcol + deltaCol) > col)){
|
||||
deltaRow = 0;
|
||||
deltaCol = 0;
|
||||
}
|
||||
if(maze[((int)prow + deltaRow)][((int)pcol + deltaCol)] == '#'){
|
||||
prow = prow;
|
||||
pcol = pcol;
|
||||
}
|
||||
else{
|
||||
prow = prow + deltaRow;
|
||||
pcol = pcol + deltaCol;
|
||||
}
|
||||
if(maze[prow][pcol] == 'T')
|
||||
{
|
||||
maze[prow][pcol] = ' ';
|
||||
score++;
|
||||
}
|
||||
if(maze[prow][pcol] == 'Z')
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
attron(COLOR_PAIR(3));
|
||||
wmove(W,prow,pcol);
|
||||
waddch(W, 'P');
|
||||
attroff(COLOR_PAIR(3));
|
||||
|
||||
deltaRow =0;
|
||||
deltaCol =0;
|
||||
|
||||
wrefresh(W); /* Refresh ncurses window */
|
||||
|
||||
} while (true); /* Repeat until user selects q to quit */
|
||||
|
||||
/* free the memory */
|
||||
for(y = (unsigned)0; y < row; y++)
|
||||
{
|
||||
free(maze[y]);
|
||||
maze[y] = NULL;
|
||||
}
|
||||
if(maze != NULL){
|
||||
free(maze);
|
||||
}
|
||||
/*printw("\n");*/
|
||||
endwin();
|
||||
printf("Score = %u\n", score);
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user