284 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			284 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #include <ncurses.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <stdint.h>
 | |
| #include <string.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| 
 | |
| /* LDRA_EXCLUDE RULE VIOLATION <justification start> FALSE POSITIVE -- why <justification end> */
 | |
| 
 | |
| 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);
 | |
| 	/* LDRA_EXCLUDE 170 S <justification start> FALSE POSITIVE -- why <justification end> */
 | |
| 	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 */
 | |
| 	if (W == NULL)
 | |
| 	{
 | |
| 		return 0;
 | |
| 	}
 | |
| 	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;
 | |
|         	};
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	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(((prow + (unsigned int)deltaRow) > row) || ((pcol + (unsigned int)deltaCol) > col)){
 | |
| 		deltaRow = 0;
 | |
| 		deltaCol = 0;
 | |
| 	}
 | |
| 	if(maze[((int)prow + deltaRow)][((int)pcol + deltaCol)] == '#'){
 | |
| 		prow = prow;
 | |
| 		pcol = pcol;
 | |
| 	}
 | |
| 	else{
 | |
| 		prow = prow + (unsigned int)deltaRow;
 | |
| 		pcol = pcol + (unsigned int)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;
 | |
| }
 | |
| 
 | 
