Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

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

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
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...

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

@ ,,,,

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!
Internet-Zugriffsprogramm
Ein Internet-Zugriffsprogramm, auch Browser genannt, stellt Internetseiten für den Benutzer dar. Am bekanntesten ist der Microsoft Internet Explorer, gefolgt vom kos...

Programm
Siehe Software...

Zugriffszeit
In Milisekunden angegebene Zeit, die das Speichermedium zum Erreichen der gesuchten Daten braucht. Die Zeit ist abhängig vom technischen Verfahren des Mediums sowie ...