URL: https://www.overclockers.at/coding-stuff/solved_delphi_problem_131146/page_2 - zur Vollversion wechseln!
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
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...
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
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
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);
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!
lol, na das hat ja keinen sinn so, i glaub meins is a bisl leichter und funktionierts?
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?
nein!!!
wie gesagt, einfach: zeile*spalte rechnen und mit k vergleichen!
falsch
Code:if (k = zeile*spalte) then showMessage('Schatz gefunden!')
Code:if ((zeile-1)*10+spalte) = k then showMessage('Schatz gefunden!');
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
ok, machs ganz anders:
speicher dir beim start vom programm ab:
Code:schatzzeile := 1+random(10); schatzspalte := 1+random(10);
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;
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
jo alles andere wäre zu kompliziert, so is ja einfachst und auch richtig.
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
tja, das abstandx*abstandx und abstandy*abstandy könntest noch verbessern auf pow(abstandx,2)+pow(abstandy,2)
wäre sauberer
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025