PROJECT Finite State Machines introduction to hunter-prey DATE 10/8/10 PRESENTERS JOSEPH LEE, ALEX ZIRBEL Carnegie Mellon So I hear you like Graph Theory. Carnegie Mellon Introduction to Finite State Machines Overview Implementation in C Hunter-Prey An Example Questions? Carnegie Mellon Introduction to Finite State Machines Overview Implementation in C Hunter-Prey An Example Questions? Carnegie Mellon Overview Initial State State 1 State 2 State 3 Sometimes it is best to draw a diagram. Carnegie Mellon Overview When in doubt, do this: 1. Draw Diagram (Design) 2. Then Code (Implement) int state = 1 while(1) { switch(state) { case 1: printf(“hello!\n”); state++; break; case 2: printf(“good-bye.\n”); state--; break; default: printf(“AHH! You shouldn’t be here!\n”); break; } } Carnegie Mellon Introduction to Finite State Machines Overview Implementation in C Hunter-Prey An Example Questions? Carnegie Mellon Implementation in C A FSM in C consists of two parts: A While Loop while(1){ A Switch Statement switch(state){ You should define your states #define HUNTER 1 Carnegie Mellon Implementation in C Code Example: #define PREY 0 #define HUNTER 1 #define WAIT -1 ... int state = PREY; while(1){ switch(state){ case PREY: /* prey code */ break; case WAIT: /* waiting code */ case HUNTER: /* hunter code */ break; default: break; } } Carnegie Mellon Implementation in C Code Example: #define PREY 0 #define HUNTER 1 #define WAIT -1 ... int state = PREY; while(1){ switch(state){ case PREY: /* prey code */ break; case WAIT: /* waiting code */ case HUNTER: /* hunter code */ break; default: break; } } Define the states Carnegie Mellon Implementation in C Code Example: #define PREY 0 #define HUNTER 1 #define WAIT -1 ... int state = PREY; while(1){ switch(state){ case PREY: /* prey code */ break; case WAIT: /* waiting code */ case HUNTER: /* hunter code */ break; default: break; } } Make the while loop Carnegie Mellon Implementation in C Code Example: #define PREY 0 #define HUNTER 1 #define WAIT -1 ... int state = PREY; while(1){ switch(state){ case PREY: /* prey code */ break; case WAIT: /* waiting code */ case HUNTER: /* hunter code */ break; default: break; } } Add the switch statement Carnegie Mellon Implementation in C Code Example: #define PREY 0 #define HUNTER 1 #define WAIT -1 ... int state = PREY; while(1){ switch(state){ case PREY: /* prey code */ break; case WAIT: /* waiting code */ case HUNTER: /* hunter code */ break; default: break; } } You should have break statements Carnegie Mellon Implementation in C Things to look out for Do not have states that go nowhere Bad State Conversely, do not have unreachable states Bad State Carnegie Mellon Introduction to Finite State Machines Overview Implementation in C Hunter-Prey An Example Questions? Carnegie Mellon Hunter-Prey The Prey has simple requirements Design a prey that will run from the hunters If the prey is tagged, it will first acknowledge the tag After the prey acknowledges, it will change state to Waiting After waiting, the bot will move to the Hunter state Carnegie Mellon Hunter-Prey The Hunter is just as simple Design a hunter that will catch the prey When the hunter is close enough to the prey, it will tag the prey If the prey acknowledges the tag, then the hunter becomes the Prey If another hunter becomes the prey, your hunter changes state to Waiting Carnegie Mellon Introduction to Finite State Machines Overview Implementation in C Hunter-Prey An Example Questions? Carnegie Mellon An Example: Zombie Design hunting for food human shines flashlight Zombie becomes hungry hiding in corners Zombie recovers Zombie decides hunting is not worth it blinded by light Carnegie Mellon An Example: Zombie Implementation #define HIDING 0 #define HUNTING 1 #define BLINDED 2 hunting for food human shines flashlight case HUNTING: //locate flesh //go towards flesh //grab blindly break; case HUNTING: //same as above if(light_shine) state=BLINDED; break; Carnegie Mellon An Example: Zombie Implementation #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } Carnegie Mellon An Example: Zombie Implementation #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } Carnegie Mellon An Example: Zombie Implementation #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } Carnegie Mellon An Example: Zombie Implementation #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } Carnegie Mellon An Example: Tracing Zombie #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } state = HIDING motivated = 0 Carnegie Mellon An Example: Tracing Zombie #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } Before state = HIDING motivated = 0 After state = HIDING motivated = 1 Carnegie Mellon An Example: Tracing Zombie #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } Before state = HIDING motivated = 1 After state = HUNTING motivated = 2 Carnegie Mellon An Example: Tracing Zombie #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } Before state = HUNTING motivated = 2 After state = BLINDED motivated = 1 Carnegie Mellon An Example: Tracing Zombie #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } Before state = BLINDED motivated = 1 After state = HUNTING motivated = 1 Carnegie Mellon An Example: Tracing Zombie #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } Before state = HUNTING motivated = 1 After state = BLINDED motivated = 0 Carnegie Mellon An Example: Tracing Zombie #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } Before state = BLINDED motivated = 0 After state = HIDING motivated = 0 Carnegie Mellon An Example: Tracing Zombie #define HIDING 0 #define HUNTING 1 #define BLINDED 2 int main(){ int state = HIDING; int motivated = 0; while(1){ switch(state){ case HIDING: motivated++; if(motivated >= 2) state = HUNTING; break; case HUNTING: if(light_shine){ motivated--; state = BLINDED; } break; case BLINDED: if(!motivated) state = HIDING; else state = HUNTING; break; } } } Before state = HIDING motivated = 0 After state = HIDING motivated = 1 Back to Square 1 Carnegie Mellon Introduction to Finite State Machines Overview Implementation in C Hunter-Prey Going Further Questions?