![]() |
Spiel - Wo liegt Was?
Hallo zusammen,
für eine Projektarbeit des letzten Kurshalbjahres haben meine Gruppe und ich vorgenommen das "Schlag den Raab" Spiel - Wo liegt Was? zu programmieren. Nun sind wir jedoch an einem Punkt angekommen, wo unser Wissen nicht mehr ausreicht. Unsere Probleme sind: 1. Beim Zweispieler die Image1.OnMouseDown Prozedur einfügen 2. Ein Timer so einzustellen, dass nach 2 Sekunden der Computer seine Pinnadel setz und dann nochmal 2 Sekunden später die Lösung angezeigt wird. Der Rest der noch offen ist, schaffen wir noch allein. Diese 2 Probleme jedoch nicht.
Delphi-Quellcode:
Wir hoffen ihr könnt uns helfen.
unit Unit1;
{$MODE Delphi} interface uses LCLIntf, LCLType, LMessages, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Buttons; type { TForm1 } TForm1 = class(TForm) Button1: TButton; ComboBox1: TComboBox; Edit1: TEdit; Edit2: TEdit; Image1: TImage; Panel1: TPanel; SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; SpeedButton4: TSpeedButton; SpeedButton5: TSpeedButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure SpeedButton2Click(Sender: TObject); procedure SpeedButton3Click(Sender: TObject); procedure SpeedButton4Click(Sender: TObject); procedure SpeedButton5Click(Sender: TObject); private { Private-Deklarationen } public function pinn(x,y:integer):tpoint; procedure orte; procedure fragen; procedure gegner1; procedure gegner2; procedure gegner3; { Public-Deklarationen } end; var Form1: TForm1; pixX, pixY: integer; xnull, ynull: integer; xmax,yMax: real; xEinheit, yEinheit: real; //für die Koordinatentransformation, siehe function koordinaten und Button1Click kilometer: real; //siehe Button1Click - um zu wissen wie viel Kilometer 1 Pixel ist k: tpoint; //für Koordinatentransformation der Orte - Tform1.Orte i : integer; //für Random - zufällige Ortsauswahl m,n:integer; //siehe Image1MouseDown l: real; //für die Lösung bei SpeedButton3Click implementation {$R *.lfm} function koordinaten(x,y:real):tpoint; //Koordinatentransformation begin koordinaten.X:=pixX+round(x*xEinheit); //Längengrad koordinaten.Y:=pixY-round(y*yEinheit); //Breitengrad end; function tform1.pinn(x,y:integer):tpoint; //Pinnnadel Zeichnung begin image1.canvas.moveto(x,y); image1.canvas.brush.color:=clblack; image1.canvas.lineto(x+15,y-50); image1.canvas.MoveTo(x,y); image1.canvas.lineto(x-15,y-50); image1.canvas.lineto(x+30,y-50); image1.canvas.floodfill(x,y-5,clblack,fsborder); image1.canvas.brush.Color:=clred; image1.canvas.ellipse(x+25,y-60,x-25,y-35); end; procedure TForm1.Button1Click(Sender: TObject); //Deklarationen begin randomize; pixX:=image1.width; pixY:=image1.height; xnull:=pixX div 2; ynull:=pixY div 2; xMax:=360; yMax:=180; xEinheit:=xnull/xMax; yEinheit:=ynull/yMax; kilometer:=sqrt(sqr(40075.016/pixX)+sqr(20003.9/pixY)); end; procedure tform1.orte; //Koordinaten der Orte begin if i = 1 then k:=koordinaten(-74,40);//New York if i = 2 then k:=koordinaten(10,51);//Brocken if i = 3 then k:=koordinaten(37,-3);//Kilimandscharo //im Original noch viele weitere Orte end; procedure tform1.fragen; //Fragen zu den Orten begin if i = 1 then panel1.caption:='Wo liegt die größte Metropole der USA?'; if i = 2 then panel1.caption:='Wo liegt der größte Berg Sachsen-Anhalts?'; if i = 3 then panel1.caption:='Zeige auf der Karte den Kilimandscharo.'; //im Original noch viele weitere Fragen end; procedure tform1.gegner1; //Gegnererstellung - Einfach VAR a,b,c,d:integer; e:extended; begin if kilometer<>0 then c:=Round(500/kilometer); //ansonsten kilometer ist 0 und löst SIGFPE aus a:=random(k.x+c)+1; d:=random(k.y+c)+1; e:=sqrt(sqr(a-k.x)+sqr(d-k.y)); if c > e then begin pinn(k.x+a,k.y+d); end; end; procedure tform1.gegner2; //Gegnererstellung - Mittel VAR a,b,c,d:integer; e:extended; begin if kilometer<>0 then c:=Round(250/kilometer); //ansonsten kilometer ist 0 und löst SIGFPE aus a:=random(k.x+c)+1; d:=random(k.y+c)+1; e:=sqrt(sqr(a-k.x)+sqr(d-k.y)); if c > e then begin pinn(s+a,t+d); end; end; procedure tform1.gegner3; //Gegnererstellung - Schwer VAR a,b,c,d:integer; e:extended; begin if kilometer<>0 then c:=Round(100/kilometer); //ansonsten kilometer ist 0 und löst SIGFPE aus a:=random(k.x+c)+1; d:=random(k.y+c)+1; e:=sqrt(sqr(a-k.x)+sqr(d-k.y)); if c > e then begin pinn(s+a,t+d); end; end; procedure TForm1.SpeedButton1Click(Sender: TObject); //Einzelspieler begin fragen; orte; end; procedure Tform1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); //Setzen der Pinnnadel begin m:=Round(Image1.Picture.Width/Image1.Width*X); n:=Round(Image1.Picture.height/Image1.height*Y); pinn(m,n); //Pinn wieder löschen bei nächsten Klick end; procedure TForm1.SpeedButton2Click(Sender: TObject); //Zweispieler begin i:=random(3)+1; fragen; orte; //hier OnMouseDown Prozedur //diese dann visible:=false; //OnMouseDown Prozedur für Spieler 2 //erste OnMouseDown visible:=true end; procedure TForm1.SpeedButton3Click(Sender: TObject); //Runde beenden begin Edit1.text:=inttostr(k.x); //zur Sicherheit, dass die Koordinatentransformation stattgefunden hat Edit2.text:=inttostr(k.y); //zur Sicherheit, dass die Koordinatentransformation stattgefunden hat //mit ComboBox Schwierigkeitsauswahl gegner1; //nur zum test //Gegner setzt seinen Punkt nach 2 Sekunden //wieder nach zwei Sekunden folgende Lösunganzeige image1.canvas.brush.color:=clyellow; image1.canvas.ellipse(k.x-10,k.y-10,k.x+10,k.y+10); timer1.Enabled :=false; l:=(sqrt(sqr(m-k.x)+sqr(n-k.y))); panel1.caption:=floattostr(l*kilometer); end; procedure TForm1.SpeedButton4Click(Sender: TObject); //nächste Frage begin i:=random(3)+1; fragen; orte; //Bild wieder clearen end; procedure TForm1.SpeedButton5Click(Sender: TObject); //Spiel beenden begin //Spiel beenden end; end. Grüße Pegaro |
AW: Spiel - Wo liegt Was?
Ich dachte ja, daß sich in dem Code eure nichtfunktionierende Lösung steckt, so daß man sehen kann ob/was ihr falsch macht?
So kann meine Antwort, auf deine Frage, nur
Delphi-Quellcode:
lauten.
Timer1.Enabled := True;
PS: Warum sind ALLE Variablen global und liegen nicht in TForm1? Bei den meisten Variablen weiß hier KEINER was die eigentlich machen. (weder kommentiert, noch ein verständlicher Name) Hat man euch nicht beigebracht, was Funktionen sind? Dank der vielen unverständlichen Variablen erkennt man garnicht was wie miteinander verbunden ist. Beispiel:
Delphi-Quellcode:
=>
procedure tform1.orte; //Koordinaten der Orte
Delphi-Quellcode:
function TForm1.GibMirEinenOrt(Index: Integer): TPoint; //Koordinate des Ortes
|
AW: Spiel - Wo liegt Was?
Danke erst einmal für die schnelle Antwort. Ich habe die Variablen jetzt mal kommentiert, du hattest recht, war sehr chaotisch. Im Genaueren liegen die Probleme bei SpeedButton2Click und SpeedButton3Click.
Dein Beispiel mit der Funktionen hatten wir so nicht im Unterricht. |
AW: Spiel - Wo liegt Was?
Auf die katastrophalen Variablennamen wurde ja schon hingewiesen (ein aussagekräftiger Name macht den Code wesentlich lesbarer und Kommentare können dann meistens ganz entfallen).
In dem Spielzyklus gibt es unterschiedliche Zustände:
Delphi-Quellcode:
dann reagiert man im Timer-Event darauf wie folgt:
SpielzugStatus := 0;
SpielzugTimer.Interval := 2000; SpielzugTimer.Enabled := true;
Delphi-Quellcode:
procedure TForm1.SpielzugTimerTimer( Sender : TObject );
begin SpielzugTimer.Enabled := False; Inc( SpielzugStatus ); case SpielzugStatus of 1 : // Computer setzt sein Fähnchen begin ... end; 2 : // Spielzug am Ende begin ... end; end; SpielzugTimer.Enabled := SpielzugStatus < 2; end; |
AW: Spiel - Wo liegt Was?
@Sir Rufo, das Problem mit dem Timer scheint jetzt gelöst zu sein. Danke dafür :-D
Hast du oder wer anders vielleicht noch eine Lösung für mein Image1MouseDown Problem? Sprich diese Prozedur in die SpeedButton2 Prozedur mit rein zu packen? |
AW: Spiel - Wo liegt Was?
Zitat:
Delphi-Quellcode:
) und diese Methode kann man dann auch von überall aus aufrufen.
SetzePin
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz