SOLVED: Delphi Problem - Seite 2

Seite 2 von 2 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/solved_delphi_problem_131146/page_2 - zur Vollversion wechseln!


Luki1987 schrieb am 03.12.2004 um 22:45

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 schrieb am 03.12.2004 um 22:49

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 schrieb am 03.12.2004 um 22:55

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 schrieb am 03.12.2004 um 23:17

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 schrieb am 03.12.2004 um 23:25

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.


Luki1987 schrieb am 03.12.2004 um 23:32

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 schrieb am 03.12.2004 um 23:33

lol, na das hat ja keinen sinn so, i glaub meins is a bisl leichter ;) und funktionierts?


Luki1987 schrieb am 03.12.2004 um 23:45

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 schrieb am 03.12.2004 um 23:52

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!');


Luki1987 schrieb am 04.12.2004 um 00:33

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 ;)


murcielago schrieb am 04.12.2004 um 00:53

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 schrieb am 04.12.2004 um 00:59

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 schrieb am 04.12.2004 um 01:02

jo alles andere wäre zu kompliziert, so is ja einfachst und auch richtig.


Luki1987 schrieb am 04.12.2004 um 11:23

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 schrieb am 04.12.2004 um 12:50

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