Entwickler-Ecke

Sonstiges (Delphi) - Ein Anfänger wagt sich an Kniffel


ChillerNWA - Sa 07.11.09 16:21
Titel: Ein Anfänger wagt sich an Kniffel
Guten Tag Volk,
nachdem ich schon einige kleinere Sachen gewagt habe, will ich mal etwas größeres probieren. Ich habe mir fest vorgenommen, ein Kniffel zu programmieren. Ich habe hier schon einige exemplare runtergeladen + code, jedoch blick ich da nicht sonderlich viel durch.
Mein Problem ist das abkürzen des Codes. Das Spiel zu programmieren ist nicht sonderlich schwierig, jedoch an Zeilen zu sparen schon. Ich könnte jedes Ereignis einzeln auftreten ( z.b. bei einer großen straße könnte ich so machen, dass wenn eine Zahl 1 ist, eine zweite 2 sein muss, eine dritte 3 und so weiter bzw. wenn einer Zahl 2 ist, die 2. eine 3 und so weiter), jedoch kriege ich das nicht richtig gebacken, als Code aufzuschreiben. Meine Idee wäre gewesen, dass ich ein Prozedur habe, die diese Zahlen von klein auf groß speichert, dann könnte ich einfach mit dem kleinsten anfangen und gucken, ob die nächst größere +1 ist. und wenn das 4mal geklappt hab hab ich eine große Straße :D
Außerdem weiß ich nicht wie ich das mit den Würfeln machen soll. Ich kann das im internen mit einem "for x := 1 to 5 do x := random(6)+1" machen, aber wenn ich das als Text in einem Editfeld rausgeben will, krieg ich das nicht gebacken, da ich dieses zahl to zahl bei namen nicht benutzen kann. Meine Textfelder heißen sowas wie: wuerfel1, wuerfel2 und so. Könnte man das auch noch machen, dass ich mit einem "for z := 1 to 5 do wuerfel(z).text := inttostr(random(6)+1)" oder ähnlichem?

Ich hoffe ihr helft mir bei diesem Projekt bis zum Ende, danke :)


koegi - Sa 07.11.09 17:42

user profile iconChillerNWA hat folgendes geschrieben Zum zitierten Posting springen:
Guten Tag Volk,
nachdem ich schon einige kleinere Sachen gewagt habe, will ich mal etwas größeres probieren. Ich habe mir fest vorgenommen, ein Kniffel zu programmieren. Ich habe hier schon einige exemplare runtergeladen + code, jedoch blick ich da nicht sonderlich viel durch.
Mein Problem ist das abkürzen des Codes. Das Spiel zu programmieren ist nicht sonderlich schwierig, jedoch an Zeilen zu sparen schon. Ich könnte jedes Ereignis einzeln auftreten ( z.b. bei einer großen straße könnte ich so machen, dass wenn eine Zahl 1 ist, eine zweite 2 sein muss, eine dritte 3 und so weiter bzw. wenn einer Zahl 2 ist, die 2. eine 3 und so weiter), jedoch kriege ich das nicht richtig gebacken, als Code aufzuschreiben. Meine Idee wäre gewesen, dass ich ein Prozedur habe, die diese Zahlen von klein auf groß speichert, dann könnte ich einfach mit dem kleinsten anfangen und gucken, ob die nächst größere +1 ist. und wenn das 4mal geklappt hab hab ich eine große Straße :D
Außerdem weiß ich nicht wie ich das mit den Würfeln machen soll. Ich kann das im internen mit einem "for x := 1 to 5 do x := random(6)+1" machen, aber wenn ich das als Text in einem Editfeld rausgeben will, krieg ich das nicht gebacken, da ich dieses zahl to zahl bei namen nicht benutzen kann. Meine Textfelder heißen sowas wie: wuerfel1, wuerfel2 und so. Könnte man das auch noch machen, dass ich mit einem "for z := 1 to 5 do wuerfel(z).text := inttostr(random(6)+1)" oder ähnlichem?

