Autor |
Beitrag |
FoxFox
Hält's aus hier
Beiträge: 11
|
Verfasst: Mo 12.03.07 18:32
Hi,
Ich habe gestern mein erstes Programmchen fertiggestellt. Das Programmierenmacht mir so viel Spaß, dass ich nun einen Schritt weiter gehen möchte.
Ich habe mir follgendes gedacht ->
Der Anwender denkt sich eine Zahl zwischen 1 und 100 (vllt Range sogar selber auswählbar). Jetzt versucht der Computer mit möglichst wenig versuchen hinter diese Zahl zu kommen. Der Anwender hilft ihm dabei mit "zu hoch" oder "zu tief" anweisungen (Denke mal dazu nehme ich RadioButtons).
Allerdings weiß ich nicht wo ich Anfangen soll. Wie soll ich meinen Computer das klar machen?
Hat vielleicht jemand eine Idee oder Ansatzpunkte?
Danke
FoxFox
|
|
MarkusD
Beiträge: 22
|
Verfasst: Mo 12.03.07 18:54
In dem du eine Zufallszahl im bereich 1-100 erzeugst, dann überprüfst ob diese Zahl kleiner oder größer als die "Anfangszahl" ist und dann im Bereich von 0 bis zu der geratenen zahl (kleiner) oder von der geratenen Zahl bis 100 eine neue erzeugst. Das solange, bis die Zahl stimmt.
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 12.03.07 19:13
Moin!
Ansatz für die "Computer-Strategie": nimm die Hälfte des Zufallsbereichs und frag den Benutzer, dann nimmst du die "passende" Hälfte und halbierst den Bereich wieder, fragen, Bereich halbieren, usw. usf. -> bis der Bereich nur noch aus einer Zahl besteht -> die gesuchte Zahl!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Dragonclaw
Beiträge: 196
Windows Vista
Delphi 7 Prof.
|
Verfasst: Mo 12.03.07 19:14
Hallo,
Also das ganze geht mit der Binären Suche am einfachsten. Das ist das System was Narses beschrieben hat. Einfach mal die Suche benutzen, dafindest du bestimmt was
|
|
Heiko
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: Mo 12.03.07 19:16
Um genau zus ein, ist das Verfahren von Narses am schnellsten, denn es hat im worst-Case eine logarithmische Laufzeit (log2(N) ). Alle anderen Verfahren wären für den PC langsamer .
|
|
Dragonclaw
Beiträge: 196
Windows Vista
Delphi 7 Prof.
|
Verfasst: Mo 12.03.07 19:27
Ob wohl es ja eigentlich VIEL interessanter ist, wenn der benutzer die Zahl erraten soll, wenn der Computer das macht und du nur entscheiden musst ob größer oder kleiner ist das ja langweilig...
|
|
FoxFox
Hält's aus hier
Beiträge: 11
|
Verfasst: Mo 12.03.07 19:55
Dragonclaw hat folgendes geschrieben: | Ob wohl es ja eigentlich VIEL interessanter ist, wenn der benutzer die Zahl erraten soll, wenn der Computer das macht und du nur entscheiden musst ob größer oder kleiner ist das ja langweilig... |
Das Programm war mein erstes Jetzt wollte ich einen neuen Spielmodus einbauen.
|
|
FoxFox
Hält's aus hier
Beiträge: 11
|
Verfasst: Di 13.03.07 17:20
Narses hat folgendes geschrieben: | Moin!
Ansatz für die "Computer-Strategie": nimm die Hälfte des Zufallsbereichs und frag den Benutzer, dann nimmst du die "passende" Hälfte und halbierst den Bereich wieder, fragen, Bereich halbieren, usw. usf. -> bis der Bereich nur noch aus einer Zahl besteht -> die gesuchte Zahl!
cu
Narses |
Okay.. sowas habe ich mir auch überlegt. Nun stehe ich vor einem Peinlichem Problem. Und zwar:
Computer sagt "50" -> Ich sage "zu groß"
Computer sagt "25" -> Ich sage "zu groß"
Computer sagt "12,5" -> Ich sage "zu groß"
In der letzten Zeile steckt mein Problem. Richtig, die Kommazahlen. Wie schaffe ich es dass der Computer die Kommazahlen einfach weglässt? Habe schon mit einer "Round" Funktion getüftelt, aber will nicht funktioniert. Irgendwelche Ideen?
|
|
Dragonclaw
Beiträge: 196
Windows Vista
Delphi 7 Prof.
|
Verfasst: Di 13.03.07 17:25
|
|
Leuchtturm
Beiträge: 1087
Win Vista, Knoppix, Ubuntu
Delphi 7 Pe, Turbo Delphi, C#(VS 2005 Express), (X)HTML + CSS, bald Assembler
|
Verfasst: Di 13.03.07 17:27
oder du nimmst einfach Integer statt Real
_________________ Ich bin dafür verantwortlich was ich sage - nicht dafür was du verstehst.
|
|
JoelH
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: Mi 14.03.07 16:11
Leuchtturm hat folgendes geschrieben: | oder du nimmst einfach Integer statt Real |
Dann ergibt 25/2 aber immernoch 12,5
SCNR.
_________________ mfg. Joel
|
|
freak4fun
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Mi 14.03.07 16:17
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
FoxFox
Hält's aus hier
Beiträge: 11
|
Verfasst: Do 15.03.07 17:53
Narses hat folgendes geschrieben: | Moin!
Ansatz für die "Computer-Strategie": nimm die Hälfte des Zufallsbereichs und frag den Benutzer, dann nimmst du die "passende" Hälfte und halbierst den Bereich wieder, fragen, Bereich halbieren, usw. usf. -> bis der Bereich nur noch aus einer Zahl besteht -> die gesuchte Zahl! :D
cu Narses |
genau so hab ich mir das auch überlegt. Irgendwie so etwas -> Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button1Click(Sender: TObject); var tip, ergebnis: Real; begin ergebnis:= StrToInt(label1.Caption); If Radiobutton1.Checked then tip := ergebnis / 2 ; tip := trunc(tip) ; label1.Caption := FloatToStr(ergebnis) ; Radiobutton1.Checked:= FALSE; If Radiobutton2.Checked then tip := ergebnis+(ergebnis*1/2); tip := trunc(tip); label1.Caption := FloatToStr(tip); Radiobutton2.Checked:= FALSE; end; | Ich hoffe (und wie ich es hoffe) bis dahin ist alles richtig. Aber wie kann ich einstellen dass er immer nur die hälfte der hälfte nimmt? Zb. muss ich logischerweise 6x "Zu hoch" anklicken bis ich bei 0 lande. (50 -> 25 -> 12 -> 6 -> 3 -> 1 -> 0). Allerdings muss ich bloß 2x "zu klein" anklicken bis er schon über 100 ist (50 -> 75 -> 112). Wie bewerkställige ich es, dass er bloß die hälfte der hälfte nimmt. Also 50 -> 75 -> 87 -> 93 -> 96 -> 99 -> 100. Es muss wohl an meiner Formel liegen, aber komm da einfach nicht hinter. Hat vllt jemand eine Idee? Danke vielmals.. danach nerve ich auch nicht mehr ;) Moderiert von Tino: Delphi-Tags hinzugefügt
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 15.03.07 18:09
Moin!
So wie das aussieht, versuchst du in einem Buttonklick ein komplettes Spiel zu quetschen. Das wird so nicht funktionieren, du mußt pro Buttonklick eine Rate-Runde (also Computer sagt Zahl, benutzer bewertet) abwickeln und das dann solange wiederholen, bis der Bereich nur noch eine Zahl enthält -> die Lösung.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
FoxFox
Hält's aus hier
Beiträge: 11
|
Verfasst: Do 15.03.07 18:22
Narses hat folgendes geschrieben: | Moin!
So wie das aussieht, versuchst du in einem Buttonklick ein komplettes Spiel zu quetschen. Das wird so nicht funktionieren, du mußt pro Buttonklick eine Rate-Runde (also Computer sagt Zahl, benutzer bewertet) abwickeln und das dann solange wiederholen, bis der Bereich nur noch eine Zahl enthält -> die Lösung.
cu
Narses |
Jaa genau Danke für den Hinweis. Bleibt nur die frage nach dem "wie" . Ich kann ja pro Button bloß eine procedure erstellen. Ich kann ja schlecht sagen "beim 1. Klick mach das, beim 2. Klick mach dies etc.". Ich sitze da jetzt schon ziemlich lange dran und es ist seit Stunden kein Fortschritt mehr zu vermerken. Dass ein so vermeintlich leichtes Programm soviele Probleme bereiten kann.. ^^
FoxFox
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 15.03.07 18:47
Moin!
Dann bist du jetzt ein klassischer Kandidat für die Idee: Anwendungszustand!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 16.03.07 01:35
Moin!
Da das mit den Anwendungszuständen für Anfänger möglicherweise nicht soo ganz einfach zu durchblicken ist, hier mal eine Musterlösung:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113:
| const MIN = 1; MAX = 100;
type TAppState = ( asRunning, asFinished, asWaiting );
TForm1 = class(TForm) lblNumber: TLabel; BtnLower: TButton; BtnHigher: TButton; BtnStart: TButton; BtnGotcha: TButton; BtnExit: TButton; procedure FormCreate(Sender: TObject); procedure BtnStartClick(Sender: TObject); procedure BtnLowerClick(Sender: TObject); procedure BtnHigherClick(Sender: TObject); procedure UpdateRange; procedure BtnGotchaClick(Sender: TObject); procedure BtnExitClick(Sender: TObject); private FAppState: TAppState; FRangeMin: Integer; FRangeMax: Integer; procedure SetAppState(const Value: TAppState); procedure SetRangeMax(const Value: Integer); procedure SetRangeMin(const Value: Integer); public RangeMid: Integer; property AppState: TAppState read FAppState write SetAppState; property RangeMin: Integer read FRangeMin write SetRangeMin; property RangeMax: Integer read FRangeMax write SetRangeMax; end;
implementation
procedure TForm1.SetAppState(const Value: TAppState); begin FAppState := Value; lblNumber.Caption := IntToStr(RangeMid)+' ?'; BtnLower.Enabled := (FAppState = asRunning); BtnHigher.Enabled := (FAppState = asRunning); BtnStart.Enabled := (FAppState = asWaiting); BtnGotcha.Enabled := (FAppState in [asRunning,asFinished]); end;
procedure TForm1.UpdateRange; begin RangeMid := (FRangeMin +FRangeMax) div 2; if (FRangeMin < FRangeMax) then AppState := asRunning else AppState := asFinished; end;
procedure TForm1.SetRangeMin(const Value: Integer); begin FRangeMin := Value; UpdateRange; end;
procedure TForm1.SetRangeMax(const Value: Integer); begin FRangeMax := Value; UpdateRange; end;
procedure TForm1.FormCreate(Sender: TObject); begin BtnStartClick(Self); end;
procedure TForm1.BtnStartClick(Sender: TObject); begin MessageDlg('Bitte eine Zahl zwischen '+IntToStr(MIN)+' und '+ IntToStr(MAX)+' ausdenken!',mtInformation,[mbOK],0); RangeMin := MIN; RangeMax := MAX; end;
procedure TForm1.BtnLowerClick(Sender: TObject); begin RangeMax := RangeMid -1; end;
procedure TForm1.BtnHigherClick(Sender: TObject); begin RangeMin := RangeMid +1; end;
procedure TForm1.BtnGotchaClick(Sender: TObject); begin AppState := asWaiting; end;
procedure TForm1.BtnExitClick(Sender: TObject); begin Close; end; |
Der Quelltext ist hoffentlich verständlich kommentiert, im Anhang befindet sich nochmal das komplette Projekt.
cu
Narses
Einloggen, um Attachments anzusehen!
_________________ There are 10 types of people - those who understand binary and those who don´t.
Zuletzt bearbeitet von Narses am Do 19.06.08 16:24, insgesamt 1-mal bearbeitet
|
|
FoxFox
Hält's aus hier
Beiträge: 11
|
Verfasst: So 18.03.07 20:46
wow. Danke!
Bin leider nicht zuhause um das zu testen, aber ich bin mir sicher, dass das das richtige Programm ist.
Vielen lieben Dank!
|
|