Forum
Tipps
News
Menu-Icon

21 streichhölzer

Bin ein Schüler und hab noch nicht so viele Kenntnisse über c++
muss jetzt ein Spiel progamieren, das "21 Streichhölzer" heißen soll. Stelle hier mal den Arbeitsauftrag rein:


Es ist das Spiel „21 Streichhölzer“ von dir zu entwickeln.
Kurzbeschreibung:
-        Zu Beginn des Spiels liegen 21 Streichhölzer bereit
-        Jeder Spieler darf nacheinander, beginnend mit Spieler1 eins bis vier Streichhölzer nehmen
-        Verloren hat der Spieler, der den letzten Streichholz nehmen muss


Grobverlauf des Spiels und Beschreibung des Programmaufbaus:

-        Spielbeschreibung auf dem BS platzieren
-        Solange mehr als 0 Streichhölzer bereit liegen soll Spieler 1 nehmen
-        Abfangen von Fehleingaben des Spielers 1 realisieren
-        Neue Anzahl der Streichhölzer feststellen, die Restlichen
-        Wenn die Summe der Streichhölzer <=0 dann Spiel beendet, Spieler 1 hat verloren, andernfalls darf Spieler 2        noch Streichhölzer nehmen
-        Solange mehr als 0 Streichhölzer bereit liegen soll Spieler 2 nehmen
-        Abfangen von Fehleingaben des Spielers 2 realisieren
-        Neue Anzahl der Streichhölzer feststellen, die Restlichen
-        Wenn die Summe der Streichhölzer <=0 dann Spiel beendet, Spieler 2 hat verloren, andernfalls darf Spieler 2      noch Streichhölzer nehmen



kann mir jemand von euch einen Quellcode dazu schicken, das mein Problem löst =)
wäre sehr dankbar!!!

tschööö


Antworten zu 21 streichhölzer:

Kein Lehrer auf der Welt stellt eine solche Aufgabe, ohne vorher den Schülern zu vertickern wie man sowas grundsätzlich löst... oder du bist auf der falschen Schule.

Also versuch es wenigstens ein bischen selbst, das ist nun wirklich eine der einfachsten Aufgaben, die man überhaupt stellen kann...

dann sags mir doch... wenns so einfach ist!

Nein dann scheiterst du ja an der nächsten Aufgabe auch, weil du nichts gelernt hast...

Sitzt du gerade in ner Klausur und hast noch 40 Minuten Zeit?

Wenn ja: Ätsch :p

Hey, das ist ja so einfach, das kann ja sogar ich:

#include <algorithm>
#include <vector>

using namespace std;

#include <stdio.h>


class C21Streichelhoelzer
{
   public:
      C21Streichelhoelzer()
      {
         int Streichelhoelzer = 0;
         int NumStreichelhoelzer = Streichelhoelzer + 21;
         
         int WasDarfSpieler1NichtNehmen[] =
            {
               0,
               5
            };

         int WasDarfSpieler2NichtNehmen[] =
            {
               0,
               5
            };
         
         // Erstmal Streichelhoelzer zaehlen
         for( int i = 0; i < NumStreichelhoelzer; i = ++i/*Super Trick;-) */ )
         {
            Streichelhoelzer = ++Streichelhoelzer;
         }
         
         printf( "Hallo, Du hast %d Streichelhoelzer", Streichelhoelzer );
         
         printf( "Anleitung: \n" );
         printf( "Es ist das Spiel \u201e21 Streichhölzer\u201c von dir zu entwickeln. \n"\
               "Kurzbeschreibung:\n"\
               "-        Zu Beginn des Spiels liegen 21 Streichhölzer bereit\n"\
               "-        Jeder Spieler darf nacheinander, beginnend mit Spieler1 eins bis vier Streichhölzer nehmen\n"\
               "-        Verloren hat der Spieler, der den letzten Streichholz nehmen muss\n"\
               "Grobverlauf des Spiels und Beschreibung des Programmaufbaus:\n"\
               "-        Spielbeschreibung auf dem BS platzieren\n"\
               "-        Solange mehr als 0 Streichhölzer bereit liegen soll Spieler 1 nehmen\n"\
               "-        Abfangen von Fehleingaben des Spielers 1 realisieren\n"\
               "-        Neue Anzahl der Streichhölzer feststellen, die Restlichen\n"\
               "-        Wenn die Summe der Streichhölzer <=0 dann Spiel beendet, Spieler 1 hat verloren, andernfalls darf Spieler 2        noch Streichhölzer nehmen\n"\
               "-        Solange mehr als 0 Streichhölzer bereit liegen soll Spieler 2 nehmen\n"\
               "-        Abfangen von Fehleingaben des Spielers 2 realisieren\n"\
               "-        Neue Anzahl der Streichhölzer feststellen, die Restlichen\n"\
               "-        Wenn die Summe der Streichhölzer <=0 dann Spiel beendet, Spieler 2 hat verloren, andernfalls darf Spieler 2      noch Streichhölzer nehmen\n" );
         
         int AktuelleStreichelhoelzer = Streichelhoelzer;
         
        foo:
         while( AktuelleStreichelhoelzer > 0 )
         {
            int Spieler1Nimmt;

            printf( "Es sind noch so viele Steichelhoelzer ueberig:\n" );
            for ( int i = AktuelleStreichelhoelzer ; i >0; i = --i )
            {
               printf( "|" );
            }
            printf( "\n" );

           bar:
            printf( "Spieler1 ist dran:\n" );
            scanf( "%d", &Spieler1Nimmt );
            
            if( Spieler1Nimmt <= WasDarfSpieler1NichtNehmen[0] )
            {
               printf( "Das darfst Du nicht!\n" );
               goto foo;
            }
            
            if( Spieler1Nimmt >= WasDarfSpieler1NichtNehmen[1] )
            {
               printf( "Das darfst Du auch nicht!\n" );
               goto bar;
            }
            
            for( int i = 0; i < Spieler1Nimmt; i = ++i )
            {
               AktuelleStreichelhoelzer = Streichelhoelzer - 1;
               Streichelhoelzer = AktuelleStreichelhoelzer;
            }
            
            if( Streichelhoelzer <= 0 )
               if( AktuelleStreichelhoelzer >0 )
                  goto bar;
               else if ( AktuelleStreichelhoelzer <= 0 )
                  goto spieler1verliert;
               else;
            else if( Streichelhoelzer > 0 )
               goto spieler2nimmt;
            else;

           spieler2nimmt:
            int Spieler2Nimmt;
            printf( "Der andre ist dran:\n" );
            scanf( "%d", &Spieler2Nimmt );
            
            if( Spieler2Nimmt <= WasDarfSpieler2NichtNehmen[0] )
            {
               printf( "Das darfst Du nicht!\n" );
               goto spieler2nimmt;
            }
            
            if( Spieler2Nimmt >= WasDarfSpieler2NichtNehmen[1] )
            {
               printf( "Das darfst Du auch nicht!\n" );
               goto spieler2nimmt;
            }
            
            for( int i = 0; i < Spieler2Nimmt; i = ++i )
            {
               AktuelleStreichelhoelzer = Streichelhoelzer - 1;
               Streichelhoelzer = AktuelleStreichelhoelzer;
            }
            
            if( Streichelhoelzer <= 0 )
               if( AktuelleStreichelhoelzer >0 )
                  goto bar;
               else if ( AktuelleStreichelhoelzer <= 0 )
                  goto spieler2verliert;
               else;
            else if( Streichelhoelzer > 0 )
               goto foo;
            else;
         }
         
        spieler1verliert:
         {
            {
               {
                  printf( "Spieler1 Hat VeRl0r3N!!! H4h4!!!!!!!111111\n" );
                  goto raus;
               };
            }
         };
         
        spieler2verliert:
         {
            {
               {
                  printf( "Spieler1 Hat Ge\/\/0nN3n!!! H4h4!!!!!!!111111\n" );
                  goto raus;
               };
            }
         };
        raus:
         return;
      }
      
};


