Autor Beitrag
matze4all
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 07.04.05 22:10 
Hallo,

ich probiere ein Ratespiel zu programmieren (in Delphi 2005), wo ein Wort eingegeben wird und das Programm die
Buchstaben des Wortes zufällig vertauscht, sodass man es halt erraten muss....

soweit sogut....nur leider ist bis jetzt alles schief gegangen und ich hoffe mir kann jemand helfen :P

Der Funktion-Anfang (ein Wort wird übergeben)....
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function TForm1.buchstabentausch(wort:string):string;
Begin
// Der Code!?!
End;


Hat jemand eine Idee, wie man das machen könnte??

(Ich hatte das mit randomize; und random() probiert, nur leider ging's zum Schluss nicht auf :roll: )

Mfg,
Matze

PS: Ich hoffe, dass ist das richtige Unterforum, ich bin neu hier und Blick noch nicht ganz durch -.-
PS2: verdammt, hab wohl doch das falsche Unterforum gewählt -.- sry

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.
Moderiert von user profile iconChristian S.: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Do 07.04.2005 um 22:27


Zuletzt bearbeitet von matze4all am Do 07.04.05 22:31, insgesamt 1-mal bearbeitet
der_zaehe
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 317

WinXP SP2
D6 Pers, D2005 Prof, VS2005
BeitragVerfasst: Do 07.04.05 22:30 
erstemal: :welcome: !

wie wärs damit?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function TForm1.buchstabentausch(wort:string;Wiederholungen:integer):string;
var
  zahl1,zahl2 : Integer;
  puffer : char;
Begin
  for i := 0 to Wiederholungen do
  begin
    Randomize;
    zahl1 := Random(Length(wort)+1);
    while zahl1 = 0 do
      zahl1 := Random(Length(wort)+1);
    zahl2 := Random(Length(wort)+1);
    while zahl2 = 0 do
      zahl2 := Random(Length(wort)+1);
    puffer := wort[zahl1];
    wort[zahl1] := wort[zahl2];
    wort[zahl2] := puffer;
  end;
End;


ist nicht getestet, ich hoff es geht :)

_________________
[inspirationslos]
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Do 07.04.05 22:32 
na ja...das mit Random und so ist gar keine schlecht idee....
du musst eben nur Zufällige Zahlen erzeugen...also wenn du zb vier zeichen hast....dann eben von 1-4 zufallszahlen erzeugen , und dann musste eben gucken, dass diese ZUfallszahl nicht doppelt auftritt.
Dies geht mit folgender Funktion:
ausblenden 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:
function zufallarray(laenge:integer):array of integer;
var kontrollarray:array [0..11of boolean;
    i,zufall:integer;

begin
for i:= 0 to (laenge-1do
    begin
    kontrollarray[i]:=false;                //Vorbelegen als Nicht markiert
    end;
randomize;
i:=0;
while (i<=(laenge-1)) do
      begin
      zufall:=random(laenge);
      if (kontrollarray[zufall]=false) then  //Wenn Zahl noch nicht erzeugt
         begin
         zufallarr[i]:=zufall;
         kontrollarray[zufall]:=true;        //Zahl als erzeugt markieren
         inc(i);                             //Nächste Zahl
         end;
      end;
result:=zufallarr;
end;


Änderst n bissl an dem Code...und dann bekommst du immer Zufallszahlen...wenn zb die laenge=4 erzuegt er dir z.B:
0231 oder 2310 oder sowas...
und damit kannste dann die Buchstaben vertauschen^^
guck dir einfach die Funktion an und überleg...;-)
matze4all Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 07.04.05 22:41 
user profile iconder_zaehe hat folgendes geschrieben:
erstemal: :welcome: !

Danke :P für die schnelle Antwort :P

naja, anstatt Wiederholungen, hab ich length() genommen und es geht :)

und unten noch "buchstabentausch := wort;" rangehängt :)

