Donc, j'ai récemment appris à apprendre C # pour mon projet de programmation au niveau A où je crée une partie. J'ai une sprite que je peux me déplacer sur l'écran, mais je voudrais que le sprite ne soit capable de ne pas bouger 6 fois avant qu'il ne soit obligé de cesser de bouger. Je pensais que je pouvais le faire en ayant une variable qui décrirait à chaque fois que la sprite a été déplacée (à l'aide du clavier). Cependant, j'ai en quelque sorte créé une boucle infinie que je ne voulais pas. J'ai découvert cela avec la console.writeline (SPACEMOved); qui ne sera pas dans mon code final. J'ai essayé toutes sortes de choses mais je ne peux pas me débarrasser de cette boucle infinie. Je crée cela dans une application Windows Forms à la manière.
private void Gameplay_KeyDown(object sender, KeyEventArgs e)
{
int spaceMoved = 6;
do
{
int x = placeholder1.Location.X;
int y = placeholder1.Location.Y;
if (e.KeyCode == Keys.Right) x += 64;
else if (e.KeyCode == Keys.Left) x -= 64;
else if (e.KeyCode == Keys.Down) y += 64;
else if (e.KeyCode == Keys.Up) y -= 64;
placeholder1.Location = new Point(x, y);
spaceMoved--;
Console.WriteLine(spaceMoved);
} while (spaceMoved > 0);
3 Réponses :
Votre état Wile est toujours valable, c'est pourquoi il fonctionne encore et encore. Essayez de faire avec la boucle Ça ira bien
int spacemoved = 6; p>
Maintenant C'est I> une boucle infinie - en supposant que cela compile. Si vous tirez spaCemoved code> en dehors du bloc, spaCemoved code> sera toujours inférieur à 7
Non seulement cette réponse ne répond pas à la question, elle crée un problème où il n'y en avait pas.
Je pense que cette réponse peut l'aider à résoudre ce problème. @Flater
@Aboubacartraore: La réponse (même après l'édition) prouve clairement que vous ne voyez pas ce qui est efficacement une boucle infinie évidente. Cette réponse crée la question que la question demande de résoudre.
Il a dit qu'il a créé une boucle infinie qu'il ne voulait pas aussi !!
Chaque fois que vous appuyez sur la touche, vous commencez à partir de 6 mouvements. Essayez ceci si vous souhaitez utiliser tous les 6 déplacements en 1, appuyez sur (Remarque: vous pouvez éviter d'utiliser une boucle ici):
int spaceMoved = 6;
private void Gameplay_KeyDown(object sender, KeyEventArgs e)
{
int x = placeholder1.Location.X;
int y = placeholder1.Location.Y;
if (e.KeyCode == Keys.Right) x += 64;
else if (e.KeyCode == Keys.Left) x -= 64;
else if (e.KeyCode == Keys.Down) y += 64;
else if (e.KeyCode == Keys.Up) y -= 64;
placeholder1.Location = new Point(x, y);
spaceMoved--;
Console.WriteLine(spaceMoved);
}
Cela ne ressemble toujours pas à ce qu'ils veulent. Ils veulent que le joueur puisse se déplacer six fois au total. Cela utilise les six déplacements dans une touches.
Eh bien, il ne devrait pas utiliser la boucle 'Do-While' alors. Mais je ne pense pas que c'est ce qu'il dit. Quoi qu'il en soit, édité mon message pour inclure les deux cas
@Teodornarliyski: Il n'est évidemment pas rare qu'un problème de contienne une erreur quelque part, comme c'est le cas avec le faire pendant code> ici. Le contexte est essentiel, et le contexte suggère de répéter le même mouvement 6 fois n'est pas ce que veut l'OP. En outre, il n'a pas de sens d'utiliser un faire tandis que code> même si i> l'intention est d'effectuer 6 mouvements (comme vous pouvez simplement entrer / décrémenter par 64 * 6 code> une fois).
@Flater je suis d'accord, je suppose que vous avez raison et il veut faire ce que je mets dans ma deuxième solution car comme vous l'avez dit, le premier a beaucoup de code pouvant être optimisé (aka aucun besoin de boucle).
Ce n'est pas une boucle infinie. Votre Cependant, vous semblez avoir brillant sur le fait que cela exécutera 6 fois chaque fois que Si vous souhaitez que le compteur soit rappelé à l'extérieur d'un seul appel de fonction, vous devez le déclarer en dehors de la Fonction. p> Cela signifie également que vous n'avez pas besoin du quelque chose sur ces lignes: P> faire pendant que code> exécutera 6 fois. gameplay_keydown code> est appelé fort>. Chaque fois, le comptoir "réinitialise" (en utilisant une langue imprécise ici) de sorte qu'il s'exécute 6 fois 6 fois. P> faire pendant code> à l'intérieur de la fonction. Chaque fonction effectuera exactement un mouvement (tant que le joueur se déplace à gauche). P> private int movesLeft = 6;
private void Gameplay_KeyDown(object sender, KeyEventArgs e)
{
if(movesLeft > 0)
{
int x = placeholder1.Location.X;
int y = placeholder1.Location.Y;
if (e.KeyCode == Keys.Right) x += 64;
else if (e.KeyCode == Keys.Left) x -= 64;
else if (e.KeyCode == Keys.Down) y += 64;
else if (e.KeyCode == Keys.Up) y -= 64;
placeholder1.Location = new Point(x, y);
movesLeft--;
Console.WriteLine($"{movesLeft} moves left!");
}
}
vous devez déclarer SPACEMOved en dehors de cette méthode, sinon elle est rétablie à chaque fois que
Je doute que c'est une boucle infinie. Je ne vois pas comment cela serait possible avec ce code. Il semble plus probable que cette fonction soit appelée une fois par coche lorsque la touche est en panne, donc
spaCemoved code> est réinitialisé chaque fois que la fonction fonctionne. Comment appuyez-vous sur la touche?Ce code itérez seulement 6 fois, ce n'est pas une boucle infinie. Voulez-vous vouloir limiter le nombre de événements i> peut-être, alors tenez-vous un bouton de curseur.
Vous cherchez peut-être des moyens d'accélérer l'événement de la clé, et n'autorise qu'un mouvement tous les 1/6 s?