computer denkt sich zahl aus < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
hallo,
ich mache grade programmieraufgaben und nunbrauch ich bei einer aufgabe, dass sich der computer eine zahl ausdenkt. also quasi eine zufallszahl generiert. Und das ganze in Java.
Der bereich sollte zwischen 01 und 100 liegen.
Nun hab ich gedacht, dass es so aussehen müsste:
int toBeGuessed = (int) (99 * Math.random() + 1);
stimmt das soweit?
und nun soll der pc quasi selbst die zahl erraten.
und erst aufhören, wenn er die richtige zahl hat.
also hab ich mir gedacht:
Ich mache eine while schleife und diese soll erst abgebrochen werden, wenn toBeGuessed==myGuess ist. Also wenn die geratene Zahl gleich der zu eratenden zahl ist.
nun hab ich aber das problem, dass wenn der comuter nun quasi eine Zahl sich augedacht hat, wie schaff ich es dann, dass er quasi "eine zahl ratet". Ich hab mir dann überlegt, dass ich es so mache, dass der Computer sich quasi nochmal eine Zahl ausdenkt, also nochmal myGuess= (int) (99 * Math.random() + 1);
so nun errät er eine Zahl und er gibt dann auch aus, dass die erratene zahl zu gering ist. Dann hätten wir ja quasi wieder eine neue Rahmenbedingung für das int toBeGuessed = (int) (99 * Math.random() + 1);.
Man weiß aber ja nicht, was für eine zahl er erratet, weils ja bei jedem ausführen eine andere ist, also kann ich da die grenzen auch nicht wie oben fest definieren.
nur wie mach ich das denn dann? mit args?
also quasi
int myGuess=(integer.parseInt(args [0])* Math.random() + 1);
nur wie definiere ich jetzt, dass args 0 gleich der erratenden zahl sein soll.
Versteht ihr mein Problem?
Bin mir auch bei allem sehr unsicher.
Wäre nett, wenn ihr mir helfen könntet.
Muss die Aufgabe bis Freitag abgeben, also nicht mehr viel zeit.
|
|
|
|
Hallo!
Du willst also, daß der Computer das
"Rate eine Zahl von 1 bis 100"-Spiel, bei dem immer angegeben wird, ob die erratene Zahl zu groß, zu klein oder gleich ist, gegen sich selbst spielt.
Das mit den args benutzt du doch, um einem in sich geschlossenen Programm beim Start aus der Kommandozeile einen Wert mit zu geben.
Dein Ratespiel wird doch ein einziges Java-Programm sein, oder?
Dann solltest du statt der statischen Grenzen in
int toBeGuessed = (int) (99 * Math.random() + 1);
eher Variablen nehmen, die anfangs =99 und =1 sind.
Je nachdem, ob die so geratene Zahl zu groß oder zu klein ist, werden diese Zahlen so angepaßt, daß die nächste Zufallszahl in dem noch verbleibenden Bereich liegen wird.
Nebenbei: Ich denke, in Java wird das nicht anders als in C sein:
Ein Computer kennt keine echten Zufallszahlen. Statt dessen hat er eine Formel, in die er eine Zahl reinsteckt. Das, was raus kommt, nennt er Zufallszahl, und wird es beim nächsten mal wieder in die Formel rein stecken, um die nächste Zufallszahl zu bekommen.
Das Problem: Ganz am Anfang benötigt er eine allererste Zahl. Wenn die immer gleich ist, wird auch die Reihe der Zufallszahlen immer gleich sein. Du benötigst einen "seed", also irgendeine Startzahl. Typischerweise benutzt man die Uhrzeit, weil das eine sich sekündlich ändernde Zahl ist.
Wie das nun genau geht, müßtest du mal herausfinden, da ich kein Java kann.
|
|
|
|
|
ok Dnake.
ich werd das nun mal versuchen.
also definiere ich dann zuerst mal das ganze so:
int toBeGuessed = (int) (max * Math.random() + min);
Dann wären min und max meine beiden Variablen.
wenn dann immer die gleiche zahl rauskommen würde wär blöd. Also ich bin noch ganz am anfang und wir haben das als aufgabe gekriegt und wir haben nur math.random als tipp auf dem übungsblatt stehen und nie damit gearbeitet bzw. etwas drüber gehört, weshalb ich es nicht ganz glaube, dass wir da sowas kompliziertes machen sollen. nur gibt es irgednwie ne andere möglichkeit?
(hab auch nen programmrumpf dazu, und würd die aufgabe posten, aber darf das nicht, sonst würden die noch denken, ich hätt es einfach heir raus kopiert.. )
also wenn wir mal davon ausgehen, dass der pc dann ne andere zahl auswirft wie müsste ich denn dann weiter machen?
int toBeGuessed = (int) (max * Math.random() + min);
int max=99;
int min=1;
myguess= (int) (max * Math.random() + min);
{while (myguess==toBeGuessed)
break;
if (myguess<toBeGuessed)
min=myguess, max=99
if (myguess>toBeGuessed)
min=1
max=myguess
myguess= (int) (max * Math.random() + min); }
verstehst du was ich meine?
ich will, dass es die schleife abbricht, wenn die bedingung myguess==toBeGuessed erfüllt ist.
Ist mein Gedanke wneigstens in die richtige Richtung?
mit dem code hab ich sowieso immer so meine Probleme..
:(
wäre nett, wenn du mir nochmal helfen könntest.
|
|
|
|
|
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Hallo!
Erstmal entwarnung: Anscheinend ist das Math.random so intelligent, daß mein Einwand da schon berücksichtigt wird.
Was deinen Code angeht:
int toBeGuessed = (int) (max * Math.random() + min);
ist noch nicht richtig.
Überleg mal, du willst Zahlen von 20 bis 80 erzeugen.
Welche Zahlen kann dir denn
(80 * Math.random() + 20);
liefern?
Und:
{while (myguess==toBeGuessed)
break;
Die Schleife soll laufen, solange die Zahl NICHT geraten wurde, also so:
while (myguess!=toBeGuessed)
Dann muß die geschweifte Klammer ans Ende der Zeile. Und: Das break würde die Schleife sofort verlassen, aber das erledigt die while-schleife für dich.
Noch was: Alles, was zu einem IF gehört, muß in geschweifte Klammern. Die Trennung mit nem Komma in "min=myguess, max=99" klappt nicht.
Und:Überlege dir mal, wie sich die untere und obere Grenze während des Spiels verändern. (Also, wenn du das Spiel selbst spielen würdest. Ist es schlau, nach min=myguess das max auf 99 zu setzen?
|
|
|
|
|
hmm..okay danke. also müsste das so aussehen?
was stimmt denn aber an dem
int toBeGuessed = (int) (max * Math.random() + min);
nicht?
okay, also lass ich bei der while schleife das break ganz weg? ok...
ich bin mir nicht sicher ob du verstanden hast, was ich mit dem
if (myguess>toBeGuessed)
min=myguess
max=99
sagen wollte.
Also ich hab gemeint, dass es dann für das "ausdenken der neuen Zahl" nur noch den raum zwischen 100 und der geratenen Zahl nimmt.
oder stimmt die 99 nicht? da muss 100 hin kann das sein?
bin komplett verwirrt so langsam.
Aber vielen Dank für deine Hilfe :)
"Ist es schlau, nach min=myguess das max auf 99 zu setzen?"
wenn du so fragst, vermutlich nicht. Aber warum? weil ichs auf 100 setzen muss?
oh man verwirrung :(
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:55 Do 28.10.2010 | Autor: | leduart |
Hallo
vielleicht sagst du erstmal, wie du das Spiel gegen nen computer oder menschen spielst.
Wenn 99 die größt mögliche zahl ist, ist im 1ten durchlauf 99 als max richtig.
Man schreibt beim progr. immer am besten den unprogrammierten Weg mal auf:
1.Zahl sagen
2. Information Zahl zu groß zu klein
3. wenn zu gross dann. neue Zahl= wenn zu klein dann neue Zahl =
4. bei 1 anfangen
ich würde auch noch die Anzahl der versuche bis zum Erfolg zählen.
Gruss leduart
|
|
|
|
|
Hi,
Danke für deine Antwort. Ja die Versuche bis zum Erfolg, soll ich auch zählen. Ich hab einen vorgegebenen Programmrumpf und soll da nur Teile ergänzen und irgendwie komm ich damit schon nicht wirklich zurecht.
Also das Spiel soll in dem Fall von Computer gegen Computer sein. Also 2 Computer gegeneinander sozusagen.
Das soll dann so aussehen:
Der 1. Versuch ist 50 und die Zahl ist zu hoch
Der 2. Versuch ist 25 und die Zahl ist zu gering
usw.
Also
1.Computer denkt sich eine Zahl
2. zweiter Computer rät eine Zahl (1.versuch)
3. erster computer sagt zahl ist zu niedrig
4. zweiter computer rät erneut (2. versuch)
also meine Idee ist:
ich mache eine while schleife mit der Bedingung dass die geratende Zahl der gesuchten Zahl nicht übereinstimmen darf. Wenn doch bricht die schleife ab.
Nur mein problem ist die umsetzung des ganzen in Code, und ich weiß nicht wirklich wie ich das max und min von den anderen versuchen definieren soll. Am anfang kann man es ja angeben, aber dann ist es ja abhängig davon, was geraten wurde zuvor.
:(
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:53 Do 28.10.2010 | Autor: | BlackSalad |
ich wäre euch wirklich sehr sehr dankbar, wenn ihr mir helfen würdet, diese aufgabe noch zu lösen. BITTE ich verzweifele.
lg katrin
|
|
|
|
|
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Habs jetzt nochmal überarbeitet. Ich markiere mal das gegebene dick:
protected int checkGuess(int myGuess) {
int result;
int max=100;
int min=1;
int toBeGuessed = min + ((int)(Math.random() * (max - min + 1)));
{while (myGuess!=toBeGuessed)
myGuess= min + ((int)(Math.random() * (max - min + 1)));
{if (myGuess<toBeGuessed)
min=myGuess; }
{if (myGuess>toBeGuessed)
max=myGuess;
} }
System.out.println("The " + ++numberOfGuesses + ". guess is \"" + myGuess + "\" and it is " + (result < 0 ? "too small." : result > 0 ? "too high." : "PERFECT!"));
return result;
|
|
|
|
|
Hallo!
Wenn ich den vorgegebenen Teil anschaue, dann sollst du dem Namen nach hier nur eine Funktion schreiben,die checkt, ob die geratene Zahl myGuess der zufälligen Zahl entspricht, oder ob sie größer oder kleiner ist.
Denn: Die FUnktion heißt "checkGuess" und übernimmt eine Zahl int myGuess.
Zurückgeben soll sie nur eine Zahl int result, welche z.B. durch die Werte -1; 0; +1 anzeigt, wie sich die beiden Zahlen verhalten.
So verstehe ich das jedenfalls. Du kommst hier mit ein paar IF-Anweisungen aus, weder das Würfeln der Zahl, noch das Würfeln der Rate-Zahlen muß hier rein.
Allerdings: Es muß ne andere Methode in deiner Klasse geben, die die zu erratene Zahl würfelt. Diese Zahl muß dann in einer klassenweiten Variablen gespeichert sein, sodaß jede Methode der Klasse Zugriff darauf hat.
Wo kommt übrigens numberOfGuesses her? SOll das auch klassenweit definiert sein, oder mußt du das noch definieren?
|
|
|
|
|
Hallo!
Nicht verzweifeln, wir haben auch noch andere Hobbys und sind nicht immer hier. Daher dauert es auch mal etwas. Unten gehts weiter!
|
|
|
|