-
14. 12. 2008, 01:20 #1Mitglied
- Registriert seit
- Sep 2008
- Beiträge
- 182
Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
Hallo werte Gullianer,
ich bin totaler C Anfänger, nur so zur Information. Ich habe ein kleines Zahlenratespiel programmiert, das zwei große Probleme hat:
1. Es gibt keine zufällige Zahl. Es wird irgendwie immer dieselbe Zahl ausgegeben (trotz Zufallszahlenfunktion, die irgendwie nicht geht). Kennt jemand eine bessere Funktion?
2. Ich kann keine Schleifen programmieren. Ich arbeite mich gerade durch das wikibooks tut, komm damit aber nicht zurecht. Hätte jemand Ideen für eine Schleife, die, wenn der User falsch rät, ihn nochmal raten lässt und auf eine bestimmte Anzahl von Versuchen limitiert ist (z.B. 15)?
PS: Könnte man swas in eine grafische Oberfläche packen (z.B. Schaltflächen zum Beenden des Programms oder Neustarten des Spiels)?
Danke schonmal im Voraus,
verrueckt
-
14. 12. 2008, 01:51 #2
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
1.
Auf einem PC gibt es keine richtigen zufallszahlen, sondern sie werden immer nach einem Algorithmus generiert.
Am besten initialisierst du die Zufallsfunktion mit
Damit werden die Zufallszahlen schonmal Zeitabhängig.PHP-Code:srand(time(NULL))
Dafür musst da aber auch time.h einbinden.
2.
PHP-Code:int versuche=0;
do{
/*.
.
.
.
wenn der spieler richtig errät{
goto richtig;
}
sonst {
goto falsch;
}*/
versuche++;
}while (versuche<15);
printf("Du hast es nicht geschafft\n");
return 0;
richtig:
printf("Du hast es geschafft");
return 0;
-
14. 12. 2008, 02:02 #3Mitglied
(Threadstarter)
- Registriert seit
- Sep 2008
- Beiträge
- 182
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
1. Ich brauche zeitunabhängige Zufallszahlen, da in der selben Minute mehrere Spiele gespielt werden können.
2.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int a, e, x;
unsigned int zahl;
x = 2000-rand()%1000;
printf ("Hier eine geratene Zahl zwischen 1 und 999 eingeben:");
scanf ("%d", &zahl);
if(zahl<x)
{
printf("Die geratene Zahl ist kleiner");
}
else if(zahl>x)
{
printf("Die geratene Zahl ist groesser");
}
else if(zahl==x)
{
printf("Die Zahl ist richtig geraten!");
}
getch();
}
Wie binde ich eine while-Funktion ein und wo, die abhängig von der Anzahl der Versuche andere Bewertungen ausspuckt, z.B. in Schulnotenform?
-
14. 12. 2008, 02:55 #4
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
Die Zeit dient nur zum initialisieren...
Es sind ja trotzdem immer noch Zufallszahlen und nicht immer die selben.
2.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int a, e, x,richtig;
e=0;
richtig=0;
unsigned int zahl;
srand(TIME(NULL));
x = 2000-rand()%1000;
printf ("Hier eine geratene Zahl zwischen 1 und 999 eingeben:");
do{
scanf ("%d", &zahl);
if(zahl<x)
{
printf("Die geratene Zahl ist kleiner");
}
else if(zahl>x)
{
printf("Die geratene Zahl ist groesser");
}
else if(zahl==x)
{
printf("Die Zahl ist richtig geraten!");
richtig=1;
}
e++;
} while (richtig==0&&e<15);
getch();
}
-
14. 12. 2008, 03:21 #5Mitglied
(Threadstarter)
- Registriert seit
- Sep 2008
- Beiträge
- 182
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
hab jetzt noch ein paar Fehler beseitigt und mein Bewertungssystem hinzugefügt:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int a, e, x,richtig;
e=0;
richtig=0;
unsigned int zahl;
srand(TIME(NULL));
x = 2000-rand()%1000;
printf ("Hier eine geratene Zahl zwischen 1 und 999 eingeben:");
do
{
scanf ("%d", &zahl);
if(zahl<x)
{printf("Die geratene Zahl ist kleiner");}
else if(zahl>x)
{printf("Die geratene Zahl ist groesser");}
else if(zahl==x)
{printf("Die Zahl ist richtig geraten!");
richtig=1;}
e++;
}
while (richtig==0&&e<16);
if (zahl==1)
{
printf("Sehr Gut (1+)");
}
else if (zahl==2);
{
printf("Sehr Gut(1)");
}
else if (zahl==3);
{
printf("Sehr Gut(1-)");
}
else if (zahl==4);
{
printf("Gut(2+)");
}
else if (zahl==5);
{
printf("Gut(2)");
}
else if (zahl==6);
{
printf("Gut(2-)");
}
else if (zahl==7);
{
printf("Befriedigend(3+)");
}
else if (zahl==8);
{
printf("Befriedigend(3)");
}
else if (zahl==9);
{
printf("Befriedigend(3-)");
}
else if (zahl==10);
{
printf("Ausreichend(4+)");
}
else if (zahl==11);
{
printf("Ausreichend(4)");
}
else if (zahl==12);
{
printf("Ausreichend(4-)");
}
else if (zahl==13);
{
printf("Mangelhaft(5+)");
}
else if (zahl==14);
{
printf("Mangelhaft(5)";
)}
else if (zahl==15);
{
printf("Mangelhaft(5-)");
}
getch();
}
Ich habe nur noch einen letzten Fehler, den ich nicht wegbekomme:
undefined reference to '_TIME'
Hat da jemand noch eine Idee??
-
14. 12. 2008, 09:30 #6R3dNeXXdeaktiviertes Benutzerkonto
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
wo kommt der fehler ??
hier ??:
muss doch auch srand(time(null)) heißen oder ?
Zitat von verrueckt
und überleg dir vllt mal ne switch-anweisung zu verwenden
-
14. 12. 2008, 10:28 #7Mitglied
(Threadstarter)
- Registriert seit
- Sep 2008
- Beiträge
- 182
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
OK, der Fehler ist weg: Es kam noch der Fehler, dass null undeklariert war, den hab ich aber behoben. Jetzt bleibt nur noch eine Warnung übrig.
PS: Was ist eine switch-Anweisung und wie funktioniert die???
-
14. 12. 2008, 11:43 #8
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
Also ich hab auch mal so ein Ratespiel geschrieben. Und zwar das Brettspiel Mastermind. Ist aber schoon sehr lange her (Daher der etwas komische Coding Style). Ich habs mal wieder ausgegraben.