Kannst du mir zufällig noch in groben erklären, was passiert,
weil ich das wahrscheinlich mein Informatiklehrer erklären muss :roll:

wäre nett :) ein bisschen kann ich mir ja denken...

@ Kroni: Danke :) werde es auch gleich probieren :P
EDIT: hmm, mir ist aufgefallen, dass meine Idee so ähnlich war und das Problem
bei deiner Variante ist, dass das wort höchstens 11 Zeichen lang sein darf
(wegen "array [0..11]")...geht das nicht auch so: "kontrollarray:array [0..laenge]" ?
Kroni
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 720

Win 98, Win ME, Win2k, Win XP
D3 Pro
BeitragVerfasst: Do 07.04.05 22:47 
BEvor ich ins bett gehe und dann übers WE wegbin:
Du gibts ihm ne Länge vor...also, wie viele Zahlen der erzeugen soll.....
dann ist es ja möglich, wenn du vier Zahlen einfach mit random(4)erzuegst, ddass Zahlen doppelt vorkommen.....
das wird verhindert, indem du n Kontrollarray machst....der guckt dann, wenn du ne Zahl zufällig erzeugt hast, ob die Zahl schon erzeugt wurde...wenn nicht, zählt der um eins hoch, und sagt also...ich habe nun eine Zahl, die noch NICHT vorhanden war, speichert die dann an erster Stelle ab...und speichert das in dem Array of Boolean, dass die Zahl schon benutzt worden ist.
Dann geht er weiter....
Wenn ne Zahl schon erzeugt worden ist, erzeugt er einfach ne nächste Zufallszahl.....
Bis eben alle Zahlen erzeugt worden sind....;-)
EDIT: ja, das geht, indem du n dynamisches Array machst, und dann laenge übergibst, und du dann das Array per setlength(length) auf die länge setezt.....;-)
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Do 07.04.05 23:35 
Dynamisches Array: einfach die [ x..y] weglassen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var aArray: array of integer;
begin
setlength(aArray,10);
aArray[0]:= {...}
aArray[1]:= {...}
{...}
aArray[9]:= {...}
end;

so wird das dann klappen, wenn ich mich nicht irre. (und das tue ich oft xD)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 08.04.05 01:06 
Das mit den Wiederholungen ist nicht völlig zufällig. Hier die Standardmethode, um eine zufällige Permutation von Elementen zu erzeugen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function scramble(const S: String): String;
Var
 I, J, L : Integer;
 C: Char;
begin
 Result := S;
 L := Length(Result);
 For I := 1 to L do
 begin
  J := I+random(L-I+1);
  C := Result[J];
  Result[J] := Result[I];
  Result[I] := C;
 end;
end;
matze4all Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 08.04.05 19:06 
Danke für eure Antworten :P

Mir ist allerdings eben die Beste/Einfachste Idee gekommen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function TForm1.buchstabentausch(wort:string):string;
var
  i,zufall: Integer;
  puffer,wort2: string;
Begin
 For i:= 1 To length(wort) Do
  Begin
   randomize;
   zufall := random(length(wort))+1;
   puffer := wort[zufall];
   delete(wort,zufall,1);
   wort2 := wort2 + puffer;
  End;
buchstabentausch := wort2;
End;


oder sieht da jemand einen Fehler ?!?! Also bei mir gings bisher immer :)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 08.04.05 22:10 
Die beste Methode? Die Operation Delete und das Anhängen von Zeichen an einen Strings sind sehr langsame Operationen (unter Umständen wird bei dir pro Durchlauf ein FreeMem und ein GetMem/ReallocMem ausgeführt)
matze4all Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 08.04.05 22:47 
hmmm, stimmt... wenn ich mir deine funktion angucke...ist doch die bessere Lösung :roll:
ich hatte nur letztens im Informatik-Unterricht die Funktion delete() gelernt und
da wollte ich die gleich mal mit einbauen :roll: