Luki1987
Ihr wollt Wacker sein?
|
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
Bearbeitet von Luki1987 am 04.12.2004, 11:50
|
that
ModeratorHoffnungsloser Optimist
|
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.
|
Luki1987
Ihr wollt Wacker sein?
|
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)?
|
Souly
Addicted
|
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
|
Ringding
Pilot
|
Mit MoveTo und LineTo, soweit ich weiß.
Delphi 6 als "die aktuelle" zu bezeichnen, ist aber auch etwas komisch...
|
Luki1987
Ihr wollt Wacker sein?
|
@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
|
Souly
Addicted
|
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.
|
Luki1987
Ihr wollt Wacker sein?
|
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
Bearbeitet von Luki1987 am 03.12.2004, 17:59
|
Luki1987
Ihr wollt Wacker sein?
|
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?
Bearbeitet von Luki1987 am 03.12.2004, 20:01
|
Luki1987
Ihr wollt Wacker sein?
|
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.
|
Luki1987
Ihr wollt Wacker sein?
|
Wieder Solved...
|
Luki1987
Ihr wollt Wacker sein?
|
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.
|
murcielago
Dr. Doom
|
auf des image gibts sicher an onclick event oder?
|
Luki1987
Ihr wollt Wacker sein?
|
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?
|
murcielago
Dr. Doom
|
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.
Bearbeitet von murcielago am 03.12.2004, 22:45
|