Luki1987
Ihr wollt Wacker sein?
|
OK, thx. Werde einmal schauen, ob ich das irgendwie verwerten kann... Argh... Ist programmieren vielleicht viel Aufwand (wobei ich mich schäme, diese Aufgabe als "programmieren" zu bezeichnen *g*)... Respekt an alle Programmierer! ![;)](/images/smilies/wink.gif) MfG
|
murcielago
Dr. Doom
|
na aber is klar was ich meine oda?
markierst im designer das image, gehst in den objekt-inspektor, unter ereignisse, machst an doppelklick auf des onMouseDown und dann bekommst du X und Y von da maus. wenn er jetz zum beispiel x=25 und y=25 hat, weißt du dass er ins erste feld geklickt hat, usw...
|
Luki1987
Ihr wollt Wacker sein?
|
Ja, danke, ich bin gerade dabei das zu machen. OnMouseDown habe ich schon gefunden und X und Y werden dann sowieso automatisch übergeben. Jetzt muss ich nur noch eine Prozedur finden, die die Rechtecke mit den X-/Y-Werten vergleicht... Thx noch einmal. MfG
|
Luki1987
Ihr wollt Wacker sein?
|
So, wieder ein Update: Diese Prozedur geaddet: procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (X<51) and (Y<51) then k:=1; if k=schatz then showmessage('Sie haben den Schatz gefunden!') end; Variable k ist ganz oben definiert. Naja, so funktioniert es, wenn Schatz (die Zufallsvariable) 1 ist und man in das erste Feld (X<51, Y<51) klickt. ![;)](/images/smilies/wink.gif) *freu* Naja, jetzt gibt's halt das Problem, dass ich das nicht unbedingt für alle 100 Zeilen so per Hand schreiben will ![:eek:](/images/smilies/eek.gif) Kann man da einen Array oder eine for-to-do-Schleife oder wwi schreiben? MfG
|
murcielago
Dr. Doom
|
lol, var zeile, spalte: integer;
spalte := x div 50;
if (x mod 50) > 0 then inc(spalte);
zeile := y div 50;
if (y mod 50) > 0 then inc(zeile);
einfach deinen x wert durch die rechtecks-breite dividieren, und schaun ob ncoh ein rest bleibt, wenn ja, dann +1 sonst nicht. zB er klickt auf koordinaten 460 und 490 (x und y) dann is 470 durch 50 = 9 470 mod 50 = 20, was wiederum > 0 is, also is die spalte 10 (durch das inc(spalte), das erhöht nur den wert von spalte um 1, kannst auch schreiben spalte := spalte +1). bei 490 das selbe, also zeile 10. é voila, haben wir scho wo er hinklickt hat ![;)](/images/smilies/wink.gif) jetz brauchst nur noch zeile * spalte rechnen und hast genau dein feld wo er hinklickt hat.
Bearbeitet von murcielago am 03.12.2004, 23:30
|
Luki1987
Ihr wollt Wacker sein?
|
Genial! Die ersten zehn hätte ich schon fertig gehabt:
if (X<51) and (Y<51) then k:=1; if (X>50) and (X<101) and (y<51) then k:=2; if (X>100) and (X<151) and (y<51) then k:=3; if (X>150) and (X<201) and (y<51) then k:=4; if (X>200) and (X<251) and (y<51) then k:=5; if (X>250) and (X<301) and (y<51) then k:=6; if (X>300) and (X<351) and (y<51) then k:=7; if (X>350) and (X<401) and (y<51) then k:=8; if (X>400) and (X<451) and (y<51) then k:=9; if (X>450) and (X<501) and (y<51) then k:=10;
:cordless: Thx!
|
murcielago
Dr. Doom
|
lol, na das hat ja keinen sinn so, i glaub meins is a bisl leichter ![;)](/images/smilies/wink.gif) und funktionierts?
|
Luki1987
Ihr wollt Wacker sein?
|
Ja, deines funktioniert wunderbar. Nur: Ich muss dann ja wieder überprüfen welche Spalte/Zeile es ist -> welches Feld. Also muss ich ja doch 100x das (bzw. so was ähnliches) schreiben: if (zeile=1) and (spalte=1) then k:=1; oder?
|
murcielago
Dr. Doom
|
nein!!! wie gesagt, einfach: zeile*spalte rechnen und mit k vergleichen! falschif (k = zeile*spalte) then showMessage('Schatz gefunden!')
edit: na, so stimmts nu ned ganz, moment, muss noch überlegen das von oben vergessen, so stimmts:if ((zeile-1)*10+spalte) = k then showMessage('Schatz gefunden!');
Bearbeitet von murcielago am 03.12.2004, 23:57
|
Luki1987
Ihr wollt Wacker sein?
|
Irgendwas geht nicht? Die Zeilen/Spalten liest er richtig aus (habe ich mit panel1.caption:=inttostr(zeile/spalte) überprüft). Nur an dem Vergleich muss es hapern? Thx noch einmal für alles, MfG Edit: ![:bash:](/images/smilies/bash.gif) Wie soll er mit "k" vergleichen, wenn "k" nicht definiert ist? ![;)](/images/smilies/wink.gif) Edit2: Ha, gefunden. Das ist es: k:=((zeile-1)*10+spalte);
if k=Schatz then ShowMessage('Schatz gefunden!');
So, jetzt fehlt "nur" mehr der Abstand
Bearbeitet von Luki1987 am 04.12.2004, 00:38
|
murcielago
Dr. Doom
|
ok, machs ganz anders: speicher dir beim start vom programm ab: schatzzeile := 1+random(10);
schatzspalte := 1+random(10);
im onMouseDown bleibts wie gehabt, dann hast schatzzeile, schatzspalte, klickzeile und klickspalte. und dann fragst einfach ab: if (schatzzeile = klickzeile) and (schatzspalte = klickspalte) then
showmessage('Schatz gefunden')
else begin
abstandx := schatzspalte-klickspalte;
abstandy := schatzzeile-klickzeile;
abstand := sqrt(abstandx*abstandx + abstandy*abstandy);
schowmessage('du bist noch '+floatToStr(abstand)+' vom schatz entfernt!');
end;
so, mehr is glaub ich nimma zum tun!
|
Luki1987
Ihr wollt Wacker sein?
|
Jetzt hätte ich es gerade (mit deiner enorm großzügigen Hilfe) herausgefunden und jetzt soll ich wieder alles ändern? ![;)](/images/smilies/wink.gif) Die Idee, die hinter deinem letzten Post steckt, ist durchaus logisch, ja... Naja, heute nicht mehr. Danke noch einmal für die Hilfe! Hat mich echt weitergebracht... MfG, Luki
|
murcielago
Dr. Doom
|
jo alles andere wäre zu kompliziert, so is ja einfachst und auch richtig.
|
Luki1987
Ihr wollt Wacker sein?
|
So, jetzt funktioniert es. Thx noch einmal! Hier der gesamte Quellcode:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, DBCtrls;
type TForm1 = class(TForm) Button1: TButton; Panel1: TPanel; Image1: TImage; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel; procedure Button1Click(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; klickzeile, klickspalte: integer; schatzzeile, schatzspalte: integer; abstandx,abstandy,abstand: real; implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=1 to 9 do begin with Image1 do begin Canvas.Pen.Width:=1; Canvas.Pen.Color:=clblack; Canvas.MoveTo(i*50,0); Canvas.LineTo(i*50,500); Canvas.MoveTo(0,i*50); Canvas.LineTo(500,i*50); end; randomize; schatzzeile:=1+random(10); schatzspalte:=1+random(10); panel1.caption:=''; end; end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin klickspalte:=X div 50; if (X mod 50) > 0 then klickspalte:=klickspalte+1;
klickzeile:=Y div 50; if (Y mod 50) > 0 then klickzeile:=klickzeile+1;
if (schatzzeile = klickzeile) and (schatzspalte = klickspalte) then showmessage('Schatz gefunden') else begin abstandx:= schatzspalte-klickspalte; abstandy:= schatzzeile-klickzeile; abstand:= sqrt(abstandx*abstandx + abstandy*abstandy); panel1.Caption:='Sie sind noch '+floatToStr(abstand)+' vom Schatz entfernt!' end;
end;
end.
MfG, Luki
|
murcielago
Dr. Doom
|
tja, das abstandx*abstandx und abstandy*abstandy könntest noch verbessern auf pow(abstandx,2)+pow(abstandy,2) wäre sauberer
|