// Variables pour capteurs byte dir, s1,s2,s3,s4,s5; byte dist; //Variables d'état du programme et du jeu int i = 0; unsigned int rawData[], normData[]; int scaledData[]; int cval; int SV; //Variables d'état du programme et du jeu bool result, balle = 0, capture = 0, arret = 0, demitour = 0, couleur, retour = 0; #define CODE_REQTYPE 0 // demander le type de l'acteur #define CODE_PLACER 1 // ordonne au robot de se garer #define CODE_JOUER 2 // permet de démarrer la manche #define TYPE_JOUEUR 1 #define CODE_GARE 1 // un robot est garé #define MAILBOX_ARBITRE 2 #define MAILBOX_ACTEUR 1 sub tir() { RotateMotor(OUT_C, 90, -70); Wait(250); } sub cherche_but() { SetSensorLowspeed(IN_2); SetHTIRSeeker2Mode(IN_2, HTIR2_MODE_1200); result = ReadSensorHTIRSeeker2AC(IN_2,dir,s1,s2,s3,s4,s5); while (s3 <= 50) // On cherche a se diriger face au premier but qu'on rencontrera { TextOut(0, LCD_LINE7," "); TextOut(0, LCD_LINE7,"Se mettre face au but"); Wait(100); result = ReadSensorHTIRSeeker2AC(IN_2,dir,s1,s2,s3,s4,s5); OnFwd(OUT_A, 35); OnFwd(OUT_B, -35); } Off(OUT_AB); TextOut(0, LCD_LINE7," "); TextOut(0, LCD_LINE7,"Face au but"); Wait(1000); tir(); } sub attrappe() { SetSensorLowspeed(IN_2); SetHTIRSeeker2Mode(IN_2, HTIR2_MODE_600); SetSensorUltrasonic(IN_3); result = ReadSensorHTIRSeeker2AC(IN_2,dir,s1,s2,s3,s4,s5); capture = 0; while(capture == 0) { result = ReadSensorHTIRSeeker2AC(IN_2,dir,s1,s2,s3,s4,s5); if (arret == 1 || demitour == 1) continue; if (s1 > 0 || s2 > 0) { OnFwd(OUT_A,-80); OnFwd(OUT_B,80); } if (s4 > 0 || s5 > 0) { OnFwd(OUT_A,80); OnFwd(OUT_B,-80); } if (s3 > 0) { OnFwd(OUT_AB,80); dist = SensorUS(IN_3); result = ReadSensorHTIRSeeker2AC(IN_2,dir,s1,s2,s3,s4,s5); if (s3 >= 150) //Indiquer que c'est bien la balle qui est juste devant balle = 1; if ((dist <= 12) && (balle == 1)) { RotateMotor(OUT_C, 60, 60); Off(OUT_AB); Wait(1000); dist = SensorUS(IN_3); if (dist > 12) { RotateMotor(OUT_C, 60, -60); continue; } else capture = 1; } } } } sub Garage() { int i; int n = 1; int p = 1000; // Le robot est positioné face au but adverse. Son garage est donc derrière lui //quart de tour droite : Attention ceci n'est valable que si le camp du robot est celui qui a le garage à droite du but. OnFwd(OUT_A, 50); OnFwd(OUT_B, -50); demitour = 1; Wait(1450); demitour = 0; Off(OUT_AB); // Avancer jusqu'à la ligne rouge do { SV = ReadSensorColorEx(S1, cval, rawData, normData, scaledData); OnFwd(OUT_AB, 50); } while (cval != INPUT_REDCOLOR) do // Dépasser la ligne rouge { SV = ReadSensorColorEx(S1, cval, rawData, normData, scaledData); OnFwd(OUT_AB, 50); } while (cval == INPUT_REDCOLOR) do // Se tourner vers la droite { SV = ReadSensorColorEx(S1, cval, rawData, normData, scaledData); OnFwd(OUT_A, 70); OnFwd(OUT_B, -70); } while (cval != INPUT_REDCOLOR) while((cval != INPUT_BLACKCOLOR)) // Manoeuvre pour suivre la ligne rouge jusqu'à la ligne noire { SV = ReadSensorColorEx(IN_1, cval, rawData, normData, scaledData); /* if ( (cval == INPUT_BLACKCOLOR) || (cval == INPUT_BLACKCOLOR) ) // Condition de sortie break;*/ if (cval == INPUT_REDCOLOR) // Initialisation de la valeur de couleur à chaque itération, déterminant que faire ensuite couleur = 1; else couleur = 0; if (couleur == 1) // Avancer tant qu'on est sur la ligne OnFwd(OUT_AB,60); if (couleur == 0) // Une fois sorti de la ligne, algorithme de repositionnement { while ((couleur == 0) && (cval != INPUT_BLACKCOLOR)) while (couleur == 0) { // Lorsqu'un trop grand nombre de tours à été fait, c'est que le robot a dépassé la ligne et ne la retrouvera jamais. if (n > 6) { n = n/2; // On décremente n pour revenir à la position du milieu retour = 1; // La variable retour indique que le robot devrait reculer un peu avant de recommencer } for(i = 1; i <= 20; i++) // Balayage à droite { OnFwd(OUT_A, 70); OnFwd(OUT_B, -70); TextOut(1, LCD_LINE8, " "); TextOut(1, LCD_LINE8, "Droite"); Wait((n*p)/100); Off(OUT_AB); SV = ReadSensorColorEx(IN_1, cval, rawData, normData, scaledData); if (cval == INPUT_REDCOLOR) // Une fois retourné sur la ligne, on recommence la boucle { couleur = 1; n = 1; break; } } if (retour == 1) // Le robot recule légèrement, sachant qu'il vient de se remettre droit { // Il va se décaler sur la droite pour ne plus être perpendiculaire à la ligne au prochain passage OnFwd(OUT_AB, -50); Wait(500); OnFwd(OUT_A, 70); OnFwd(OUT_B, -70); Wait(500); Off(OUT_AB); retour = 0; n = 1; continue; } n = n+1; for(i = 1; i <= 20; i++) // Balayage à gauche { OnFwd(OUT_A, -70); OnFwd(OUT_B, 70); TextOut(1, LCD_LINE8, " "); TextOut(1, LCD_LINE8, "Gauche"); Wait((n*p)/100); Off(OUT_AB); SV = ReadSensorColorEx(IN_1, cval, rawData, normData, scaledData); if (cval == INPUT_REDCOLOR) // Une fois retourné sur la ligne, on recommence la boucle { couleur = 1; n = 1; break; } } n = n+1; } } SV = ReadSensorColorEx(IN_1, cval, rawData, normData, scaledData); } // Nous sommes en face de la ligne noire. La suivre jusqu'au bout do { OnFwd(OUT_AB, 50); SV = ReadSensorColorEx(S1, cval, rawData, normData, scaledData); } while (cval == INPUT_BLACKCOLOR) // Faire ensuite un demi-tour OnFwd(OUT_A, 50); OnFwd(OUT_B, -50); demitour = 1; Wait(2450); demitour = 0; Off(OUT_AB); } sub jouer() { attrappe(); Wait(2000); cherche_but(); } task main() { SetSensorColorFull(IN_1); int result; string buffer; while (true) { result=ReceiveMessage(MAILBOX_ACTEUR,true,buffer); if(result==0) { int requete=StrToNum(buffer); if(requete==CODE_REQTYPE) {TextOut(0,LCD_LINE1," messagerecu "); string type; type=NumToStr(TYPE_JOUEUR); SendMessage(MAILBOX_ARBITRE+10,type); } } result=ReceiveMessage(MAILBOX_ACTEUR,true,buffer); if(result==0) { int requete=StrToNum(buffer); if (requete==CODE_PLACER) { // SetSensorColorFull(IN_1); Garage(); string gare; gare=NumToStr(CODE_GARE); SendMessage(MAILBOX_ARBITRE+10,gare); } Wait(1000); } result=ReceiveMessage(MAILBOX_ACTEUR,true,buffer); if(result==0) { int requete=StrToNum(buffer); if (requete==CODE_JOUER) { jouer(); } } } }