Highscore in Kniffel
-
Hallo zusammen,
ich habe ein Problem..
Ich habe Kniffel für den Schulunterricht programmieren müssen. Es funktioniert soweit ..Aber ..
Ich möchte nun eine Highscore miteinbinden?
Weiß aber nicht wie das geht..
Quellcode:#pragma hdrstop #include <iostream> #include <string> #include <conio> #include <fstream> #include "colors.h" // header Datei für Farbenzuweisung using namespace std; #define UNBENUTZT -1 #define BONUS_MIN 63 #define BONUS 35 // ################################################################### // die benoetigten Datentypen // ################################################################### // hier das Kniffelblatt, in dem die Würfelergebnisse abgelegt werden #define E_EINSER 0 #define E_ZWEIER 1 #define E_DREIER 2 #define E_VIERER 3 #define E_FUENFER 4 #define E_SECHSER 5 #define E_ZWSUMMEOBEN 6 #define E_BONUS 7 #define E_SUMMEOBEN 8 #define E_DREIERPASCH 9 #define E_VIERERPASCH 10 #define E_FULLHOUSE 11 #define E_KLEINESTRASSE 12 #define E_GROSSESTRASSE 13 #define E_KNIFFEL 14 #define E_CHANCE 15 #define E_SUMMEUNTEN 16 #define E_ENDSUMME 17 #define E_N E_ENDSUMME+1 typedef int Ergebnis[E_N]; // hier die Infos zu einem Wuerfel (fixiert=true: nicht wuerfeln) typedef struct Wuerfel { int wert; bool fixiert; } Wuerfel; #define ANZAHL_WUERFEL 5 #define ANZAHL_WUERFE 3 #define WUERFEL_AUGEN 6 #define ANZAHL_RUNDEN 13 // 1-6 oben + 7 unten = 13 // nur 1 Kniffel möglich! // ################################################################### // die benoetigten Daten (Variablen) // ################################################################### static Ergebnis ergebnis; static Wuerfel wuerfel[ANZAHL_WUERFEL]; static int wuerfe; // wie oft gewuerfelt? 0-3 static int runden; // wieviel runden gespielt? 0-13 static int analyse[WUERFEL_AUGEN]; // welche Augenzahl ist wie oft vertreten? // ################################################################### // Initialisierungsfunktionen // ################################################################### static void InitialisiereErgebnis() { for( int i = 0 ; i < E_N; i++ ) ergebnis[i]=UNBENUTZT; } static void InitialisiereWuerfel() { for( int i = 0; i < ANZAHL_WUERFEL; i++ ) { wuerfel[i].wert = UNBENUTZT; wuerfel[i].fixiert = false; } } static void InitialisiereAnalyse() { for( int i = 0 ; i < WUERFEL_AUGEN; i++ ) analyse[i]=0; } static void Initialisieren() { InitialisiereErgebnis(); InitialisiereWuerfel(); wuerfe=0; runden=0; srand(time(NULL)); // initialisiert den Zufallsgenerator } // ################################################################### // Speicherfunktionen // ################################################################### static bool IndexUnbenutzt(int index, char c) { int zahl = index + 1; if (ergebnis[index] == UNBENUTZT ) return true; else { cout << "Wert fuer " << c << " bereits gespeichert, ignoriert (" << index << ").\n"; return false; } } static bool ZahlSpeichern(int index) { int zahl = index + 1; char c = zahl + '0'; int summe = 0; if ( ! IndexUnbenutzt(index,c)) return false; for( int i = 0; i < ANZAHL_WUERFEL; i++ ) { if ( wuerfel[i].wert == zahl ) summe+=zahl; } ergebnis[index]=summe; cout << "Wert " << summe << " fuer " << c << " [" << index << "] gespeichert.\n"; return true; } static int AugenSumme() { int summe = 0; for( int i = 0; i < ANZAHL_WUERFEL; i++ ) summe+=wuerfel[i].wert; return summe; } static bool DreierpaschSpeichern(int index) { // Punkte = Augen aller Wuerfel bool treffer = false; if ( ! IndexUnbenutzt(index,'d')) return false; // ist irgendeine Augenzahl 3mal vorhanden? for( int i = 0; i < WUERFEL_AUGEN; i++ ) { if (analyse[i] == 3) { treffer = true; break; } } if ( treffer ) ergebnis[index]=AugenSumme(); else ergebnis[index]=0; cout << "Wert " << ergebnis[index] << " fuer d [" << index << "] gespeichert.\n"; return true; } static bool ViererpaschSpeichern(int index) { // Punkte = Augen aller Wuerfel bool treffer = false; if ( ! IndexUnbenutzt(index,'v')) return false; // ist irgendeine Augenzahl 4mal vorhanden? for( int i = 0; i < WUERFEL_AUGEN; i++ ) { if (analyse[i] == 4) { treffer = true; break; } } if ( treffer ) ergebnis[index]=AugenSumme(); else ergebnis[index]=0; cout << "Wert " << ergebnis[index] << " fuer v [" << index << "] gespeichert.\n"; return true; } static bool FullhouseSpeichern(int index) { // Punkte = 25 bool treffer2 = false; bool treffer3 = false; if ( ! IndexUnbenutzt(index,'f')) return false; // ist irgendeine Augenzahl 2mal und eine andere 3mal vorhanden? for( int i = 0; i < WUERFEL_AUGEN; i++ ) { if (analyse[i] == 2) { treffer2 = true; break; } } for( int i = 0; i < WUERFEL_AUGEN; i++ ) { if (analyse[i] == 3) { treffer3 = true; break; } } if ( treffer2 && treffer3 ) ergebnis[index]=25; else ergebnis[index]=0; cout << "Wert " << ergebnis[index] << " fuer f [" << index << "] gespeichert.\n"; return true; } static bool KleineStrasseSpeichern(int index) { // Punkte = 30 bool treffer = false; int start = UNBENUTZT; if ( ! IndexUnbenutzt(index,'k')) return false; // gibt es 4 aufeinanderfolgende Augenzahlen? for( int i = 0; i < WUERFEL_AUGEN; i++ ) { if (start == UNBENUTZT) { // bisher noch keine Würfel gefunden if (analyse[i] == 0) // und immer noch kein Würfel gefunden continue; if (analyse[i+1] == 0) // und immer noch kein Würfel gefunden continue; // i+2 ist die erste Augenzahl, die mindestens ein Wuerfel zeigt start=i; if (i > 2) // wenn das hier eine 3 ist (also Augenzahl 4), // kann es keine kleine Straße mehr werden break; } else { if (analyse[i] != 0) { // auch mit dieser Augenzahl i+1 gibt es mindestens einen Wuerfel if ( (i-start+1) >= 4 ) { // wir haben jetzt 4 aufeinanderfolgende Augenzahlen gehabt treffer = true; break; } } else { // wohl keine kleine Strasse break; } } } if ( treffer ) ergebnis[index]=30; else ergebnis[index]=0; cout << "Wert " << ergebnis[index] << " fuer k [" << index << "] gespeichert.\n"; return true; } static bool GrosseStrasseSpeichern(int index) { // Punkte = 40 bool treffer = false; int start = UNBENUTZT; if ( ! IndexUnbenutzt(index,'g')) return false; // gibt es 5 aufeinanderfolgende Augenzahlen? for( int i = 0; i < WUERFEL_AUGEN; i++ ) { if (start == UNBENUTZT) { // bisher noch keine Würfel gefunden if (analyse[i] == 0) // und immer noch kein Würfel gefunden continue; // i+1 ist die erste Augenzahl, die mindestens ein Wuerfel zeigt start=i; if (i > 1) // wenn das hier eine 2 ist (also Augenzahl 3), // kann es keine große Straße mehr werden break; } else { if (analyse[i] != 0) { // auch mit dieser Augenzahl i+1 gibt es mindestens einen Wuerfel if ( (i-start+1) >= 5 ) { // wir haben jetzt 5 aufeinanderfolgende Augenzahlen gehabt treffer = true; break; } } else { // wohl keine kleine Strasse break; } } } if ( treffer ) ergebnis[index]=40; else ergebnis[index]=0; cout << "Wert " << ergebnis[index] << " fuer g [" << index << "] gespeichert.\n"; return true; } static bool KniffelSpeichern(int index) { // Punkte = 50 bool treffer = false; if ( ! IndexUnbenutzt(index,'K')) return false; // gibt es 5 gleiche Augenzahlen? for( int i = 0; i < WUERFEL_AUGEN; i++ ) { if (analyse[i] == 5) { treffer = true; break; } } if ( treffer ) ergebnis[index]=50; else ergebnis[index]=0; cout << "Wert " << ergebnis[index] << " fuer K [" << index << "] gespeichert.\n"; return true; } static bool ChanceSpeichern(int index) { // Punkte = Augen aller Wuerfel if ( ! IndexUnbenutzt(index,'c')) return false; ergebnis[index]=AugenSumme(); cout << "Wert " << ergebnis[index] << " fuer c [" << index << "] gespeichert.\n"; return true; } // ################################################################### // Analysefunktion // ################################################################### static void AnalyseDurchfuehren(); static bool WurfSpeichern(char *zeile) { bool ok = false; if ( wuerfe == 0 ) { cout << color_Rot << "\n ==> Es wurde noch nicht gewuerfelt. <==\n" << color_Gruen; } else { InitialisiereAnalyse(); AnalyseDurchfuehren(); switch( zeile[1] ) { case '1': case '2': case '3': case '4': case '5': case '6': ok=ZahlSpeichern(zeile[1]-'1');break; case 'd': ok=DreierpaschSpeichern(E_DREIERPASCH);break; case 'v': ok=ViererpaschSpeichern(E_VIERERPASCH);break; case 'f': ok=FullhouseSpeichern(E_FULLHOUSE);break; case 'k': ok=KleineStrasseSpeichern(E_KLEINESTRASSE);break; case 'g': ok=GrosseStrasseSpeichern(E_GROSSESTRASSE);break; case 'K': ok=KniffelSpeichern(E_KNIFFEL);break; case 'c': ok=ChanceSpeichern(E_CHANCE);break; default: cout << color_Rot << "Unbekannter Speicherort ( " << color_Weiss << zeile[1] <<color_Rot <<" ), ignoriert.\n" << color_Gruen; } if (ok) { wuerfe=0; runden++; } } return ok; } // ################################################################### // Berechnungsfunktionen // ################################################################### static void AnalyseDurchfuehren() { for( int i = 0; i < ANZAHL_WUERFEL; i++ ) analyse[wuerfel[i].wert-1]++; cout << "\nAnalyse: "; for( int i = 0; i < WUERFEL_AUGEN; i++ ) cout << " " << analyse[i] << "x" << i+1; cout << ".\n"; } static void KniffelblattBerechnen() { int osumme; int usumme; // obere summe berechnen osumme=0; for( int i = E_EINSER; i <= E_SECHSER; i++ ) { if (ergebnis[i] != UNBENUTZT) osumme+=ergebnis[i]; } ergebnis[E_ZWSUMMEOBEN]=osumme; // bonus? if (ergebnis[E_ZWSUMMEOBEN] < BONUS_MIN) ergebnis[E_BONUS]=0; else ergebnis[E_BONUS]=BONUS; ergebnis[E_SUMMEOBEN]=osumme+ergebnis[E_BONUS]; // untere summe berechnen usumme=0; for( int i = E_DREIERPASCH; i <= E_CHANCE; i++ ) { if (ergebnis[i] != UNBENUTZT) usumme+=ergebnis[i]; } ergebnis[E_SUMMEUNTEN]=usumme; // summe berechnen ergebnis[E_ENDSUMME]=ergebnis[E_SUMMEOBEN]+ergebnis[E_SUMMEUNTEN]; } static int Wurf() { return rand() % WUERFEL_AUGEN + 1; } static void Wuerfeln() { int i; if (wuerfe==ANZAHL_WUERFE) cout << " ==> !!! Keine weiteren Wuerfe moeglich (max. " << ANZAHL_WUERFE << "). !!! <==\n"; else { int n = 0; for( i = 0; i < ANZAHL_WUERFEL; i++ ) { if ( ! wuerfel[i].fixiert) { wuerfel[i].wert=Wurf(); if (n==0) cout << color_Weiss << "\nWuerfle: " ; cout << " w" << i+1 << color_Weiss << " = " << color_Gruen << wuerfel[i].wert << " " << color_Weiss; n++; } } if ( n > 0 ) { wuerfe++; cout << "\n"; } } } static void WuerfelErmitteln(char *zeile) { int i; int n = 0; for( i = 0; i < ANZAHL_WUERFEL; i++ ) wuerfel[i].fixiert=true; if (zeile[1] == 'a') { for( i = 0; i < ANZAHL_WUERFEL; i++ ) { wuerfel[i].fixiert=false; n++; } } else { for( i = 1; zeile[i] != '\0' && zeile[i] != '\n'; i++ ) { int w = zeile[i] - '0'; if ( w < 1 || w > ANZAHL_WUERFEL ) cout << "Wuerfelnummer " << w << " ungueltig, ignoriert.\n"; else { wuerfel[w-1].fixiert=false; n++; } } } if ( n == 0 ) cout << color_Rot << "\nUnbekannte Wuerfelbezeichnung, ignoriert.\n" <<color_Gruen; } static void WuerfelSetzen(char *zeile) { // erleichtert das Testen !! int i; int n = 0; for( i = 1; zeile[i] != '\0' && zeile[i] != '\n' && i <= 5; i++ ) { int w = zeile[i] - '0'; if ( w < 1 || w > WUERFEL_AUGEN ) cout << "Augenzahl " << w << " ungueltig, ignoriert.\n"; else { wuerfel[n].wert=w; n++; } } if (wuerfe < ANZAHL_WUERFE) wuerfe++; } // ################################################################### // Ausgabefunktionen // ################################################################### static void WertAusgeben(char *name, int wert) { cout << name; if (wert!=UNBENUTZT) cout << wert; cout << "\n"; } static void KniffelblattAusgeben() { cout << color_Weiss << "\nAktuelles Kniffelblatt:\n" <<color_Gruen; KniffelblattBerechnen(); WertAusgeben(" Einser ",ergebnis[E_EINSER]); WertAusgeben(" Zweier ",ergebnis[E_ZWEIER]); WertAusgeben(" Dreier ",ergebnis[E_DREIER]); WertAusgeben(" Vierer ",ergebnis[E_VIERER]); WertAusgeben(" Fuenfer ",ergebnis[E_FUENFER]); WertAusgeben(" Sechser ",ergebnis[E_SECHSER]); WertAusgeben(" Gesamt ",ergebnis[E_ZWSUMMEOBEN]); WertAusgeben(" Bonus ",ergebnis[E_BONUS]); WertAusgeben(" Gesamt oberer Teil ",ergebnis[E_SUMMEOBEN]); WertAusgeben(" Dreierpasch ",ergebnis[E_DREIERPASCH]); WertAusgeben(" Viererpasch ",ergebnis[E_VIERERPASCH]); WertAusgeben(" Full House ",ergebnis[E_FULLHOUSE]); WertAusgeben(" Kleine Strasse ",ergebnis[E_KLEINESTRASSE]); WertAusgeben(" Grosse Strasse ",ergebnis[E_GROSSESTRASSE]); WertAusgeben(" Kniffel ",ergebnis[E_KNIFFEL]); WertAusgeben(" Chance ",ergebnis[E_CHANCE]); WertAusgeben(" Gesamt unterer Teil ",ergebnis[E_SUMMEUNTEN]); WertAusgeben(" Gesamt oberer Teil ",ergebnis[E_SUMMEOBEN]); WertAusgeben(" Endsumme ",ergebnis[E_ENDSUMME]); } static void WuerfelAusgeben() { int i; cout << color_Weiss << "\nAktuelle Wuerfel (" << color_Rot << runden+1 << color_Weiss << "." << color_Rot <<"Runde" << color_Weiss << "): "<< color_Gruen <<"\n"; if (wuerfe==0) cout << " Es wurde noch nicht gewuerfelt.\n"; else { cout << color_Weiss << " nach " << color_Rot << wuerfe << color_Weiss << "." << color_Rot << "Wurf" << color_Weiss << ":" << color_Gruen; for ( i = 0; i < ANZAHL_WUERFEL; i++ ) { cout << " " << wuerfel[i].wert; } cout << "\n"; } } static void PromptAusgeben() { cout << "\n_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_\n"; cout << "Kniffel (h fuer Hilfe): "; } static void Hilfe() { cout << "\nh diese Hilfe\n"; cout << "l Kniffelblatt und Wuerfel ausgeben\n"; cout << "wa alle Wuerfel neu wuerfeln\n"; cout << "w135 Wuerfel 1, 3 und 5 neu wuerfeln (alle anderen bleiben liegen!)\n"; cout << "sx Wurf speichern unter Ergebnis x, wobei x\n"; cout << " 1 Einser\n"; cout << " 2 Zweier\n"; cout << " 3 Dreier\n"; cout << " 4 Vierer\n"; cout << " 5 Fuenfer\n"; cout << " 6 Sechser\n"; cout << " d Dreierpasch\n"; cout << " v Viererpasch\n"; cout << " f Fullhouse\n"; cout << " k kleine Strasse\n"; cout << " g grosse Strasse\n"; cout << " K Kniffel\n"; cout << " c Chance\n"; cout << " danach wird automatisch das Kommando 'l' ausgefuehrt.\n"; cout << "e Spiel beenden\n"; } // ################################################################### // Hauptroutine zur Kommandobearbeitung // ################################################################### static void KommandoEinlesenUndAusfuehren(bool *spiel_zu_ende) { char zeile[1024]; bool gespeichert; // Zeile einlesen gets(zeile); // Kommando analysieren und ausfuehren switch( zeile[0] ) { case 'h': Hilfe();break; case 'l': KniffelblattAusgeben();WuerfelAusgeben();break; case 'w': WuerfelErmitteln(zeile);Wuerfeln();WuerfelAusgeben();break; case '=': WuerfelSetzen(zeile);WuerfelAusgeben();break; // zum Testen case 'i': Initialisieren();break; // zum Testen case 's': gespeichert=WurfSpeichern(zeile); if (gespeichert) { KniffelblattAusgeben(); } if (runden == ANZAHL_RUNDEN) { cout << "\n\n >>> IHR ERGEBNIS LAUTET: " << color_Gelb << ergebnis[E_ENDSUMME] << color_Gruen << " - herzlichen Glueckwunsch! <<< \n"; Initialisieren(); } break; case 'q': case 'e': cout << "Bye!";*spiel_zu_ende=true;return; default: cout << color_Rot << "\n ==> !!! Unbekanntes Kommando ( " << color_Weiss << zeile << color_Rot << " }, ignoriert. !!! <== \n" <<color_Gruen; } } // ################################################################### // Highscore // ################################################################### /*static void Alserstesausgeben() { cout << " Geben Sie ihren Namen ein: "; string name; cin >> name; getchar(); }*/ // ################################################################### // das Hauptprogramm // ################################################################### int main() { cout << color_Gruen <<" "; bool spiel_zu_ende = false; Initialisieren(); //Hier müsste noch Highscore also Alserstesausgeben(); rein... while ( ! spiel_zu_ende ) { PromptAusgeben(); KommandoEinlesenUndAusfuehren(&spiel_zu_ende); } }
Danke schonmal für eure Hilfe
Knodan
-
Hallo,
das nenne ich mal ein Quellcode-Posting!
So erhälst Du bestimmt noch zusätzliche Tips zu Deinem Prog.
(oder der vormals interessierte Leser steigt gleich wieder aus! -sehr wahrscheinlich)
Im Allgemeinen postet man nur den Code, der für die Fragestellung unmittelbar relevant ist!Ich bin jetzt nicht tiefer in die Materie eingestiegen, aber so grob würde ich es über eine Textdatei versuchen. In der können dann die Highscores mit Namen stehen (evtl. zu Anfang eine leere Textdatei zum Prog mitliefern). Am Ende eines Spiel's greift man dann auf die Textdatei zu und vergleicht den aktuellen Punktestand mit dem in der Highscore-Liste. Ist der aktuelle P.Stand unter dem letzen Highscore-Eintrag, war's das. Ist er drüber, muss der akt. P.Stand mit dem Spielername in die Liste einsortiert werden.
Nach dem Prog.Start kann man die H.Score-Liste natürlich dann auch schonmal anzeigen lassen o. viell. sogar während des ganzen Spiels (irgendwo an der Seite).
Zum Arbeiten mit Dateien gibts hier im Forum wirklich viele Beiträge, da ist bestimmt Alles Wichtige dabei...MfG
-
Hallo
Schau dir die FAQ im C++ Forum an, da gibts einen Thread zum Thema Dateien und Ströme.
Desweiteren ist das ein reins Konsolenprogramm und wird deshalb verschoben.
bis bald
akari
-
Dieser Thread wurde von Moderator/in akari aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
lso ich hab des so gemacht:
#include<iostream> #include<fstream> using namespace std; int main() { //......... string line; ifstream file_stream ("C:\\highscore.txt"); while(!file_stream.eof() && getline(file_stream, line)) //einlesen und wieder geben der Highscore //.... string line; ofstream file_stream("c:\\highscore.txt",ios::out); file_stream<<" "; file_stream.close(); //inhalt löschen //.... ofstream file_stream("C:\\highscore.txt",ios::app); file_stream <<vorname<<" "<<name<<"\n"; file_stream.close(); //Vorname und nachname in ein txt document speicern(mit dem Datum hab ich mich noch net beschäftigt)