Autor Beitrag
FoxFox
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Dragonclaw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 12.03.07 19:55 
user profile iconDragonclaw 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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Di 13.03.07 17:20 
user profile iconNarses 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: Di 13.03.07 17:25 
Trunc()
Leuchtturm
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1087

Win Vista, Knoppix, Ubuntu
Delphi 7 Pe, Turbo Delphi, C#(VS 2005 Express), (X)HTML + CSS, bald Assembler
BeitragVerfasst: Di 13.03.07 17:27 
oder du nimmst einfach Integer statt Real :wink:

_________________
Ich bin dafür verantwortlich was ich sage - nicht dafür was du verstehst.
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Mi 14.03.07 16:11 
user profile iconLeuchtturm hat folgendes geschrieben:
oder du nimmst einfach Integer statt Real :wink:

Dann ergibt 25/2 aber immernoch 12,5 ;)

SCNR.

_________________
mfg. Joel
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Mi 14.03.07 16:17 
user profile iconJoelH hat folgendes geschrieben:
user profile iconLeuchtturm hat folgendes geschrieben:
oder du nimmst einfach Integer statt Real :wink:

Dann ergibt 25/2 aber immernoch 12,5 ;)

SCNR.


div :gruebel:

MfG
freak

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
FoxFox Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 15.03.07 17:53 
user profile iconNarses 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 ->
ausblenden 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 user profile iconTino: Delphi-Tags hinzugefügt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 15.03.07 18:22 
user profile iconNarses 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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: ;)
ausblenden volle Höhe 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 = ( // Anwendungszustände aufzählen:
    asRunning,  //   Spiel läuft
    asFinished, //   Zahl erraten
    asWaiting   //   Warten auf Neustart oder Ende
    );

  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

// Programmzustand in die GUI übertragen
procedure TForm1.SetAppState(const Value: TAppState);
begin
  FAppState := Value; // Zustand merken
  lblNumber.Caption := IntToStr(RangeMid)+' ?'// Ausgabe: Ratezahl
  // Buttons passend de-/aktivieren
  BtnLower.Enabled := (FAppState = asRunning);
  BtnHigher.Enabled := (FAppState = asRunning);
  BtnStart.Enabled := (FAppState = asWaiting);
  BtnGotcha.Enabled := (FAppState in [asRunning,asFinished]);
end;

// Suchbereich aktualisieren und entscheiden, ob das Spiel damit beendet ist
procedure TForm1.UpdateRange;
begin
  RangeMid := (FRangeMin +FRangeMax) div 2// neue aktuelle Zahl = Mitte Bereich
  if (FRangeMin < FRangeMax) then // ist es überhaupt noch ein Bereich?
    AppState := asRunning // ja, weiter raten
  else
    AppState := asFinished; // nein, aktuelle Zahl ist die gesuchte!
end;

procedure TForm1.SetRangeMin(const Value: Integer);
begin
  FRangeMin := Value;
  UpdateRange;
end;

procedure TForm1.SetRangeMax(const Value: Integer);
begin
  FRangeMax := Value;
  UpdateRange;
end;

// bei Programmstart ausführen
procedure TForm1.FormCreate(Sender: TObject);
begin
  BtnStartClick(Self); // Programmstart ist auch Spielstart
end;

// neues Spiel
procedure TForm1.BtnStartClick(Sender: TObject);
begin
  MessageDlg('Bitte eine Zahl zwischen '+IntToStr(MIN)+' und '+
             IntToStr(MAX)+' ausdenken!',mtInformation,[mbOK],0);
  RangeMin := MIN; // Startwerte setzen
  RangeMax := MAX;
end;

// gesuchte Zahl ist kleiner, als angezeigt
procedure TForm1.BtnLowerClick(Sender: TObject);
begin
  RangeMax := RangeMid -1// gesuchte Zahl muss unterhalb der Aktuellen sein
end;

// gesuchte Zahl ist größer, als angezeigt
procedure TForm1.BtnHigherClick(Sender: TObject);
begin
  RangeMin := RangeMid +1// gesuchte Zahl muss oberhalb der Aktuellen sein
end;

// Zahl erraten
procedure TForm1.BtnGotchaClick(Sender: TObject);
begin
  AppState := asWaiting; // auf Neustart oder Ende warten
end;

// Programm beenden
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 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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!