Ich hoffe ihr helft mi[url]r bei diesem Projekt bis zum Ende, danke :)



Hallo, ChillerNWA!

Ich habe auch schon mal ein Kniffel-Programm geschrieben. Kannst Du Dir sogar runterladen (ohne Quelltext):

http://www.thkoegler.de/ unter Programmierung

Die Würfel, die ich da verwende (Delphi 3, Rx-Libs), sind auch als Feld angelegt. So, wie Du das oben beschreibst.


Delphi-Quelltext
1:
var Wuerfel: array[1..5if TRxDice;                    



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:
  for i:=1 to 5 do
  begin
    { 5 Würfel erzeugen }
    Wuerfel[i] := TRxDice.Create(frmKniffel);
    { Für jeden Würfel ... }
    with Wuerfel[i] do
    begin
      { sichtbar machen }
      Parent := frmKniffel;

      { das erste mal Würfeln }
      Tag := 1;

      { Positionieren }
      top := 8;
      left := 104 * (i-1) + 8;

      { Behandlungsroutine setzen }
      OnClick := RxDice1Click;
      OnStop := RxDice1Stop;

      { Die Würfel stoppen automatisch nach 1 s }
      AutoStopInterval := 1000;
    end;
  end;


In gleicher Weise sollte es mit Textfeldern oder Labeln funktionieren.

Zur Auswertung:
Ich habe eine Prozudur geschrieben, die mit case auf die gewählte Zeile prüft und die entsprechende Auswertung vornimmt. Dabei werden die Zeilen 1-6, 7 und 8 sowie 10 und 11 zusammengefasst ausgewertet. Mehr kürzen ist, glaube ich, nicht drin.

Wenn Du weitere Fragen hast, melde Dich gerne noch mal!

Viele Grüße

Thomas


ChillerNWA - So 08.11.09 12:12

Das ist echt lieb von dir, ich werde mir das mal anschauen und weiterverfolgen :)
Super, echt nett, dass hier nicht wie bei manchen anderen Foren erstmal genörgelt wird vonwegen "Fang doch was anderes erstmal an" oder sowas :D Irgendwie hat mich das jetzt total motiviert Informatik weiter zu machen :)
Gruß

Edit:
Könnte ich das nicht so machen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
var wuerfel : array[1..5of TEdit;
   z : integer;
begin
for z := 1 to 5 do
  wuerfel[z].Text := inttostr(random(6)+1);
end;


Bei var hast du if TRxDice, bei mir hat er nur of angenommen.
Oder hab ich das komplett falsch verstanden?

Hmm, ich denke mal, es liegt dadran, dass z ein integer ist und der name ein string?


Lannes - So 08.11.09 14:57

Hallo,

user profile iconChillerNWA hat folgendes geschrieben Zum zitierten Posting springen:
...Irgendwie hat mich das jetzt total motiviert Informatik weiter zu machen :)
:zustimm:

RxDice ist eine Fremd-Komponente aus der RX-Library: Link [http://www.picsoft.de/compon.htm]
Da Du sie nicht installiert hast, hat Delphi gemeckert.

user profile iconChillerNWA hat folgendes geschrieben Zum zitierten Posting springen:
Hmm, ich denke mal, es liegt dadran, dass z ein integer ist und der name ein string?
nein, es liegt daran das dem Array keine Edits zugeordnet sind. Zum Thema Komponenten in Arrays verwalten hat user profile iconChristian S. eine Beitrag in der Delphi-Library hinterlegt(Link [http://www.delphi-library.de/topic_Komponenten+dynamisch+im+Array+verwalten_43052.html]). Da wird ein dynamisches Array benutzt, aber für ein Kniffel-Spiel reicht ein statisches Array, die Anzahl der Würfel verändert sich ja nicht.

Die Variable z ist der Schleifenzähler, dieser wird genutzt zum Zugriff auf das Array über den Index.
Ich kann Dir mal den Delphi-Crashkurs [http://www.christian-stelzmann.de/index_tutorials_crashkurs.html] empfehlen, den auch user profile iconChristian S. erstellt hat.