Einzelnen Beitrag anzeigen

sven.ghostrider

Registriert seit: 9. Feb 2009
4 Beiträge
 
#1

Bitte um Hilfe bei der "KI" von schiffeversenken

  Alt 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]
  Mit Zitat antworten Zitat