Grafik: Objekt bewegt sich auf Rand zu. !Dringend!

evolem

Grünschnabel
Hallo zusammen,

ein Obejekt soll gesteuert werden. Falls sich das Objekt am Rand zusteuert, dann soll es per Zufall am Rand weiter entlang bewegen. Nun habe ich folgendes Problem, wo ich einfach zu blöd bin und nicht weiter komme:


Code:
     while (!kbhit())   /*Solange bis Taste nicht gedrückt ist*/
     {
        putimage (x, y, snake, XOR_PUT);
        delay (100000);
        putimage (x, y, snake, XOR_PUT);
        x = x - step;
        if (kbhit())                               // Taste ist gedrückt
           switch (getch())
           {
              case 111:                       // Taste o
                 while (!kbhit())
                 {
                    putimage (x, y, snake, XOR_PUT);
                    delay (100000);
                    putimage (x, y, snake, XOR_PUT);
                    y = y - step;                // Objekt bewegt sich nach oben                          
                    if (kbhit())
                       break; 
                    else if( y < 25 )           // Objekt am oberer Rand
                       break;
                 }
              case 114 :                        // Taste r gedrückt
                 while (!kbhit())
                 {
                    putimage (x, y, snake, XOR_PUT);
                    delay (100000);
                    putimage (x, y, snake, XOR_PUT);
                    x = x + step;
                    if (kbhit())
                       break;
                    else if( x > 600)           // Objekt am rechter Rand
                       break;
                 }
           }
        else if ( x < 10 )
           while(!kbhit())
           {
              putimage (x, y, snake, XOR_PUT);
              delay (10000);
              putimage (x, y, snake, XOR_PUT);
              y = y - step;
              if (kbhit())
                 break;
              else if( y < 25 )
                 while (!kbhit())
                 {
                    putimage (x, y, snake, XOR_PUT);
                    delay (10000);
                    putimage (x, y, snake, XOR_PUT);
                    x = x + step;
                    if (kbhit())
                       break;
                    
                 }
           }               
     }

Sobald das Objekt am Rand ist und mit der Taste "r" aus dem Rand raus will, dann verschwindet das Objekt. Es liegt wohl am Break Anweisung. Möchte aber wieder zurück in die Schleife, aber ohne goto Anweisung. Mein Lehrer war von meiner ersten Idee, wessen togo Anweisung eingebaut war, nicht begeistert. Zufall ist nicht zwingend nötig, aber welche Möglichkeiten habe ich? Verbesserungsvorschläge höre ich mir auch gerne an!

Gruß Evolem
 
Wenn es sich am Rand lang bewegen soll, muss die Schleife bei erreichen des Randes nicht abbrechen, sondern das Objekt am Rand stehen lassen, also z.B.

Code:
else if( x > 600) 
x = 600;

dann bewegt es sich am Rand entlang, bis es die Ecke erreicht
 
Also ich würde dir empfehlen um das "break" weg zu bekommen und den Code ein wenig übersichtlicher zu machen, zwei Funktionen zu erstellen.

Eine um x zu bewegen und eine um y zu bewegen, die jeweils zwei Übergabewerte haben, einmal einen, der den Wert von step übergibt und einen der übergibt ob hoch oder runtergezählt wird.

Dies könnte z.B. so aussehen:

Code:
int move_y (int step, bool richtung)
{
  If(richtung = 0)
    step = step * -1;

  while (!kbhit())
  {
    putimage (x, y, snake, XOR_PUT);
    delay (100000);
    putimage (x, y, snake, XOR_PUT);
    y = y + step;                                          
    if (kbhit())
      return 0; 
    else if( y < 25 )           
      return 0;
  
}

Diese Funktion musst du dann halt einmal für x und einmal für y erstellen.

Wenn du die Funktion dann aufrufst gibst du den Wert für step an und sen Wert fürs Hoch- und Runterzählen.

Also z.B. move_y(step,0);

Dabei steht dann 0 für Runterzählen und 1 für Hochzählen.

Durch return springt das Programm dann wieder zurück unter den Funktionsaufruf ohne das du goto benutzen muss.

Ich hoffe dein Problem ist damit gelöst.
 
Zurück