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! 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. *freu* Naja, jetzt gibt's halt das Problem, dass ich das nicht unbedingt für alle 100 Zeilen so per Hand schreiben will 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 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 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: Wie soll er mit "k" vergleichen, wenn "k" nicht definiert ist? 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? 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
|