Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » ermitteln wer gewonnen hat...if/for/..

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
29.03.2004, 16:55 Uhr
Fraenky



hi Leute!
ich habe ein Probelm, denn ich bin wahrscheinlich zu doof, einen Sieger zu ermitteln. Also es wird gewürfelt und wer die Zahl richtig geraten hat, soll gewonnen haben; dazu gibt die Klasse Spiel mit der Funktion gewonnen():


C++:
int CSpiel::gewonnen(int zahl_eing_m, int zahl_eing_c, int zzahl)
{
mzahl=zahl_eing_m;
czahl=zahl_eing_c;
int x;
if(mzahl == zzahl)
{
// Mensch hat gewonnen
x=1;
}
if(czahl == zzahl)
{
// Computer hat gewonnen
x=2;
}
if(mzahl != zzahl && czahl != zzahl)
{
// Keiner hat gewonnen
x=0;    
}
return x;
};



es werden also immer verschiedene x Werte zurückgeliefert, je nachdem wer gewonnen hat..
Mensch x=1, PC x=2, Keiner x=0

im Hauptprogramm wird dann per for Schleife, welche spieler[anzahl] durchläuft, ermittlet, wer gewonnen hat:


C++:
for(i=0; i<anzahl; i++)
  {
  zahl_eing_m[i]=spieler[i].returnZahl();
  sname[i]=spieler[i].returnName();
  ix=Spiel[i].gewonnen(zahl_eing_m[i], zahl_eing_c, zzahl);

  iy=ix;
   while(iy>0)
   {
    if(ix == 2)//wenn x gleich 1 ist hat der Computer gewonnen und die Schleife wird abgebrochen..
     {
     cout << " Der Computer hat gewonnen!";
     break;
     }
     if(ix == 1)//wenn x gleich 1 ist, hat ein Mensch gewonnen
     {
     cout << " " << sname[i];
     cout << " hat gewonnen!" << endl;
     }
     if(ix == 0) // Keiner hat gewonnen
     {
     cout << " Keiner hat gewonnen!" << endl;    
     }
   }//while
  }// for



so wenn aber zB der 1. Spieler gewonnen hat, so steht dort: Spieler 1 hat gewonnen! und dann wird aber die For Schleife weiter durchlaufen und wenn die beiden anderen (ich geh jetzt erstmal für 3 Spieler aus..) nicht gewonnen haben, steht dort zusätzlich Keiner hat gewonnen. Ich möchte aber nur das dort steht wer gewonnen hat und nicht wer nicht gewonnen hat..
Und wenn keiner gewonnen hat soll die Meldung nur einmal erschein und nicht spieler[anzahl] mal (hier 3..)
also nur es hat der und der gewonnen..
Hab schon alles mögliche ausprobiert, aber irgendwie klappt nichts so wie ich es mir vorgestellt hab..
(ich dacht daran noch einen Wert in der for Schleife zu belegen:
if(ix == 1)
{
//Mensch..
iy=-1;
}
und dann nach der for Schleife:
if(iy == 0)
{
//keiner hat gewonnen..
}
aber wenn der 2te Spieler gewonnen hat, wird die For schleife ja nochmal durchlaufen und wenn der 3te Spieler nicht gewonnen hat wird ja iy wieder zu Null und dann steht dort wieder Keiner hat gewonnen..)

Hoffe das ihr mich verstanden habt.
Ist doch nur ein Logikfehler im Denken oder nicht?? Ich kanns mir irgendwie nicht vorstellen, wei ich die ganzen if Anweisungen platzieren soll und welche Variablen ich vergeben soll...

THX!!

MfG
Fraenky
--
Welcome to the real World.

www.fraenkysweb.de

Dieser Post wurde am 29.03.2004 um 16:56 Uhr von Fraenky editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.03.2004, 17:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


dann erweiter die forschleife einfach noch um ein flag wert den du auf false setzt wenn du nicht mehr willst das die schleife weiter durchlaufen wird


C++:
int tralala=1
for(i=0; i<anzahl && tralala; i++){

....//wenn du hier innerhalb der schleife irgendwo tralala auf 0 setzt wird beim nächsten mal die schleife nichtmehr durchlaufen

}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.03.2004, 17:42 Uhr
Fraenky



hilft auch nicht..es kommt trotzdem noch entsprechend der Spieler Anzahl die Meldung dass "Keiner gewonnen" oder nur der und der gewonnen und die und die nicht gewonnen haben..

also das grundgerüst sieht so aus:


C++:
for(i=0; i<anzahl; i++)
  {
  zahl_eing_m[i]=spieler[i].returnZahl();
  sname[i]=spieler[i].returnName();
  ix=Spiel[i].gewonnen(zahl_eing_m[i], zahl_eing_c, zzahl/*, sname[i]*/);

     if(ix == 2)//wenn x gleich 1 ist hat der Computer gewonnen und die Schleife wird abgebrochen..
     {
     cout << " Der Computer hat gewonnen!";
     break;
     }
     if(ix == 1)//wenn x gleich 1 ist, hat ein Mensch gewonnen
     {
     cout << " " << sname[i];
     cout << " hat gewonnen!" << endl;
     }
     if(ix == 0) // Keiner hat gewonnen
     {
     cout << " Keiner hat gewonnen!" << endl;
     }
  }// for



ich weiß gar nicht mehr weiter...
--
Welcome to the real World.

www.fraenkysweb.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.03.2004, 17:43 Uhr
mmc20
puss in boots


