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.