"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

SOLVED: Delphi Problem

Luki1987 03.12.2004 - 17:07 2125 29
Posts

Luki1987

Ihr wollt Wacker sein?
Avatar
Registered: Oct 2003
Location: Tirol
Posts: 1630
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
Avatar
Registered: Oct 2002
Location: *
Posts: 2689
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?
Avatar
Registered: Oct 2003
Location: Tirol
Posts: 1630
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?
Avatar
Registered: Oct 2003
Location: Tirol
Posts: 1630
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 :eek: Kann man da einen Array oder eine for-to-do-Schleife oder wwi schreiben?
MfG

murcielago

Dr. Doom
Avatar
Registered: Oct 2002
Location: *
Posts: 2689
lol,

Code:
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?
Avatar
Registered: Oct 2003
Location: Tirol
Posts: 1630
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
Avatar
Registered: Oct 2002
Location: *
Posts: 2689
lol, na das hat ja keinen sinn so, i glaub meins is a bisl leichter ;) und funktionierts?

Luki1987

Ihr wollt Wacker sein?
Avatar
Registered: Oct 2003
Location: Tirol
Posts: 1630
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
Avatar
Registered: Oct 2002
Location: *
Posts: 2689
nein!!!

wie gesagt, einfach: zeile*spalte rechnen und mit k vergleichen!

falsch
Code:
if (k = zeile*spalte) then showMessage('Schatz gefunden!')

edit: na, so stimmts nu ned ganz, moment, muss noch überlegen :D

das von oben vergessen, so stimmts:

Code:
if ((zeile-1)*10+spalte) = k then showMessage('Schatz gefunden!');
Bearbeitet von murcielago am 03.12.2004, 23:57

Luki1987

Ihr wollt Wacker sein?
Avatar
Registered: Oct 2003
Location: Tirol
Posts: 1630
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: 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
Avatar
Registered: Oct 2002
Location: *
Posts: 2689
ok, machs ganz anders:

speicher dir beim start vom programm ab:

Code:
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:

Code:
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! :D

Luki1987

Ihr wollt Wacker sein?
Avatar
Registered: Oct 2003
Location: Tirol
Posts: 1630
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
Avatar
Registered: Oct 2002
Location: *
Posts: 2689
jo alles andere wäre zu kompliziert, so is ja einfachst und auch richtig.

Luki1987

Ihr wollt Wacker sein?
Avatar
Registered: Oct 2003
Location: Tirol
Posts: 1630
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
Avatar
Registered: Oct 2002
Location: *
Posts: 2689
tja, das abstandx*abstandx und abstandy*abstandy könntest noch verbessern auf pow(abstandx,2)+pow(abstandy,2)

wäre sauberer ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz