Brauche kurz eure Hilfe


  • Administrator

    Ich möchte noch darauf hinweisen, dass getchar C ist. In C++ hat man dafür std::cin.get() :
    http://www.cplusplus.com/reference/iostream/istream/get.html

    Zudem solltest du das nächste Mal einen besseren Titel wählen. Hier brauchen alle Hilfe.

    Grüssli



  • hallo leute,
    ich hab auch ein kleines problem und will da jetz nicht extra einen neuen thread aufmachen.

    also:
    1. ich verwende Bloodshed DevC++ (wegen der schule)
    2. wir mussten ein labyrinth programmieren, mit rahmen, wo so ein "männchen" drinnen herumhüpft per randomize () und bei jedem hinderniss abprallt. soweit so gut. ich habs geschafft. dann das ganze mit 3 oder mehreren männchen. ist ja auch nicht so schwer.
    aber je mehr männchen ich da reingeb, desto schneller fangen die männchen zum "blinken" an, was sie nicht tun sollten.
    hier der code:

    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    #include <conio.h>
    
    using namespace std;
    
    #include <time.h>
    #include <windows.h>
    
    void clrscr    (void)     {system("cls");}
    void randomize (void)     {srand((unsigned int) time(NULL));};
    int  random    (int iMax) {return (int)((float)iMax*rand()/0x7fff);};
    
    void delay (int iDelay)
    {
     clock_t oStart;
     clock_t oNow;
     float   fDauer;
    
     oStart = clock();
     for (;;)
      {
        oNow = clock();
        fDauer=1000.0*(oNow - oStart) / CLK_TCK;
        if (fDauer > iDelay) break;
      };
    }
    
    void gotoxy (int iX, int iY)
    {
    	COORD coScrn;
    	coScrn.X = iX;
    	coScrn.Y = iY;
    	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coScrn);
    };
    
    void color (int iVG, int iHG)
    {
    	iHG = 16*iHG;
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), ((WORD) iVG + (WORD) iHG));
    };
    
    char getcharxy (int iX, int iY)
    {
    	COORD coScrn;
    	DWORD dwRead;
    	char szRead;
    	HANDLE hStdOut;
    	coScrn.X = iX;
    	coScrn.Y = iY;
    	hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    	ReadConsoleOutputCharacterA(hStdOut, &szRead, 1, coScrn, &dwRead);
    	return (szRead);
    };
    
    int main(int argc, char *argv[])
     {
    
      int  iX      [100];
      int  iY      [100];
      int  iStepX  [100];
      int  iStepY  [100];
      int  iZwX         ;
      int  iZwY         ;
      int  iCounter[100];
      char cA           ;
      int  iIndex       ;
      int  iAnzahl      ;
    
      randomize();
    
      iAnzahl=5;
    
      printf("*******************************************************************************\n");
      printf("*******************************************************************************\n");
      printf("**                                                                           **\n");
      printf("**                                                                           **\n");
      printf("**                                                                           **\n");
      printf("**                                                                           **\n");
      printf("**        **    **         **          **         **           ***           **\n");
      printf("**        **    **        ****         **         **          *****          **\n");
      printf("**        **    **       **  **        **         **         **   **         **\n");
      printf("**        **    **      **    **       **         **        **     **        **\n");
      printf("**        ********     **********      **         **        **     **        **\n");
      printf("**        ********    ************     **         **        **     **        **\n");
      printf("**        **    **   **          **    **         **         **   **         **\n");
      printf("**        **    **  **            **   *********  *********   *****          **\n");
      printf("**        **    ** **              **  *********  *********    ***           **\n");
      printf("**                          ****                                             **\n");
      printf("**                          ** **    **    **                                **\n");
      printf("**                          **  **   **    **                                **\n");
      printf("**                          **  **   **    **                                **\n");
      printf("**                          **  **   **    **                                **\n");
      printf("**                          ** **    **    **                                **\n");
      printf("**                          ****     ********                                **\n");
      printf("*******************************************************************************\n");
      printf("*******************************************************************************\n");
    
      for (iIndex=0;iIndex<iAnzahl;iIndex++)
       {
        do
         {        
          //neue position ermitteln        
          iX     [iIndex]= random(71)+5;
          iY     [iIndex]= random(18)+1;
          iStepX [iIndex]= random(3) -1;
          iStepY [iIndex]= random(3) -1;
    
          //zeichen an dieser position ermitteln
          getcharxy (iX[iIndex], iY[iIndex]);
         }
        while (cA=='*');
       };
    
      for(;;)
       {   
        for (iIndex=0;iIndex<iAnzahl;iIndex++)
         {   
          //neue position berechnen
          iZwX=iX[iIndex]+iStepX[iIndex];
          iZwY=iY[iIndex]+iStepY[iIndex]; 
    
          //ist diese position frei?
          cA=getcharxy(iZwX,iZwY);
          if ( (cA=='*') || (iCounter[iIndex]>=10) )
           {
            //nein --> neue richtung mit zufall suchen   
            iCounter[iIndex]=0;     
            do
             {
              iStepX[iIndex]=random(5)-2;
              iStepY[iIndex]=random(3)-1;
             }
            while ( (iStepX[iIndex]==0) && (iStepY[iIndex]==0) );
    
           }
    
          else
           {
            // ja -> neue position übernehmen
            // richtige Position: iZwX/iZwY
            // wo soll sie denn hin??: iX, iY
            iX[iIndex]=iZwX;
            iY[iIndex]=iZwY;   
    
            gotoxy (iX[iIndex],iY[iIndex]);
            printf ("o");
            delay  (10);
            gotoxy (iX[iIndex],iY[iIndex]);
            printf (" ");
           };                
         };
       }; 
    
      getch ();
    
      system("PAUSE");
      return EXIT_SUCCESS;
     }
    

    meine frage jetzt: wie bekomm ich das blinken weg?
    man hat mir gesagt, dass ich irgendwas dort ändern muss:

    else
           {
            // ja -> neue position übernehmen
            // richtige Position: iZwX/iZwY
            // wo soll sie denn hin??: iX, iY
            iX[iIndex]=iZwX;
            iY[iIndex]=iZwY;   
    
            gotoxy (iX[iIndex],iY[iIndex]);
            printf ("o");
            delay  (10);
            gotoxy (iX[iIndex],iY[iIndex]);
            printf (" ");
           };                
         };
       }; 
    
      getch ();
    

    vielen dank für eure hilfe.

    gruß,
    florian

    p.s.: wenn man iAnzahl ändert, erscheinen mehrer männchen!



  • Das kann doch nicht dein Ernst sein?

    1. Solltest du für jedes neue Problem einen neuen Thread aufmachen.
    2. Wird sich wohl keiner so schnell in mehr als 150 Zeilen Code einlesen, um deinen Fehler zu finden.
    3. Ist das überhaupt nicht C++, was du da machst. Also falsches Forum.
    4. Um doch noch etwas zur Problemstellung beigetragen zu haben: Kannst du nicht mit der Funktion delay() die Anzeigedauer festlegen?



  • wenn man iAnzahl ändert, erscheinen mehrer männchen!

    loooool made my day !

    ich vermute das clearscreen einfach zu langsam ist und deshalb das männchen flackert.
    du musst einfach nur die stelle wo das männchen war mit einer
    leerstelle überstreiben und die neue stelle markieren



  • ja das problem ist jetzt, dass der pc die neue position für das erste männchen berechnet, wieder löscht, dann für das zweite berechnet und dann wieder löscht und dann noch für das dritte. also alles seriell. das soll aber parallel passieren:
    für alle 3 männchen gleichzeitig berechnen und dann auf einmal löschen und nicht nacheinander. weiß aber nicht wie dies zu realisieren ist!

    gruß



  • Nexus schrieb:

    3. Ist das überhaupt nicht C++, was du da machst. Also falsches Forum.

    ach ne? was isses dann? für was verwende ich dann das programm Bloodshed Dev-C++? was lernen wir in der schule dann für eine programmiersprache?

    Nexus schrieb:

    4. Um doch noch etwas zur Problemstellung beigetragen zu haben: Kannst du nicht mit der Funktion delay() die Anzeigedauer festlegen?

    stimmt, kann ich schon, aber dann blinken sie alle langsamer.



  • floxx schrieb:

    Nexus schrieb:

    3. Ist das überhaupt nicht C++, was du da machst. Also falsches Forum.

    ach ne? was isses dann? für was verwende ich dann das programm Bloodshed Dev-C++? was lernen wir in der schule dann für eine programmiersprache?

    Das ist eher C.

    Obwohl du iostream einbindest, sehe ich nicht, dass du irgendetwas aus der C++ Standardbibliothek nutzt.

    Das Problem der Unterscheidung für einen Anfänger ist halt, dass praktisch alles, was in C ging auch in C++ geht. (Kompatibilitätsgründe) Und das halten viele für einen Grund immernoch mit den älteren Mittel zu arbeiten und sich mit Problemen zu beschäftigen, die man in C++ gar nicht mehr hat.



  • drakon schrieb:

    Das ist eher C.

    Nur schon die eingebundenen Bibliotheken:

    #include <cstdlib>   // C-Bibliothek
    #include <iostream>  // C++-Bibliothek, wird aber nicht benutzt
    #include <stdio.h>   // C-Bibliothek (wenn schon, dann <cstdio>)
    #include <conio.h>   // Nicht C++-Standard
    #include <time.h>    // C-Bibliothek (in C++ <ctime>)
    #include <windows.h> // Auch nicht C++-Standard
    

    Beispielsweise gibt es für printf() , getch() und system() in C++ bessere Alternativen. Und dann kommt natürlich noch der ganze Windows-Kram dazu ( COORD , DWORD , HANDLE , ...). Euch wird tatsächlich vorgetäuscht, ihr würdet C++ lernen? 🙄

    Bloodshed Dev-C++ ist im Übrigen sowieso veraltet; besser, du benutzt Code::Blocks oder Microsoft Visual C++ Express 2008.


  • Administrator

    floxx schrieb:

    für alle 3 männchen gleichzeitig berechnen und dann auf einmal löschen und nicht nacheinander. weiß aber nicht wie dies zu realisieren ist!

    Berechne Männchen 1, 2, 3 und speichere die Ergebnisse und dann gib die Ergebnisse 1, 2 und 3 aus. Da die Sache schnell ablaufen sollte, sollte es kein Problem darstellen und wie parallel wirken. Zudem würde ich dir empfehlen mal nach sleep zu suchen, zum Beispiel in der MSDN, wenn du schon die WinAPI verwendest.

    Und ja, du schreibst hier kein C++ und wenn dein Lehrer das behauptet, dann sollte er sich schämen!
    Desweiteren empfehle ich von DevC++ wegzukommen. Die IDE gilt als deprecated, also veraltet. Sie wird definitiv nicht mehr weiterentwickelt. Es gibt andere gratis IDEs, welche aktueller sind und auch weiterentwickelt werden. Zu nennen sind da hauptsächlich:
    - Code::Blocks
    - Microsoft Visual Studio Express Edition

    Grüssli



  • von dev c++ kann ich leider nicht wegkommen, da auch auf den schulrechnern dieses programm installiert ist.

    ich muss leider mit den "for, while, do else" schleifen durchkommen. mehr haben wir noch nicht gelernt. weiters habe wir erst as programm ab zeile 57 geschrieben. den käse davor hat uns der lehrer gegeben.

    weiters fehlt es bei der ganzen klasse schon an den grundlagen:
    die schleifen wurden uns nie richtig erklärt. 👎
    die erklärung unsres lehrers:

    - irgendeine schleife nummer 1:
    du läufst gegen die wand und merkst erst danach, dass du gegen die wand gelaufen bist.

    - irgendeine schleife nummer 2:
    du läufst in richtung wand und bemerkst kurz davor, dass da eine wand ist und du drehst wieder um.

    man muss sich eben bei den lehrern heutzutage alles selbst beibringen, weil diese leute aus der untesten pädagogischen schublade kommen.

    gruß



  • floxx schrieb:

    die erklärung unsres lehrers:
    [...]
    man muss sich eben bei den lehrern heutzutage alles selbst beibringen, weil diese leute aus der untesten pädagogischen schublade kommen.

    Ich denke, das reicht, um deine Lage nachzuvollziehen. Das scheint ja wirklich tragisch zu sein...

    Wenn du wirklich interessiert bist, solltest du unbedingt noch nebenbei etwas programmieren. Du kannst beispielsweise mit diesem Tutorial einiges lernen.



  • hallo,
    vielen dank, dass ihr mir das c++ näher bringen wollt. ich werde mich etwas näher mit diesen dingen beschäftigen. ist aber wahrscheinlich sehr zeitaufwädig und genau da scheiterts im moment. eine schularbeit jagt die andere. aber so wild isses aucch nicht. ich werde mich damit befassen.

    vielen dank nochmals.


  • Administrator

    Vielleicht kannst du deinem Lehrer auch empfehlen, dass er sich mal ein gutes C++ Buch kauft, wie zum Beispiel den C++ Primer oder Thinking in C++ 1&2.
    C++ Primer | ISBN: 3827326125 Thinking in C++ | ISBN: 0139798099 Thinking in C++ | ISBN: 0131225529

    Aber bitte mit Vorsicht oder Verweis auf dieses Forum. Sonst fühlt er sich noch von dir angegriffen ... soll ja so Lehrer geben 😉

    Grüssli



  • hallo,
    ich weiß, ich weiß. ich werd vom forum hier nix sagen.

    vielen dank für die empfehlungen!


  • Administrator

    floxx schrieb:

    ich werd vom forum hier nix sagen.

    Nein, ich meinte, dass du vorsichtig sein solltest, falls du eine Empfehlung abgeben möchtest. Du darfst ruhig das Forum erwähnen, kannst ihn ruhig auch hierher schicken.
    Du solltest einfach aufpassen, dass du dir nicht etwas einbrockst, wenn du den Lehrer belehren willst 😉
    Kannst also ruhig sagen, wer dir dies empfohlen hat. Vielleicht ist es sogar besser, da er dann uns angreifen kann und nicht dich angreift.
    Aber vielleicht ist er auch vernünftig ... solche Ausnahmen gibt es ja auch 😃

    Grüssli



  • mal schauen. am montag hab ich eh informatik 😉


Anmelden zum Antworten