PHP-Code:/*
Mastermind,
==========
auch unter den Namen SuperHirn oder Variablo (VEB Berlinplast) bekannt, ist ein Logikspiel
für zwei Personen, das mit farbigen Stiften gespielt wird, die in ein spezielles Gestell
gesteckt werden. Das Spiel wurde 1973 von dem in Paris lebenden Israeli Marco Meirovitz
erfunden und wurde zu einem der erfolgreichsten Spiele der 1970er Jahre.
Im deutschsprachigen Raum wird es unter dem Namen SuperHirn, in der DDR wurde es unter
Variablo und im englischsprachigen Raum wird es als Mastermind vertrieben.
Spielprinzip
============
Der eine Spieler wählt zu Beginn einen vierstelligen Farbcode aus, wobei sechs verschiedene
Farben zur Verfügung stehen, die auch mehrfach verwendet werden können. Der andere Spieler
versucht den Code herauszufinden. Als Hilfestellung bekommt er nach jedem Zug die
Information, wie viele Stifte er in Farbe und Position richtig gesetzt hat, und wie viele
Stifte zwar die richtige Farbe haben, aber an einer falschen Position stehen. Ein Treffer
in Farbe und Position wird durch einen schwarzen Stift angezeigt, ein lediglich in der Farbe
übereinstimmender Stift wird durch einen weißen Stift angezeigt. Es gibt auch Versionen mit
roten statt schwarzen Stiften zur Anzeige von Treffern in Farbe und Position.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void spielplot(int feld[7][8],int code[4],int aufdecken);
int main(int argc, char *argv[])
{
int code [4], spielfeld[7][8]/*Sieben Zeilen weil max sieben versuche | 8 Spalten jeweils 4 zum raten und 4 für die Antworten des Computers*/;
int loop, zeile, spalte, runde, gewonnen=0, level=5, cheat;
/*Setzedes Startwertes für rand()*/
srand(time(NULL));
/*Initialsieren des Spielfeldes*/
for(zeile=0;zeile<7;zeile++)
{
for(spalte=0;spalte<8;spalte++)
{
spielfeld[zeile][spalte]=0;
}
}
/*Spielbeschreibung*/
printf("Mastermind\n==========\n\n");
printf("auch unter den Namen SuperHirn oder Variablo (VEB Berlinplast) bekannt, ist ein Logikspiel für zwei Personen, das mit farbigen Stiften gespielt wird, die in ein spezielles Gestell gesteckt werden. Das Spiel wurde 1973 von dem in Paris lebenden Israeli Marco Meirovitz erfunden und wurde zu einem der erfolgreichsten Spiele der 1970er Jahre. Im deutschsprachigen Raum wird es unter dem Namen SuperHirn, in der DDR wurde es unter Variablo und im englischsprachigen Raum wird es als Mastermind vertrieben.");
printf("\n\nSpielprinzip\n============\n\nDer eine Spieler waehlt zu Beginn einen vierstelligen Farbcode aus, wobei sechs verschiedene Farben zur Verfuegung stehen, die auch mehrfach verwendet werden koennen. Der andere Spieler versucht den Code herauszufinden. Als Hilfestellung bekommt er nach jedem Zug die Information, wie viele Stifte er in Farbe und Position richtig gesetzt hat, und wie viele Stifte zwar die richtige Farbe haben, aber an einer falschen Position stehen. Ein Treffer in Farbe und Position wird durch einen schwarzen Stift angezeigt, ein lediglich in der Farbe uebereinstimmender Stift wird durch einen weissen Stift angezeigt. Es gibt auch Versionen mit roten statt schwarzen Stiften zur Anzeige von Treffern in Farbe und Position.\n\n\t\t\t\t\t\t(c)Florian Trabauer\n\n");
system("PAUSE");
/*auswählen des Levels*/
do
{
system("cls");
printf("Mastermind\n==========\n\nWilkommen bei Mastermind,\nBitte waehlen sie den Schwierigkeitsgrad aus! (1-9)\nEingabe:");
scanf("%d", &level);
printf("Der Level bestimmt nur die anzahl der moeglichen zeichen!\n\nHAVE FUN\n\t\t\t(c) Trabauer Florian\n\n");
system("PAUSE");
}while((level<0||level>20)&&level!=10);
/*Aktivieren des Cheatmodes*/
if(level>10)
{
level=level-10;
cheat=1;
}
/*Erzeugen des Codes der eraten werden muss*/
for(loop=0;loop<4;loop++)
{
code[loop]=(rand()%level)+1;
}
/*Ausgabe des Codes*/
system("cls");
printf("Code: ");
for(loop=0;loop<4; loop++)printf(" %d", code[loop]);
/*Spielablauf*/
/*gespielt wird 7 Runden wen der Spieler nach 7 Runden den Code,
nicht heraus gefunden hat er verloren!*/
for(runde=0;runde<7;runde++)
{
/*Aktivieren des Cheatmodes*/
if(cheat!=1) system("cls");
spielplot(spielfeld, code, 0);
/*Einlesen der Werte*/
for(spalte=0;spalte<4;spalte++)
{
printf("\nGeben sie die %d Stelle des Codes ein.\nEingabe:", spalte+1);
do
{
scanf("%d", &spielfeld[runde][spalte]);
}while(spielfeld[runde][spalte]<1||spielfeld[runde][spalte]>level);
}
/*Ueberpruefung ob die eingegebene Zahl im Code vorkommt,
wenn ja wird eine 1 an der entsprechenden Postion ausgegeben*/
for(spalte=0;spalte<4;spalte++)
{
for(loop=0;loop<4;loop++)
{
if(spielfeld[runde][spalte]==code[loop]) spielfeld[runde][spalte+4]=1;
}
/*Ueberpruefung ob die eingegebene Zahl im Code auch an der richtigen Stelle ist*/
if(spielfeld[runde][spalte]==code[spalte]) spielfeld[runde][spalte+4]=2;
}
/*Ueberpruefen ob der Code eraten wurde*/
if(spielfeld[runde][4]==2&&spielfeld[runde][5]==2&&spielfeld[runde][6]==2&&spielfeld[runde][7]==2)
{
system("cls");
spielplot(spielfeld, code, 1);
printf("\n\nGewonnen!!!\n===========\n");
break;
}
}
system("PAUSE");
return 0;
}
void spielplot(int feld[7][8],int code[4],int aufdecken)
{
int loop, zeile, spalte;
/*Ausgabe desTabellenkopfes*/
/*mit dem zu erratenden Code wenn der Funktion aufdecken=1 uebergeben wird soll sie den Code anzeigen ansonsten
, wenn ohr aufdecken=0 uebergeben wird dann soll der Code versteckt sein*/
printf("Mastermind\n==========");
printf("\n\n+-+-+-+-+----+\n|C|O|D|E| |\n|");
for(loop=0; loop<4; loop++)
{
if(aufdecken==1)printf("%d|", code[loop]);
else printf("@|");
}
printf(" |\n+-+-+-+-+----+\n+-+-+-+-+----+\n");
/*Ausgabe der Spielereingaben*/
for(zeile=6; zeile>=0;zeile--)
{
printf("|");
for(spalte=0;spalte<4;spalte++)
{
/*if(feld[zeile][spalte]==0) printf("%c|", 0);
else */printf("%d|", feld[zeile][spalte]);
}
for(spalte=4;spalte<8;spalte++)
{
/*if(feld[zeile][spalte]==0) printf(" ", feld[zeile][spalte]);
else */printf("%d", feld[zeile][spalte]);
}
printf("|\n+-+-+-+-+----+\n");
}
}
-
14. 12. 2008, 16:46 #9R3dNeXXdeaktiviertes Benutzerkonto
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
solltest dir wohl mal grundlagen ansehen !?
Zitat von verrueckt
hier da stehts, das buch solltest du dir mal genauer durchlesen
-
14. 12. 2008, 18:38 #10
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
Hi,
dein Code sieht aber SEHR dürftig aus ;-)
Hier eine Optimierung:
Code:#include <stdio.h> #include <stdlib.h> #include <time.h> #define LIMIT 15 int main() { const char* Noten[] = {"Sehr gut", "Gut", "Befriedigend", "Ausreichend", "Mangelhaft", "Ungenuegend"}; srand(time(NULL)); unsigned int zahl = (double)rand() / (RAND_MAX + 1) * 999 + 1; //incl 1 bis incl 999 bool richtig = false; printf ("Hier eine geratene Zahl zwischen 1 und 999 eingeben:"); int i = 0; for (i = 0; i<LIMIT; ++i) { unsigned int geraten; scanf("%u",&geraten); if (zahl<geraten) printf("Die gesuchte Zahl ist kleiner."); else if (zahl>geraten) printf("Die gesuchte Zahl ist groesser."); else { richtig = true; break; } } ++i; if (richtig) printf("Sie haben die Zahl %u in %d Versuchen erraten!\n", zahl, i); else printf("Sie haben die gesuchte Zahl (%u) leider in %d Versuchen nicht erraten!\n", zahl, LIMIT); int note = (i + 2) / 3; printf("Das war %s (%d%s).\n",*(Noten+note-1), note, i%3==1 ? "+" : i%3 ? "" : "-"); system("PAUSE"); }
-
15. 12. 2008, 21:51 #11Mitglied
(Threadstarter)
- Registriert seit
- Sep 2008
- Beiträge
- 182
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
@usagichan: Dein Code wird aus irgendeinem Grund nicht kompiliert. Scheint auch noch irgendwas falsch zu sein. Nutze das aktuelle Code::Blocks 8.02. Welchen Compiler benutzt du und funtioniert das da?
-
15. 12. 2008, 22:06 #12
Sein Code hat zwei Probleme; zum einen gibt es in ANSI-C kein Typ `bool` und auch keine Konstanten `true` und `false` (du kannst dafür einen numerischen Datentyp und die Werte 1 und 0 verwenden). Zum anderen ist nicht garantiert, dass (RAND_MAX+1) in einem int Platz findet - caste einer der Werte vor der Operation nach float, um einen Overflow zu vermeiden (am kürzesten dürfte `RAND_MAX+1.0` sein).
Und, last but not least: system("PAUSE") ist böse.
-
15. 12. 2008, 22:28 #13
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
@verrueckt:
Habe das ganze für Visual Studio 2008 geschrieben, und da funktioniert es. Wenn es wie Kugelfisch23 meint, daran liegt, dass dein Compiler keinen bool - Wert kennt, füge am Anfang des Codes noch
ein.Code:#define bool int #define true 1 #define false 0
@Kugelfisch23:
Es ging mir hier nun wirklich nicht um Perfektion, der Code ist nur schnell zusammengetippt. Du kannst ja mal versuchen, es schöner zu schreiben *lach*
Viele Grüsse,
usagichan
-
15. 12. 2008, 22:42 #14
Es ging mir nicht um die Sauberkeit oder die Perfektion des Codes. Aber das ursprüngliche ANSI-C definiert keinen Datentyp `bool`; im C99-Standard gibt es den Header `stdbool.h`, der diesen Datentyp deklariert.Zitat von usagichan
Es ging mir hier nun wirklich nicht um Perfektion, der Code ist nur schnell zusammengetippt. Du kannst ja mal versuchen, es schöner zu schreiben *lach*
Visual Studio wird deinen Code als C++-Code kompiliert haben - deshalb hattest du keine Probleme mit dem Datentyp. Ein C-Compiler (gcc, zum Beispiel) wird jedoch reklamieren.
-
15. 12. 2008, 23:15 #15
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
Im ursprünglichen Standard-C ist allerdings auch nicht garantiert, dass dein Vorschlag "RAND_MAX+1.0" einen endlichen, also in diesem Falle brauchbaren, Wert zurückliefert.
-
16. 12. 2008, 07:10 #16
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
Hm?Im ursprünglichen Standard-C ist allerdings auch nicht garantiert, dass dein Vorschlag "RAND_MAX+1.0" einen endlichen, also in diesem Falle brauchbaren, Wert zurückliefert.
-
16. 12. 2008, 17:11 #17Mitglied
(Threadstarter)
- Registriert seit
- Sep 2008
- Beiträge
- 182
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
Hi Leute,
ich hab jetzt usagichans Code aufgeräumt und die Befehle eingesetzt. Mein Compiler kompiliert diese Datei immer noch nicht.
Aktueller Quellcode:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LIMIT 15
#define bool int
#define true 1
#define false 0
int main()
{
const char* Noten[] =
{"Sehr gut", "Gut", "Befriedigend", "Ausreichend", "Mangelhaft", "Ungenuegend"};
srand(time(NULL));
unsigned int zahl = (double)rand() / (RAND_MAX + 1) * 999 + 1; //incl 1 bis incl 999
bool richtig = false;
printf ("Hier eine geratene Zahl zwischen 1 und 999 eingeben:");
int i = 0;
for (i = 0; i<LIMIT; ++i) {
unsigned int geraten;
scanf("%u",&geraten);
if (zahl<geraten)
printf("Die gesuchte Zahl ist kleiner.");
else if (zahl>geraten)
printf("Die gesuchte Zahl ist groesser.");
else
{richtig = true;
break;
}
}
++i;
if (richtig)
printf("Sie haben die Zahl %u in %d Versuchen erraten!\n", zahl, i);
else
printf("Sie haben die gesuchte Zahl (%u) leider in %d Versuchen nicht erraten!\n", zahl, LIMIT);
int note = (i + 2) / 3;
printf("Das war %s (%d%s).\n",*(Noten+note-1), note, i%3==1 ? "+" : i%3 ? "" : "-");
system("PAUSE");
}
-
16. 12. 2008, 22:46 #18
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
Hi,
welche Fehlermeldung kommt denn?
@Scrion:
Der C-Standard defininiert (und verlangt) kein festes Intervall in den reellen Zahlen, auf welches die Fließkommazahlen abgebildet werden.
Viele Grüsse,
usagichan
-
17. 12. 2008, 15:58 #19Mitglied
(Threadstarter)
- Registriert seit
- Sep 2008
- Beiträge
- 182
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
Es wird einfach gar nichts weiter angezeigt. Ich hab festgestellt, dass er gar kein Programm mehr kompiliert. Auch eine Neuinstallation von CodeBlocks hat nichts gebracht :-(. Hat vielleicht jemand eine Idee, woran das liegen könnte und das Teil mal kompilieren? Danke!
-
17. 12. 2008, 21:04 #20
Re: Zufallszahl und Schleife in C zwischen 1 und 1000 für Zahlen-Ratespiel benötigt!
Hi,
Verwende doch einfach mal einen anderen Compiler, ich bevorzuge Visual C++, und schau ob es dort funktioniert. Wo genau das Problem mit CodeBlocks liegt ist "aus der Ferne" wohl schlecht zu diagnostizieren.
Viele Grüsse,
usagichan
PS: Warum hast du meine Gliederung und Einrückungen rausgeschmissen? So kann den Code ja kein Mensch mehr vernünftig lesen ...
-


Zitieren
mehr lesen...







Skype: Überprüfung von https-URLs...
Gestern, 21:03 in gulli:news