Hallo Surviver,
mittels meines BaseGame-Frameworks http://www.c-plusplus.net/forum/193889 habe ich auch "10000" umgesetzt. Hier ein Screenshot: http://www.bitel.net/dghm1164/screenshots/Dice.jpg
Meine Score-Berechnung sieht so aus:
class Game
{
public:
// ...
enum EState { NoScore, UnScore, Score, Scored };
int CalcScore();
private:
Player m_player[MaxPlayers];
struct SDie
{
int nNumber;
EState state;
};
SDie m_dice[MaxDice];
}
int Game::CalcScore()
{
int nNumbers[MaxNumbers+1] = { 0 };
for(int i=0; i<MaxDice; i++)
{
SDie &die = m_dice[i];
if(die.state != UnScore && die.state != Scored)
{
if(die.state == Score)
{
die.state = NoScore;
m_nScoredDice--;
}
nNumbers[die.nNumber]++;
}
}
int nScore = 0;
// long street
m_bStreet = true;
for(int i=1; i<=MaxNumbers; i++)
if(nNumbers[i] != 1)
{
m_bStreet = false;
break;
}
if(m_bStreet)
{
nScore = 2000;
m_nScoredDice = MaxDice;
for(int i=0; i<MaxDice; i++)
m_dice[i].state = Score;
}
else
{
for(int i=1; i<=MaxNumbers; i++)
{
if(nNumbers[i] >= 4)
{
nScore += (i == 1)? 10000 : 1000 * i;
nNumbers[i] -= 4;
SetDiceState(Score, NoScore, i, 4);
}
else if(nNumbers[i] == 3)
{
nScore += (i == 1)? 1000 : 100 * i;
nNumbers[i] -= 3;
SetDiceState(Score, NoScore, i, 3);
}
}
nScore += 100 * nNumbers[1];
SetDiceState(Score, NoScore, 1, nNumbers[1]);
nScore += 50 * nNumbers[5];
SetDiceState(Score, NoScore, 5, nNumbers[5]);
}
return nScore;
}
In Kürze:
- für jeden der 6 Würfel gibt es einen Status (NoScore, UnScore, Score, Scored), d.h. Unbewerted, vom Spieler verworfener Würfel, aktuell gewertet, in vorherigen Wurf gewertet)
- dann wird im Array 'nNumbers' die Anzahl jeder der 6 Zahlen ermittelt
- zuerst wird auf eine "Straße" untersucht (jede Zahl genau 1 mal vorhanden) - ohne Bestätigung(!)
- ansonsten werden zuerst die 4er und 3er Paschs ermittelt und zuletzt dann noch die einzelnen 1 und 5 (d.h. 100 und 50 Punkte) hinzuaddiert (daher wird bei den Paschs die nNumbers um 4 bzw. 3 erniedrigt, damit diese dann nicht noch bei den 1 und 5 dazugezählt werden, z.B. 5 Einsen zählen also 10000 (4 Einsen) + 100 (1 Eins) = 10100 Punkte)
(die Funktion 'SetDiceState' sorgt dann dafür, daß der Status der Würfel richtig aktualisiert wird)
Meine Bewertung unterscheidet sich aber leicht von deiner, aber es gibt ja auch zig Varianten, s.a. http://de.wikipedia.org/wiki/Zehntausend
Die Änderungen müßtest du also entsprechend einbauen (z.B. Pärchen).
Du solltest aber auf jeden Fall zuersteinmal dein Programm in Funktionen unterteilen bzw. eine eigene Klasse erzeugen.
Viel Erfolg!