int main( void )
{
   C21Streichelhoelzer streichelhoelzer;
   
};



Von der 1+ die Du jetzt dafuer bekommst, will ich aber dann auch was abhaben!

Erzähl dann aber später wie's geklappt hat  ;D

@..........
wow
du bist echt gut!
(das ist no spam, das ist kompliment)
hast du das gemacht oder irgendwo geklaut??

@Gun_rose:

Ey, danke! Das hab ich alles selber gemacht, so einen Nachmittag lang! Aber ich denk' da manchmal, dass ich da doch schon noch das Eine oder Andere verbessern könnte :D:D:D:D

War aber auch echt nich einfach, die ganzen gotos auseinanderzuhalten und so.

hier noch eine Version von 21 Streichhözer.

template<int val1,int val2>
struct Tmax {
   enum { res = (val1 > val2 ? val1 : val2), };
};

template<int val1,int val2>
struct Tmin {
   enum { res = (val1 < val2 ? val1 : val2), };
};

template<int stepSize,int curCount>
struct step_take
{
   enum { res = Tmax< 0, curCount - stepSize>::res, };
};

struct tPlayer2;

struct tPlayer1 {
   typedef tPlayer2 other;
   enum { id = 1 };
};
struct tPlayer2 {
   typedef tPlayer1 other;
   enum { id = 2 };
};

template<class TStepForward>
struct tExecBounding {
   tExecBounding()
   {
      std::cout << "Verfuegbar = " << TStepForward::res << ".\n" <<
         "Spieler #" << TStepForward::player::id << ", wieviele Streichhoelzer willst du nehmen [min 1, max "
         << TStepForward::max_step_count << "] ?\n";
      TStepForward fwd;
   }

};

template<int curCount,class TPlayer>
struct step_move
{
   typedef step_move<step_take<1,curCount>::res,typename TPlayer::other>   take1;
   typedef step_move<step_take<2,curCount>::res,typename TPlayer::other>   take2;
   typedef step_move<step_take<3,curCount>::res,typename TPlayer::other>   take3;
   typedef step_move<step_take<4,curCount>::res,typename TPlayer::other>   take4;

   typedef TPlayer player;

   static const int res = curCount;
   static const int max_step_count = Tmin<curCount,4>::res;

   step_move()
   {
      int val = 0;
      std::cin >> val;
      switch( val ) {
      case 1: execute_step<take1>();
      case 2: execute_step<take2>();
      case 3: execute_step<take3>();
      case 4: execute_step<take4>();
      default:
         std::cout << "Bitte im Bereich [min 1, max " << max_step_count << "] angeben.\n";
         step_move mv;
      };
   }
   template<class TStepToTake>
   void   execute_step()
   {
      if( TStepToTake::res == 0 ) {
         throw static_cast<int>( TPlayer::id );
      }
      else
      {
         tExecBounding<TStepToTake> val;
      }
   }
};
 

int _tmain(int argc, _TCHAR* argv[])
{
   try
   {
      tExecBounding<step_move<21,tPlayer1> > val;
   }
   catch( int player ) {
      std::cout << "Spieler #" << player << " hat das Spiel gewonnen.\n";
   }

   char e;
   std::cin >> e;

   return 0;
}

Vorsicht, nur echte C++ standard konforme Compiler haben eine Chance diesen Code zu übersetzen.
Weiter melden manche Compiler fälschlicherweise die folgende Warnung "recursive on all control paths, function will cause runtime stack overflow".

Geht das nicht auch etwas einfacher? Ist zwar nur C, aber ich finde es auch etwas aufwendig für dieses Problem C++ zu bemühen. Weiß blöderweise nicht, wie ich Code hier so chic hervorheben kann(kann mir ja vielleicht gleich jmd. erklären?):

