Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*The ThreadLoop*/
- void* runSnake(void* snakeData){
- /*lets cast the submitted data for proper use*/
- snake data = *(snake*)snakeData;
- char tempText[256]; //buffer for the text written by threads
- int singleFlag = ( gameField.startSnakes == 1 ) ? 1 : 0; //in case its a solo run theres no winner
- enum type {NLEFT=1, ELEFT, SLEFT, WLEFT, NRIGHT, ERIGHT, SRIGHT, WRIGHT, HRAND, FRAND}; //mode identifyiers
- pthread_mutex_lock(&gameField.mutex); //mutex on
- gameField.field[data.startX][data.startY] = threadName[data.number]; //the starting point set as letter
- pthread_mutex_unlock(&gameField.mutex); //mutex off
- data.running = 1; //the running loop variable
- while(data.running == 1){
- data.running=0; //resetting the running flag
- pthread_mutex_lock(&gameField.mutex); //mutex on
- switch(data.mode){
- case 1:
- //top, left, right, down
- if( checktop(data.startX, data.startY) == 0 ){data.startY--; data.running=1; data.mode = NLEFT;}
- else if( checkleft(data.startX, data.startY) == 0 ){data.startX--; data.running=1; data.mode = WLEFT;}
- else if( checkright(gameField.sizeX, data.startX, data.startY) == 0 ){data.startX++; data.running=1; data.mode = ELEFT;}
- else if( checkbottom(gameField.sizeY, data.startX, data.startY) == 0 ){data.startY++; data.running=1; data.mode = SLEFT;}
- else{data.running=-1;}
- break;
- case 2:
- //right, top, down, left
- if( checkright(gameField.sizeX, data.startX, data.startY) == 0 ){data.startX++; data.running=1; data.mode = ELEFT;}
- else if( checktop(data.startX, data.startY) == 0 ){data.startY--; data.running=1; data.mode = NLEFT;}
- else if( checkbottom(gameField.sizeY, data.startX, data.startY) == 0 ){data.startY++; data.running=1; data.mode = SLEFT;}
- else if( checkleft(data.startX, data.startY) == 0 ){data.startX--; data.running=1; data.mode = WLEFT;}
- else{data.running=-1;}
- break;
- case 3:
- //down, right, left, top
- if( checkbottom(gameField.sizeY, data.startX, data.startY) == 0 ){data.startY++; data.running=1; data.mode = SLEFT;}
- else if( checkright(gameField.sizeX, data.startX, data.startY) == 0 ){data.startX++; data.running=1; data.mode = ELEFT;}
- else if( checkleft(data.startX, data.startY) == 0 ){data.startX--; data.running=1; data.mode = WLEFT;}
- else if( checktop(data.startX, data.startY) == 0 ){data.startY--; data.running=1; data.mode = NLEFT;}
- else{data.running=-1;}
- break;
- case 4:
- //left, top, down, right
- if( checkleft(data.startX, data.startY) == 0 ){data.startX--; data.running=1; data.mode = WLEFT;}
- else if( checkbottom(gameField.sizeY, data.startX, data.startY) == 0 ){data.startY++; data.running=1; data.mode = SLEFT;}
- else if( checktop(data.startX, data.startY) == 0 ){data.startY--; data.running=1; data.mode = NLEFT;}
- else if( checkright(gameField.sizeX, data.startX, data.startY) == 0 ){data.startX++; data.running=1; data.mode = ELEFT;}
- else{data.running=-1;}
- break;
- case 5:
- //top, right, left, down
- if( checktop(data.startX, data.startY) == 0 ){data.startY--; data.running=1; data.mode = NRIGHT;}
- else if( checkright(gameField.sizeX, data.startX, data.startY) == 0 ){data.startX++; data.running=1; data.mode = ERIGHT;}
- else if( checkleft(data.startX, data.startY) == 0 ){data.startX--; data.running=1; data.mode = WRIGHT;}
- else if( checkbottom(gameField.sizeY, data.startX, data.startY) == 0 ){data.startY++; data.running=1; data.mode = SRIGHT;}
- else{data.running=-1;}
- break;
- case 6:
- //right, down, up, left
- if( checkright(gameField.sizeX, data.startX, data.startY) == 0 ){data.startX++; data.running=1; data.mode = ERIGHT;}
- else if( checktop(data.startX, data.startY) == 0 ){data.startY--; data.running=1; data.mode = NRIGHT;}
- else if( checkbottom(gameField.sizeY, data.startX, data.startY) == 0 ){data.startY++; data.running=1; data.mode = SRIGHT;}
- else if( checkleft(data.startX, data.startY) == 0 ){data.startX--; data.running=1; data.mode = WRIGHT;}
- else{data.running=-1;}
- break;
- case 7:
- //down, left, right, up
- if( checkbottom(gameField.sizeY, data.startX, data.startY) == 0 ){data.startY++; data.running=1; data.mode = SRIGHT;}
- else if( checkleft(data.startX, data.startY) == 0 ){data.startX--; data.running=1; data.mode = WRIGHT;}
- else if( checkright(gameField.sizeX, data.startX, data.startY) == 0 ){data.startX++; data.running=1; data.mode = ERIGHT;}
- else if( checktop(data.startX, data.startY) == 0 ){data.startY--; data.running=1; data.mode = NRIGHT;}
- else{data.running=-1;}
- break;
- case 8:
- //left, up, down, right
- if( checkleft(data.startX, data.startY) == 0 ){data.startX--; data.running=1; data.mode = WRIGHT;}
- else if( checktop(data.startX, data.startY) == 0 ){data.startY--; data.running=1; data.mode = NRIGHT;}
- else if( checkbottom(gameField.sizeY, data.startX, data.startY) == 0 ){data.startY++; data.running=1; data.mode = SRIGHT;}
- else if( checkright(gameField.sizeX, data.startX, data.startY) == 0 ){data.startX++; data.running=1; data.mode = ERIGHT;}
- else{data.running=-1;}
- break;
- case 9:
- //not set yet
- break;
- case 10:
- //not set yet
- break;
- }
- /*if the snake survived...*/
- if(data.running == 1){
- if(gameField.startSnakes > 1 || (singleFlag == 1 && gameField.startSnakes == 1)){
- gameField.field[data.startX][data.startY] = threadName[data.number]; //yay, survived
- sprintf(tempText, "[Game] Snake %c (number %i) stays on position %i/%i\n", threadName[data.number], data.number, data.startX, data.startY);
- strcat(logText, tempText); //adding message
- }
- else{
- gameField.field[data.startX][data.startY] = threadStop[data.number]; //won, setting stopletter
- data.running=-1; //stopflag
- sprintf(tempText, "[Game] Snake %c (number %i) on position %i/%i WON!!! (killed'em all, haw!)\n", threadName[data.number], data.number, data.startX, data.startY); //message
- strcat(gameField.message, tempText); //adding message
- strcat(logText, tempText); //adding message
- gameField.startSnakes--; //running snakes
- }
- }
- else{
- gameField.field[data.startX][data.startY] = threadStop[data.number]; //died, setting stop letter
- gameField.startSnakes--;
- sprintf(tempText, "[Game] Snake %c (number %i) crashed on position %i/%i... xP\n", threadName[data.number], data.number, data.startX, data.startY);
- strcat(gameField.message, tempText);
- strcat(logText, tempText); //adding message
- }
- pthread_mutex_unlock(&gameField.mutex); //mutex off
- usleep(gameField.speed); //SNOOOORRRRREEE
- }
- return NULL;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement