//hw2.c //Date: 6/8/2003 //Description: Simulation of a Snakes and Ladders game #include #include #include #include #include #include int playerA = 0; int playerB = 0; int result; int roll(); void game(int& player); main(void){ cout << "TWO-PLAYER SNAKES AND LADDERS GAME.\n" << endl; int parentPid, childPid, status; void sigChldHandler (int sig); struct sigaction act; sigfillset(&(act.sa_mask)); act.sa_flags = 0; act.sa_handler = sigChldHandler; void sigHandler(int sig); struct sigaction players; sigfillset(&(players.sa_mask)); players.sa_flags = 0; players.sa_handler = sigHandler; parentPid = getpid(); cout << "Player A is at square 0." << endl; cout << "Player B is at square 0." << endl << endl; if((childPid = fork()) == 0) { //child process sigaction(SIGUSR1, &players, NULL); srand(getpid()); int oldB; while(1){ pause(); //wait for SIGUSR1 from parent result = roll(); playerB += result; oldB = playerB; cout << "Player B rolls a " << result << ", lands on square "; cout << playerB << "." << endl; game(playerB); if(playerB > oldB) cout << "Player B climbs up a ladder to square " << playerB << "!" << endl; if(playerB < oldB) cout << "Player B slides down a snake to square " << playerB << "!" << endl; cout << endl; if(playerB < 100) { //Player B hasn't yet won sleep(1); kill(parentPid, SIGUSR2); } else{ cout << "PLAYER B WINS!!!" << endl; exit(0); } } } else { //parent process sigaction(SIGUSR2, &players, NULL); sigaction(SIGCHLD, &act, NULL); srand(getpid()); int oldA; while(1){ result = roll(); playerA += result; oldA = playerA; cout << "Player A rolls a " << result << ", lands on square "; cout << playerA << "." << endl; game(playerA); if(playerA > oldA) cout << "Player A climbs up a ladder to square " << playerA << "!" << endl; if(playerA < oldA) cout << "Player A slides down a snake to square " << playerA << "!" << endl; cout << endl; if(playerA < 100) { //Player A hasn't yet won sleep(1); kill(childPid, SIGUSR1); //send SIGUSR1 to child pause(); //wait for SIGUSR2 from child } else { //Player A wins cout << "PLAYER A WINS!!!" << endl; kill(childPid, SIGTERM); wait(&status); } } } } int roll(){ int d1 = rand() % 6 + 1; return d1; } void game(int& player){ switch(player){ case 1: player += 37; break; case 4: player += 10; break; case 9: player += 22; break; case 16: player += -10; break; case 17: player += 6; break; case 21: player += 21; break; case 28: player += 56; break; case 38: player += 8; break; case 47: player += -21; break; case 49: player += -38; break; case 51: player += 16; break; case 56: player += -3; break; case 62: player += -43; break; case 64: player += -4; break; case 71: player += 20; break; case 73: player += 19; break; case 80: player += 20; break; case 87: player += -63; break; case 93: case 95: case 98: player += -20; break; default: break; } } void sigChldHandler(int sig){ int childPid, status; childPid = wait(&status); exit(0); } void sigHandler(int sig){ return; }