URL: https://www.overclockers.at/coding-stuff/solved_delphi_problem_131146/page_1 - zur Vollversion wechseln!
Hallo. Also ich habe in Informatik Wahlpflichtfach (8. Klasse Gymnasium) eine Hü bekommen: Ich soll mit Delphi (wir verwenden die aktuelle 6.0er Version) ein kleines "Spiel" programmieren:
Dabei braucht man eigentlich nur ein Panel, ein Image und einen Button. Im Image sollten zuerst einmal 100 Felder erstellt werden (10x10; ich habe dafür 500x500 Pixel genommen, sprich 5x5 Pixel für jedes Feld). Am Anfang jeder "Runde" soll in einem der Felder ein "Schatz" versteckt werden. Nun beginnt die Schatzsuche. Sobald man auf ein Feld drückt, erscheint auf dem Panel die Entfernung zum Schatz (um diese auszurechnen muss man den Pythagorassatz verwenden - die Entfernung kann ruhig dezimal angegeben werden).
Ja, sobald man den Schatz gefunden hat, soll das Spiel halt abgebrochen werden und man soll es über den Button wieder neu starten können.
Könntet ihr mir dabei helfen? Bin nicht so wirklich bewandert in Delphi.
Big TIA!
MfG
Du hast kein Delphi-Problem, sondern ein Motivationsproblem. Wir machen nicht deine Hausübung.
Wenn du spezifische Fragen stellst und beweisen kannst, dass du selbst nachgedacht hast, dann wird dir sicher geholfen.
Gut, passt. Ich bin gerade dabei das zu versuchen, nur komme ich absolut net weiter. Naja, dann fangen wir einmal am Anfang an:
Ich habe ein Image erstellt (Image1) -> nun will ich da drauf die Linien erstellen (damit diese 100 Kästchen entstehen). Wie mach ich das?
image1.canvas.lineto(X;Y);
Geht das? Bzw. wie gebe ich die Koordinaten in der Klammer an - da sollten ja eigentlich 4 Stück rein oder (X,Y-Koordinate vom Startpunkt und X,Y-Koordinatie vom Endpunkt)?
i hab leider delphi gerade nicht installiert, aber die Delphi hilfe is äh so schön gemacht, da steht äh immer alles ganz genau und oft auch mit Beispielen.
Schleifen wirst auch machen müssen ( oder alles selbst reinschreiben :> ). Für den Schatz machst z.B.: ein Array 10x10 und machst ihn zufällig wo rein...
Wirst du schon zambringen
Mit MoveTo und LineTo, soweit ich weiß.
Delphi 6 als "die aktuelle" zu bezeichnen, ist aber auch etwas komisch...
@Souly: In der Hilfe steht der Befehl image1.canvas.lineto(X;Y) -> nur eigentlich müsste ich ja vier Koordinaten eingeben bzw. wird mir sobald ich das Programm starten will, angezeigt, dass "canvas" ein "undeclared identifier" ist...
@RingDing: Aha, beide Befehle. Thx, das werd ich einmal versuchen. Wir verwenden Delphi 6; ich dachte das wäre die aktuellste (Schul-PCs sind eigentlich relativ gut (P4 2,6c) - kürzlich aufgerüstet)...
Naja, thx auf jeden Fall einmal an alle, ich werde einfach probieren und noch einmal probieren...
MfG
also zuerst setzt in startpunkt mit image1.canvas.moveto(x,y) dann image1.canvas.lineto(x,y). btw. machs mit einer Paintbox!, image is ja nur wennst bilder einfügen willst.
Ja, das probier ich die ganze Zeit (wir haben es bisher nur mit image1.canvas gemacht -> darum verwende ich das weiter), aber es zeigt mir das "Canvas" immer als "undeclared identifier" an.
OK, das mit den Linien passt. Ich meld mich später wieder
So, zu früh gefreut. Irgendwie kommen da keine Striche. Wenigstens ist die Fehlermeldung jetzt weg, aber er zeichnet noch immer nichts. Liegt's evtl. an der Strichfarbe (Hintergrundfarbe=Strichfarbe)?
Hier die derzeitige Unit:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, DBCtrls;
type
TForm1 = class(TForm)
Image1: TDBImage;
Button1: TButton;
Panel1: TPanel;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var t: integer;
begin
for i:=1 to 9 do
begin
with image1 do
begin
Canvas.MoveTo(t*50,0);
Canvas.LineTo(t*50,500);
Canvas.MoveTo(0,t*50);
Canvas.LineTo(500,t*50);
t:=t+1;
end;
end;
end;
end.
Habe versucht, das gleich mit einer Variable "t" zu lösen, die in jeder Schleife um eines erhöht wird -> alle 50 Pixel sollte ein Strich entstehen (waagrecht und senkrecht). Laufen tut das Programm, aber es entstehen keine Striche? Sieht jemand einen Fehler?
Doh, ich bin so überfordert mit der Aufgabe... Naja, was soll's.
Wäre nice, wenn mir wer verraten könnte, woran es liegt, dass kein "Gitter" entsteht???
TIA.
MfG
Edit: Oder wie geht das mitm Array?
Kann mir echt keiner helfen? Es wäre echt nice, wenn ihr mir NUR verraten könntet, warum da nichts gezeichnet wird?!? Woran liegt das? Thx.
Wieder Solved...
So, wieder ein Problem:
Ich habe mittlerweile das Image mit den 100 Feldern erstellt. Funktioniert wunderbar, ich habe bisher alles auf den Button programmiert, weil das eben jedes Mal, wenn man das Spiel startet passieren soll.
Weiters lasse ich eine Zufallszahl zwischen 1 und 100 generieren, die das Feld markiert, an der der Schatz "vergraben" ist.
Nur soll jetzt regisitriert werden auf welches Feld der Spieler klickt. Wie kann ich ein Image unterteilen (also eben dass ich die 100 Felder, die ich soeben durch Linien erzeugt habe, auch untereinander abgrenzen kann, damit man feststellen kann, wohin der Spieler geklickt hat)?
Irgendwie geht das mit den Pixeln iirc, aber ich weiß den Befehl nicht mehr und Google findet auch nichts?!? Oder muss man doch Rectangles machen? Naja, ich weiß nicht mehr weiter...
Hilfe!
TIA!
MfG
Edit: Der Code:
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;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
schatz: integer;
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;
schatz:=random(100)+1;
end;
end;
end.
auf des image gibts sicher an onclick event oder?
Ja, das Image ist aber das ganze (sprich alle 100 Felder) -> ich brauche das aber separat (weil der Schatz ist ja nur in EINEM der Felder) - gibt's da keine Lösung?
Trotzdem thx für deine Hilfe!
MfG
Edit: Bin gerade draufgekommen, dass eine andere Möglichkeit wäre, Rechtecke zu erstellen:
image1.canvas.rectangle(0,0,50,50); usw.
Evtl. ist das besser?
klar gibts was.
im onmousedown event handler bekommst x und y koordinate vom mauszeiger mit. also wohin er klickt hat, wennst jetz ein bischen herumrechnest bekommst genau das feld heraus wohin er klickt hat, verstehst?
und des mim rectangle vergiss bzw. kannst es auch so machen, bleibt sich aber dann blunzn.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025