Plusieurs problèmes dans ton code :
- N est un entier et n'a pas de raison de changer de type durant ton exécution, donc pas besoin de le caster en entier à chaque tour de boucle.
- Plutôt que de caster ton i à chaque manipulation, caste-le en int dès que tu le récupères (gets.chomp.to_i).
- Relancer le jeu à la moindre erreur, c'est un peu dur. Pourquoi pas une boucle qui ne se libère pas tant que l'input n'est pas correct ?
- Si tu fais un cast en int à la réception, les nombre flottants entrés seront tronqués. C'est un comportement plus acceptable que de vérifier si un flottant est rentré et lancer une erreur, non ? Tu peux aussi utiliser .round pour un arrondissement à l'entier inférieur/supérieur.
Si toutefois tu veux vraiment vérifier le type de nombre entré, tu peux utiliser .kind_of?(Float) ou .instance_of?(Float).
- T'as du inverser quelques valeurs à la fin.