schrift blinkt!?!?



  • mein programm bleibt manchmal(wenn die entsprechenden bedingungen gegeben sind) einfach stecken, und die schrift blinkt, bzw. wechselt mit dem was danach eigentlich kommen sollte.

    woran kann sowas liegen?
    kann das eventuell mit clrscr(); was zu tun haben?

    gruß,
    dracomar



  • Soweit ich weiß löst clrscr(); einen Seitenvoschub aus?

    zeig mal ein bisschen Quellcode.



  • also clrscr() löscht bei mir einfach den bildschirm...

    while(true)
      {
        zugSpieler1(name1);
        if(spiel.gewonnen()==1)
        {
          cout<<name1<<" hat gewonnen!!!"<<endl;
          break;
        };
        zugSpieler2(name2);
        if(spiel.gewonnen()==2)
        {
          cout<<name2<<" hat gewonnen!!!"<<endl;
          break;
        };
      };
    
    void zugSpieler2(int name)
    {
      int karte;
      clrscr();
      cout<<name<<" ist an der Reihe."<<endl;
      cout<<"\nDeine Karten:\n"<<endl;
      spiel.hand(2);
      cout<<"\nAblagestapel:"<<endl;
      spiel.obersteKarte();
      switch(spiel.returnGehtNicht())
      {
      case 0:
        cout<<"\nWelche Karte willst du spielen?"<<endl;
        cin>>karte;
        spiel.karteSpielen(karte, 2);
        break;
      case 1:
        cout<<"\nDu kannst keine Karte legen...*du ziehst eine Karte*"<<endl;
        spiel.karteZiehen(2);
        cout<<endl;
        spiel.hand(2);
        if(spiel.returnGehtNicht()==0)
        {
          cout<<"\nWelche Karte willst du spielen?"<<endl;
          cin>>karte;
          spiel.karteSpielen(karte, 2);
        };
        break;
      case 7:
        cout<<"\nDu musst "<<spiel.returnSieben()<<" Karten ziehen!\n"<<endl;
        for(int i=0;i<spiel.returnSieben();++i)
          spiel.karteZiehen(2);
        break;
      case 8:
        cout<<"\nDu musst eine Runde aussetzen!"<<endl;
      };
    };
    

    und zugSpieler1 is dann genauso..
    dieser fehler tritt immer genau dann auf wenn case 8 eintritt
    dann steht da auf dem bildschirm
    "Du musst eine Runde aussetzen!"
    und das ganze blinkt so komisch, und es passiert nix..man muss das dos fenster schliessen...



  • hast du case 8 ge'breake'd?



  • hatte ich erst..dann hab ichs probehalber gelöscht..war der selbe fehler
    aber eigentlich dürfte das eh egal sein oder nicht?



  • Richtig, es ist egal, aber der Anblick ist für mich ungewohnt
    und alles was mir eigenartig erscheint untersuche ich zuerst.

    Nun ich bin auch nicht grad ein Profi, aber wir können ja gemeinsam versuchen das Programm zu debuggen.

    Wie schauts aus, wenn du die Fallbehandlung bei '8' wegläßt?
    Tritt der Fehler dann nicht auf?
    Und wie sieht das Klassenobject spiel und ihre Elementfunktionen
    aus? - Oder bist du sicher, dass der Fehler da nicht liegen kann?
    ich nehme an, dass der Fehler bei beiden Spielern auftritt, oder?

    Nun ja, ich bin auf jeden Fallnoch nicht müde 😉



  • hehe, ich schon *grins*
    ich werd es morgen mal versuchen, dann scheib ichs hier wieder rein 😉
    bis morgen dann,
    gut nacht 😉



  • Ich hab da so ne Idee!
    (natürlich ist es nur Spekulation, weil ich nicht genug infos habe)

    Überleg dir mal folgendes:

    Spieler X ist an der Reihe. Zuerst wird, wie du sagst, der Bildschirm durch clrscr(); [du hast nen Borland Compiler stimmts?!] gelöscht.
    Nun tritt der Fall ein, dass spiel.returnGehtNicht() den Wert 8 zurückgibt.

    Du hast gesagt die Anzeige würde blinken und das PRG würde sich aufhängen.
    Hier meine momentan einzige Erklärung:

    Also spiel.returnGehtNicht() liefert acht zurück.
    Dann gibt das PRG nach switch den Text aus: "Runde aussetzen"
    Was passiert dannach - Du hast keine Zeitverzögerung, Marke
    getchar(); oder delay(); eingebaut.

    Folglich geht es SOFORT zurück in die while Schleife.
    und dort zum Spieler Y. Du sagtest er hat die gleiche Art von Funkt.
    Wie Spieler X.

    Gut dann wird wieder der Bildschirm "gelöscht"

    Und jetzt kommt die Spekulation:
    Aus irgendeinem Grund verändert sich der Rückgabewert von
    spiel.returnGehtNicht() nicht.

    !! Folglich tritt eine Endlosschleife ein !!

    Vergleiche die Fehlersequenz deines Programms mit einem Bsp.
    das ich dir jetzt gebe.
    Sollten sich diese sehr gleichen, würde ich meiner Vermutung
    nachgehen.
    Gib mir bitte bescheid, ob ich richtig lag.

    #include <iostream.h>
    #include < ????.h >   // <-- für clrscr();
    
    void main()
    {
    
       int x;
    
       while(x)
       {
        clrscr();
        cout << "\n" << "Du musst eine Runde aussetzen!";
       }
    }
    


  • Bis morgen denn nu.
    Ich bin so gegen Nachmittag wieder im Forum.



  • nur mal so nebenbei... clrscr() existiert im standard nicht... das gehört eher ins konsolenforum



  • du hattest recht capri 😉
    war eigentlich extrem logisch..und zwar wird vor jedem spielzug überprüft ob eine 8 auf dem ablagestapel liegt, wenn ja ist der nächste dran...ich hatte übersehn das das ja imme rnoch der fall ist wenn der andere wieder dran ist 😃

    @japro
    hmm, das war das einzige was ich gefunden hab, um den bildschirm zu löschen.
    kann man sowat denn auch dem standard gerecht machen?
    sonst wirds alles immer so unübersichtlich...



  • hallo,

    ja das kann man!
    zum löschen des bilschirmes gibt es eine sogenannte escapesequenz,
    die ist dann auch plattform unabhängig.
    das sie dann so aus:

    cout<<"\033[2J";//\033[2J ist dies sequenz, gibt noch jedemenge andere zur bilschirmsteuerung
    

    damits aber acuh klappt, muss ansi.sys geladen werden vom system.
    unter windows machst du das wie folgt:
    du schreibst in die config.sys
    device=c:\windows\command\ansi.sys

    rebootest das system und dann gehts!

    bye



  • Original erstellt von TBone:
    **ja das kann man!
    ...die ist dann auch plattform unabhängig.

    damits aber acuh klappt, muss ansi.sys geladen werden vom system.
    unter windows machst du das wie folgt:
    du schreibst in die config.sys
    device=c:\windows\command\ansi.sys**

    hmm, mein linux hat keine ansi.sys, daraus muss ich schlussfolgern, dass das keineswegs eine plattformunabhängige standard-konforme methode ist, den bildschirm zu löschen... :p

    [ Dieser Beitrag wurde am 10.08.2002 um 17:45 Uhr von nman editiert. ]



  • Wenn das ganze aber einmal kompiliert ist, läuft die exe datei aber dann auf jedem rechner?
    auch wenn man diesen kram nicht in der config.sys stehn hat?



  • ich glaube in der Konsolen forum kann dir besser geholfen werden
    ahja ein blick in die Konsolen-FAQs sollte helfen -> Improved Console



  • Hallo!

    Wie wäre es, wenn du bei den case noch die klammern setzen würdest???
    Also so:

    case 0:
    {
        cout<<"\nWelche Karte willst du spielen?"<<endl;
        cin>>karte;
        spiel.karteSpielen(karte, 2);
        break;
    }
      case 1:
    {
        cout<<"\nDu kannst keine Karte legen...*du ziehst eine Karte*"<<endl;
        spiel.karteZiehen(2);
        cout<<endl;
        spiel.hand(2);
        if(spiel.returnGehtNicht()==0)
        {
          cout<<"\nWelche Karte willst du spielen?"<<endl;
          cin>>karte;
          spiel.karteSpielen(karte, 2);
        };
        break;
    }
      case 7:
    {
        cout<<"\nDu musst "<<spiel.returnSieben()<<" Karten ziehen!\n"<<endl;
        for(int i=0;i<spiel.returnSieben();++i)
          spiel.karteZiehen(2);
        break;
     }
      case 8:
    {
        cout<<"\nDu musst eine Runde aussetzen!"<<endl;
    //Hier eventuell  noch break; rein!
    }
    

Anmelden zum Antworten