"fonction externe au main qui relance le main"
Ca ne veut rien dire "relancer le main", le seul moyen de faire ça, c´est de relancer le programme. Je te conseille aussi de factoriser tes expressions, puisque tu as trois expressions et que dans chacune d´elle tu as "score++", autant mettre une seule fois score++ à la fin de la boucle, tu y gagnes en lisibilité et en vitesse (ici non mais imagine des boucles où tu dois modifier des centaines de valeur, tu ne vas pas réécrire la même chose dix fois, ce serait idiot).
Essaie d´éviter aussi le goto si tu veux pas te faire taper sur les doigts... ^^
Pour Okami, à vrai dire je vois pas la différence, "incrémenter de 1 à chaque fois" nécessite une boucle, donc pourquoi vouloir te passer de l´incrémentation pour mettre une boucle ? Un autre conseil, quand le joueur aura trouvé la solution exacte, il ne sert à rien que la boucle continue, utilise un booléen qui prendra la valeur true lorsque l´utilisateur aura trouvé.
Voilà l´équivalent en code :
main {
int essais;
int trouve;
[...]
essais = 0;
trouve = 0;
do
{
scanf(...);
if (i < n) {
... }
else if (i > n) {
... }
else {
...
trouve = 1;}
essais++;
} while (essais < 10 && !t rouve)
Au cas où tu ne comprennes pas encore bien les expressions booléennes, je t´explique la condition du while, en fait il va tester deux choses :
1°) Il regarde si essais est inférieur à 10, si c´est vrai, ton ordinateur va "noter" la valeur 1 (logique booléenne : 1 (true) ou 0 (false)).
2°) Il regarde si trouve est true, si trouve est false, !t rouve est true, donc à partir du moment ou trouve sera true, !t rouve sera false et la condition ne sera pas remplie car 1 && 0 = 0 (table de vérité ET). Petit détail qui peut avoir son importance, si l´opérande de gauche est fausse dans l´expression a && b, b n´est pas testé (du moment que a est false, a && b sera forcément false).