hi, naja es könnte ja sein das noch ein spieler gewonnen hat, also wäre folgendes besser

C++:
...
int iAnzahlGewinner = 0;
for(i=0; i<anzahl; i++)
{
  if ( 1 == Spiel[ i ].gewonnen(zahl_eing_m[ i ], zahl_eing_c, zzahl) )
  {
     cout << " " << sname[ i ];
     cout << " hat gewonnen!" << endl;
     iAnzahlGewinner++;
  }
}
if ( iAnzahlGewinner == 0 ) // Keiner hat gewonnen
{
   cout << " Keiner hat gewonnen!" << endl;    
}
...

die abfrage ob der computer gewonnen hat kannste dir ja eigentlich schenken, oder spielt jeder spieler separat gegen den computer ?
ich versteh das so das 3 spieler und der computer ( also insgesammt 4 ) gleichzeitig raten welche zahl gewürfelt wurde, oder ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.03.2004, 18:00 Uhr
Fraenky



also eigentlich spielt jeder Spieler für sich alleine und wer gewinnt ist der held.. ...der Computer ist nur da, als Mitspiler, wenn jemand alleine (also nur 1 Spieler-> dann insgesamt 2: Mensch+PC) spielt, als Bot sozusagen..

werd dein Code mal ausprobieren! muss nu aba los zur fahrschule...

cya..

MfG
Faenky
--
Welcome to the real World.

www.fraenkysweb.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.03.2004, 15:54 Uhr
Fraenky



also der Code funzt auch net, es kommt immer Keiner hat gewonnen - egal ob einer gewonnen hat oder nicht..
--
Welcome to the real World.

www.fraenkysweb.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.03.2004, 16:00 Uhr
~toxic
Gast


hallo, vielleicht stimmt ja was mit deiner abfrage nicht teste doch mal so

C++:

...
int iAnzahlGewinner = 0;
for(i=0; i<anzahl; i++)
{
  if ( zahl_eing_m[ i ] == zzahl ) // <--
  {
     cout << " " << sname[ i ];
     cout << " hat gewonnen!" << endl;
     iAnzahlGewinner++;
  }
}
if ( iAnzahlGewinner == 0 )
{
   cout << " Keiner hat gewonnen!" << endl;    
}
else
{
     cout << "Es haben " << iAnzahlGewinner;
     cout << " Spieler gewonnen!" << endl;
}
...

--
gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
01.04.2004, 16:00 Uhr
Fraenky



hi,
nein mit diesem Code gibt er auch nur aus "Keiner hat gewonnen!"...Obwohl zB der 1. oder 2. Spieler gewonnen gat...
--
Welcome to the real World.

www.fraenkysweb.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.04.2004, 18:10 Uhr
~toxic
Gast


hi, dann lass dir doch mal die zahlen spasseshalber ausgeben, ich vermute mal das da der fehler ist bist du sicher das die zahlen auch in "zahl_eing_m[ i ]" gespeichert wurden ? bzw. "zzahl" eine integer im gültigen bereich ist, also von 1 bis 6 ? oder die schleife überhaupt durchlaufen wird ? zeig doch mal ein bisschen mehr code, meine oracle-kugel ist zur reparatur

C++:
...
int iAnzahlGewinner = 0;
int zzahl = 3;
int anzahl = 3;
int tips[3] = {1,2,3};

for ( i = 0; i < anzahl; i++ )
{
    cout << " Spieler " << i+1 << " hat " << tips[i] << " getippt. " ;
    if ( tips[ i ] == zzahl ) // <--
    {
        cout << " " << sname[i];
        cout << " hat richtig getippt." << endl;
        iAnzahlGewinner++;
    }
}
if ( iAnzahlGewinner == 0 )
{
   cout << " Keiner hat gewonnen!" << endl;    
}
else
{
     cout << "Es haben " << iAnzahlGewinner;
     cout << " Spieler gewonnen!" << endl;
}
...

--
gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.04.2004, 21:03 Uhr
Fraenky



ja klar der integer zzahl ist in Ordung:


C++:
void CWurfel::ermittleZahl()
{
int max=6;
int min=1;
int isrand=0;

if(isrand == 0)
{
srand(time(NULL));
isrand=1;
}
zahl=min+rand()%(max-min+1);
};

int CWurfel::zeigeZahl()
{
return zahl;
};


das steht inner Klasse mit der die Zufalllszahl zzahl ermittelt wird...und hier dann im hauptprog:

C++:
zzahl=Wurfel.zeigeZahl();
//mit cout wird dann auch die Zufallszahl korrekt ausgegeben..
cout << zzahl;



also meiner Meinung ist das alles io aber ich vermutet folgendes:
wenn zB der erste Spieler gewonnen hat, dann steht dort "S1 hat gewonnen"
aber die for Schleife wird ja anzahl[spieler] durchlaufen, d.h. wenn die anderen beiden nicht gewonnen haben, dann steht dort halt nicht gewonnen und das 2 mal...wenn ich aber nachdem einer gewonnen hat abbreche (break inner for Schleife), dann kann immer nur einer gewonnen haben auch wenn zB 2 Spieler die gleiche zahl richitg geraten haben. So ist aber der erste Spieler im Vorteil, weil wenn er gewonnen hat wird die Schleife abgebrochen unabhängig ob noch der 2. oder 3. Spieler ebenfalls richtig getippt und damit gewonnen haben..najut werd mich morgen nochmal melden..muss nu ausmachen..

cya!
THX!

MfG
Fraenky
--
Welcome to the real World.

www.fraenkysweb.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: