Registriert seit: 9. Feb 2009
4 Beiträge
|
Bitte um Hilfe bei der "KI" von schiffeversenken
9. Feb 2009, 22:04
guten abend,
ich erstelle gerade das spiel Schiffeversenken als Projekt im ITG Unterricht klasse 12.
meine KI geht nicht richtig, da ich die meldung mit dem versenkt nich hinbekomme
bitte bei der KI um hilfe
Wir dürfen nich objektorientiert arbeiten, weil es unser lehrer nicht versteht.
ich hoffe, ich habe es genug erklärt
schonmal danke, sven
mal ein kurzer aufbau
alle schjiffe werden zufällig vom PC platziert mit einem rand herum, das geht gut
3 einer
2 zweier
2 dreier
1 4er
alle nur längs und waage+senkrecht
Spielfeld ist 10 mal 10
dafür habe ich einj array[1..10,1..10,1..5] of integer;
ich verwende zZ 3 der 5 Z ebenen
Z1: schiff da oder nicht z1=0 nix =1 neben einem schiff =2 da ist ein schiff (am anfang alle auf 0)
z2: geschossen oder nicht =0 nicht geschossen =1 geschossen
( hier etwas für meinen jetzigen versuch der KI,
in der Z4 liegen größen + nummern der schiffe in form von 10er=größe einer=nummer
(Bsp: 24 ist 2 lang, das 4. schiff, einzelwerte per DIV+Mod erreichbar)
ich hab so das gefühl, das klappt so nicht ganz )
Meine KI fängt per zufall an (in einer schleife, damit nix doppelt abgeschossen wird)
und sol dann eigentlich per random(4) dann in eine richtung gehen... klappt meistens
dann merkt er ja ob waagerecht oder senkrecht und soll ich die entsprechde richtung weiter gehen
aufhören mit suchen soll er, wenn das schiff abgeschossen ist (deshalb soll er mit der schiffgröße vergleichen, damit er die meldung "versenkt" erhalten kann
ich gebe mal teile meines textes dazu
hier platziere ich ein 2er schiff (schiff der länge 2 im array 1 (das array, wo der gegner hin schießt)
Delphi-Quellcode:
procedure schiff12;
var i,j,x2,y2,r,x1,y1: integer;
begin
Repeat
x1:=random(10)+1;
y1:=random(10)+1;
r:=random(2);
If r=0 then
begin
x2:=x1+1; y2:=y1;
end;
If r=1 then
begin
x2:=x1; y2:=y1+1;
end;
Until (feld[x1,y1,1]=0) and (feld[x2,y2,1]=0) and (x2<11) and(y2<11) and (x2>0) and (y2>0) ;
form1.Image1.Canvas.Rectangle(40*(x1-1),40*(y1-1),40*(x2),40*(y2));
for i:=x1-1 to x2+1 do
begin
for j:=y1-1 to y2+1 do
feld[i,j,1]:=1;
end;
feld[x2,y2,1]:=2; feld[x1,y1,4]:=20+durchlauf;
feld[x1,y1,1]:=2; feld[x2,y2,4]:=20+durchlauf;
platzieren ende
meine variablen
Delphi-Quellcode:
//globale variablen
var feld, feld2 : array [-1..12,-1..12,1..5] of integer;
var merk1, merk2, merk3, merk4 :array[1..2] of integer;
var schifftreffer : array[1..10,1..10] of integer;
var merka, merkb,ws, durchlauf : integer;
noch den brocken meiner KI, auch wenns nicht gut ersichtilich ist
Delphi-Quellcode:
procedure Gegner; //anfang KI
var hw1,hw2,x,y,r,x1,x2,x3,x4,t1,t2,x5,y1,y2,y3,y4,y5,s: integer;
begin
if merka = 0 then
begin
repeat
x1:=random(10)+1;
y1:=random(10)+1;
until feld[x1,y1,2]=0;
feld[x1,y1,2]:=1; //auf feld geschossen
if feld[x1,y1,1]=2 then
begin //treffer
form1.image1.Canvas.Pen.Color:=clsilver;
form1.image1.Canvas.brush.Color:=clred;
form1.Image1.Canvas.Rectangle(40*(x1-1),40*(y1-1),40*(x1),40*(y1));
merk1[1]:=X1; merk1[2]:=Y1;
gegner;
hw1:=feld[x1,y1,4] mod 10; //14 mod 10 = 4 schiffnummer I
hw2:=feld[x1,y1,4] div 10; // 14 div 10 = 1 größe Idas ist der versuch mit dem abgleichen
Inc( schifftreffer[hw1,hw2] ); I
form1.Edit1.text:=inttostr ( schifftreffer[hw1,hw2] ); I
If schifftreffer[hw1,hw2]< hw2 then I
merka:=1;
end
else
begin
form1.image1.Canvas.Pen.Color:=clblack;
form1.image1.Canvas.brush.Color:=clblack;
form1.Image1.Canvas.Rectangle(40*(x1-1),40*(y1-1),40*(x1),40*(y1));
end;
end;
if merka = 1 then
begin //es gab trefer
x1:=merk1[1]; //ausgangsfelder
y1:=merk1[2];
repeat
r:=random(4);
if r=1 then begin x2:=x1; y2:=y1+1; ws:=1; end; //hoch
if r=2 then begin x2:=x1; y2:=y1-1; ws:=2; end; //runter
if r=3 then begin x2:=x1+1; y2:=y1; ws:=3; end; //rechts
if r=0 then begin x2:=x1-1; y2:=y1; ws:=4; end; //links
until (feld[x2,y2,2]=0) and (x2>0) and (x2<11) and (y2>0) and (y2<11);
feld[x2,y2,2]:=1;
if feld[x2,y2,1]=2 then begin //wenn treffer dann
form1.image1.Canvas.Pen.Color:=clsilver;
form1.image1.Canvas.brush.Color:=clsilver;
form1.Image1.Canvas.Rectangle(40*(x2-1),40*(y2-1),40*(x2),40*(y2));
merk2[1]:=X2; merk2[2]:=Y2; merka:=2;
gegner;
end;
if (feld[x2,y2,1]<>2)and (feld[x2,y2,2]<>1) then begin //wenn kein treffer // else begin
form1.image1.Canvas.Pen.Color:=clgreen;
form1.image1.Canvas.brush.Color:=clgreen;
form1.Image1.Canvas.Rectangle(40*(x2-1),40*(y2-1),40*(x2),40*(y2));
end; end;
If merka = 2 then begin
repeat
s:=random(2);
x2:=merk2[1]; y2:=merk2[2];
if ws=1 then begin x3:=x2; If s=1 then y3:=Y2+1; If s=0 then y3:=y2-2; end;
if ws=2 then begin x3:=x2; If s=2 then y3:=Y2-1; If s=0 then y3:=y2+2; end;
if ws=3 then begin y3:=Y2; If s=1 then x3:=x2+1; If s=0 then x3:=x2-2; end;
if ws=4 then begin y3:=Y2; If s=1 then x3:=x2-1; If s=0 then x3:=x2+2; end;
until feld[x3,y3,2]=0;
end;
end;//ende von gegner
[edit=mkinzler]Delphi-Tags ergänzt Mfg, mkinzler[/edit]
|