Vielen Dank, gleich mal ändern.....

#include <stdlib.h>
#include <stdio.h>
main()
{
    int streichhoelzer = 21;
    int spieler = 0;
    int nimm = 0;
    bool flag;
    printf("21 Streichhoelzer\n");
    printf("\nHier eine Beschreibung......");
    printf("\nusw. usw.\n");
    while(streichhoelzer>0)
    {
        spieler++;
        if(spieler>2) spieler=1;
        printf("\nAktueller Spieler: %d", spieler);
        printf("\nAnzahl Streichhoelzer: %d\n", streichhoelzer);
        do
        {
                printf("\nWieviele Streichhoelzer willst Du nehmen (1 bis 4)?");
                scanf("%d", &nimm);
        }
        while((nimm<1)||(nimm>4)||(nimm>streichhoelzer));
        streichhoelzer -= nimm;
    }
    printf("\nEs gibt keine Streichhoelzer mehr. Spieler %d hat verloren.", spieler);
}
« Letzte Änderung: 29.11.04, 15:54:51 von Spawn »

Also diese

Hervorhebung machst du mit dem Befehl code. Dazu öffnest du einen ["code"]Hier kommt der Code hin["/code"] und schliesst ihn so wieder. Natürlich ohne ""-Zeichen :)
Geht das nicht auch etwas einfacher?

Herzlichen Glückwunsch, spawn, Du hast als erster die Hausaufgaben für irgendeinen, Dir vermutlich unbekannten, Schüler erfolgreich erledigt.

Wenn Du das beim nächsten Mal noch ein bisschen früher ( also vor seinem Abgabetermin ) schaffst, dann bekommt er dafür vermutlich sogar noch eine ganz gute Note!

Dann musst Du das aber noch ein bisschen besser kommentieren damit der arme "Ich-Muss-Ja-Unbedingt-Informatik-Belegen-Aber-Der-Lehrer-Ist-So-Schlecht"-Schüler beim Vortgragen der Hausaufgaben nicht ins Straucheln kommt.

Hörte ich da eine nicht ganz unwesentliche Kritik heraus?  ???

Stimmt schon, eigentlich bringt ihm das herzlich wenig, aber irgendwo macht es doch auch Spaß ein Problem zu lösen (auch wenn dieses nicht sonderlich schwer war) und sich darüber gegenseitig auszutauschen. Gut, das Feedback wird hier vielleicht nicht sonderlich groß sein (besonders vom Urheber), aber was solls....

int main( void )
{
   int sh, sp, n;

   for( sh = 21, sp = -1; sh > 0;
       ( ( (++sp % 2 ) ? printf( "Streichhölzer übrig: %d\nSpieler 2 nimmt: ", sh ) :
          printf( "Streichhölzer übrig: %d\nSpieler 1 nimmt: ", sh ) ) && scanf( "%d", &n ) )
          &&
          ( ( n <= 4 ) && ( n > 0 ) ) ? ( sh -= n ) : (++sp % 2 ) );
   printf( "Spieler %d hat gewonnen!\n", sp%2 );
}

 :P

« 3D-Anwendung mit SDLchar einlesen »
 

Fremdwörter? Erklärungen im Lexikon!
Binärsystem
Unter dem Begriff Binärsystem (oder Dualsystem) versteht man ein Zahlensystem, das lediglich zwei Zustände oder Werte kennt: Null (0) und Eins (1). Es bildet di...

Bing
Bing ist eine von Microsoft entwickelte und betriebene Suchmaschine, die 2009 als Nachfolger von Microsofts früherer Suchmaschine "Live Search" eingeführt wurde...

AGP Schnittstelle
Die AGP (Accelerated Graphics Port) - Schnittstelle wurde in den 1990er Jahren eingeführt und war speziell für Grafikkarten in PCs konzipiert. Sie bot eine dire...