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

@Spawn
Sinn und Zweck dieses Threads ist es eine möglichst un-/elegante Lösung für das 21 Streichhölzer Problem zu finden.
Oder glaubst du, dass man das am besten über gotos oder mit einer Menge Templates lösen kann. Dein Programm ist zu übersichtlich und erklärbar. Beim goto-Programm braucht man schon einige Minuten um durchzufinden. Beim Template-Programm vielleicht etwas weniger (aber mehr Zeit zum Kompilieren, ich kann hier nur mal empfehlen als Streichholzanzahl 1000 anzugeben).

Wir wollen ja nicht den Leuten die Lösung vorsagen oder ? (auf der anderen Seite, wenn sie nicht allein auf die Lösung kommen, solten sie doch massiv von der Informatik abgeschreckt werden, oder ?)

Korrektur: ;)

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

Ein paar bugs bereinigt, und TypeLists eingefügt.

#include <iostream>

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< -1, curCount - stepSize>::res, };
};

struct tPlayer2;

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

struct tNullType {};

template<class U,class T = tNullType>
struct TypeList {
   typedef U curType;
   typedef T tail;
};

template<class TTypeList,int idx>
struct TTypeListAt {
   typedef typename TTypeListAt<typename TTypeList::tail,idx - 1>::res res;
};

template<class TTypeList>
struct TTypeListAt<TTypeList,0> {
   typedef typename TTypeList::curType res;
};

template<int idx>
struct TTypeListAt<tNullType,idx> {
//   C_ASSERT( "idx to high for type list" );
};

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

   typedef TypeList<take_error,TypeList<take1,TypeList<take2,TypeList<take3,TypeList<take4> > > > > take_typelist;

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

   step_move()
   {
      unsigned int val = 0;
      std::cin >> val;
      switch( val ) {
      default:   TTypeListAt<take_typelist,0>::res::execute_step<step_move>();
      case 1:      TTypeListAt<take_typelist,1>::res::execute_step<step_move>();
      case 2:      TTypeListAt<take_typelist,2>::res::execute_step<step_move>();
      case 3:      TTypeListAt<take_typelist,3>::res::execute_step<step_move>();
      case 4:      TTypeListAt<take_typelist,4>::res::execute_step<step_move>();
      };
   }

   template<class TCaller>
   static void   execute_step()
   {
      std::cout << "Verfuegbar = " << curCount << ".\n" <<
         "Spieler #" << TPlayer::id << ", wieviele Streichhoelzer willst du nehmen [min 1, max "
         << max_step_count << "] ?\n";
      
      step_move   val;
   }
};

template<class TPlayer>
struct step_move<TPlayer,0>
{
   template<class TCaller>
   static void   execute_step()
   {
      throw static_cast<int>( TPlayer::other::id );
   }
};

template<class TPlayer>
struct step_move<TPlayer,-1>
{
   template<class TCaller>
   static void   execute_step()
   {
      std::cout << "Bitte im Bereich [min 1, max " << TCaller::max_step_count << "] angeben.\n";
      TCaller mv;
   }
};
 
int      main(int argc, char* argv[])
{
   try
   {
      step_move<tPlayer1,21>::execute_step<tNullType>();
   }
   catch( int player ) {
      std::cout << "Spieler #" << player << " hat das Spiel gewonnen.\n";
   }

   char e;
   std::cin >> e;

   return 0;
}

VC6.0 kann man bei diesem Code aber vergessen.
Wir wollen ja nicht den Leuten die Lösung vorsagen oder ? (auf der anderen Seite, wenn sie nicht allein auf die Lösung kommen, solten sie doch massiv von der Informatik abgeschreckt werden, oder ?)
Oh, I'm sorry! Das hab ich wohl total verpeilt.....coole Sache aber! Ich hab mich echt zurückhalten müssen um nicht jemanden seinen Programmierstil um die Ohren zu hauen  ;)
Ich hab mich echt zurückhalten müssen um nicht jemanden seinen Programmierstil um die Ohren zu hauen  ;)

Du meinst ja wohl nicht etwa meinen Programmierstil? >:( Da gibt es ja wohl nix dran zu meckern!

@Spawn:

Cool, das hat mir echt das Leben geretter!
Die anderen Spacken hier finden dass wohl voll toll, was die da machen! Aber die haben echt keine plan wie das ist wenn der Lehrer einem das echt nich erklären kan!

Und dieses Scheiss Forum löscht auch noch so hamlose Wörter wie Spacken!!!

Ich such mia jetz echt ein neues Forum!

Die anderen Spacken hier finden dass wohl voll toll, was die da machen! Aber die haben echt keine plan wie das ist wenn der Lehrer einem das echt nich erklären kan!

Nein, wir haben nen Plan wieviele 14jährige sone Popelaufgabe allein schaffen...

@ ,,,,

Nein, Dein Stil ist voll iO, gut die Goto-Geschichte weckt von Zeit zu Zeit immer mal wieder kleine aggressive Handlungen aus, aber ansonsten sehr okay (besonders vorschlag Nummer 2).

Aus dem grundsätzlichen Problem hier halt ich mich leber raus, ich such (wenns mich genügend interessiert) auch gern Hilfe in nem Forum, aber wie gesagt, ich halt mich raus.


« 3D-Anwendung mit SDLchar einlesen »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

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...


ChatGPT Cheat Codes: So nutzt du die KI wie ein Profi!
Nutze diese 5 Google Tools statt ChatGPT – sie sind viel besser!

Chrome Screenshot von ganzer Webseite (keine Plugins nötig!)
Screenshot von ganzer Webseite machen – mit nur 3 Klicks!