Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Gegen den Computer spielen?
FoxFox - Mo 12.03.07 18:32
Titel: Gegen den Computer spielen?
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 - 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 - 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! :D
cu
Narses
Dragonclaw - 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 - 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 - 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 - 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 - 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! :D
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 - Di 13.03.07 17:25
Trunc()
Leuchtturm - Di 13.03.07 17:27
oder du nimmst einfach Integer statt Real :wink:
JoelH - Mi 14.03.07 16:11
Leuchtturm hat folgendes geschrieben: |
oder du nimmst einfach Integer statt Real :wink: |
Dann ergibt 25/2 aber immernoch 12,5 ;)
SCNR.
freak4fun - Mi 14.03.07 16:17
JoelH hat folgendes geschrieben: |
Leuchtturm hat folgendes geschrieben: | oder du nimmst einfach Integer statt Real :wink: |
Dann ergibt 25/2 aber immernoch 12,5 ;)
SCNR. |
div :gruebel:
MfG
freak
FoxFox - 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 - 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
FoxFox - 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 - 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: ;)
Delphi-Quelltext
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
FoxFox - 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!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!