AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Bitte um Hilfe bei der "KI" von schiffeversenken
Thema durchsuchen
Ansicht
Themen-Optionen

Bitte um Hilfe bei der "KI" von schiffeversenken

Offene Frage von "sven.ghostrider"
Ein Thema von sven.ghostrider · begonnen am 9. Feb 2009 · letzter Beitrag vom 11. Feb 2009
Antwort Antwort
sven.ghostrider

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

Bitte um Hilfe bei der "KI" von schiffeversenken

  Alt 9. Feb 2009, 21: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
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Bitte um Hilfe bei der "KI" von schiffeversenk

  Alt 9. Feb 2009, 21:36
Hallo erstmal,


Gib mal in der Suche Schiffe versenken ein und ich denke das könnte Dir helfen.

z.B. hier

Ein Beispiel von vielen

MFG

Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
hugo1990

Registriert seit: 27. Dez 2006
166 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Bitte um Hilfe bei der "KI" von schiffeversenk

  Alt 9. Feb 2009, 21:46
Ich kann dir jetzt zwar nicht wirklich bei deinem Problem helfen, da ich ziemlich müde bin und keine Lust habe mich in deinen Code ein zu arbeiten. Aber ich möchte dir ein paar Tipps geben, die dir die Arbeit leichter machen und es uns leichter machen deinen Code besser zu verstehen.

1. Für dein Problem würde ich kein 3-Dimensionales Integerarray verwenden, sondern ein 2-Dimensionales Array eines Records, den du dir vorher definierst.
2. Verwende bitte sprechende Variablennamen, denn glaube mir so wie wir uns jetzt schlecht in deinem Code zurecht finden, so wirst du dich wenn du in nem halben Jahr daran noch einmal was ändern möchtest schlecht zurecht finden, weil du dir erst wieder genau anschauen musst, wozu welche Variable ist. Wenn du die kuzen Variablennamen nur verwendest, weil du zu faul bist, jedes mal die langen Namen auszuschreiben, dann habe ich einen Tip für dich: Delphi hat eine Autovervollständigung, du brauchst nur den ersten bzw. die ersten paar Buchstaben der Variable einzutippen, dann drückst du STRG+SPACE und schon siehst du alle Variablen, die mit den bereits eingetippten Buchstaben beginnen.

Wenn ich morgen etwas mehr Zeit habe bzw. etwas munterer bin, werde ich mir deinen Quellcode nochmal zu Gemüte führen und schauen, ob ich einen Fehler finde. Und ich hoffe, dass du meine Tipps beherzigst, denn du tust dir und uns einen sehr großen Gefallen damit.
  Mit Zitat antworten Zitat
BullsEye

Registriert seit: 8. Sep 2007
Ort: Werlte
872 Beiträge
 
Delphi 7 Personal
 
#4

Re: Bitte um Hilfe bei der "KI" von schiffeversenk

  Alt 9. Feb 2009, 21:47
Dieses Schiffe versenken habe ich letztes Jahr mal programmiert. Allerdings weiß ich gerade nicht, ob es Up2Date ist. Funktionieren sollte es aber eigentlich!
(s. Anhang)
Angehängte Dateien
Dateityp: zip schiffe_versenken_159.zip (3,5 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
sven.ghostrider

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

Re: Bitte um Hilfe bei der "KI" von schiffeversenk

  Alt 9. Feb 2009, 22:02
erstmal danke, für die mühe
ich werde morgen in info die variablen mal umbenennen, und nochmal versuchen auf eine lösung zu kommen

abei mal das gesamte programm

mfg Sven
Angehängte Dateien
Dateityp: rar schiffe_vesenken__von_sven_181.rar (184,4 KB, 17x aufgerufen)
  Mit Zitat antworten Zitat
hugo1990

Registriert seit: 27. Dez 2006
166 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Bitte um Hilfe bei der "KI" von schiffeversenk

  Alt 10. Feb 2009, 20:16
Zitat von ghostider:
Wir dürfen nich objektorientiert arbeiten, weil es unser lehrer nicht versteht.
Diesen Satz verstehe ich nicht so recht, da ich der Meinung bin, wenn ich mir deinen Quellcode so anschaue, dass du auch keine Ahnung von OOP hast, also warum erwähnst du es dann erst?

Ich weiß ja nicht, was ihr alles schon zum Thema Programmieren gelernt habt, ob du schon vor dem Informatikunterricht programmiert hast und ob ihr euch das Projekt selber aussuchen durftet oder ihr die Aufgabe vom Lehrer bekommen habt ein Schiffeversenkenspiel zu schreiben, aber wie es mir scheint hast du/habt ihr noch nicht sehr viel Ahnung vom Programmieren habt. Ich schätze auch mal, dass ihr euch die Aufgabe selber ausdenken durftet. Ich entschuldige mich schon einmal, wenn ich falsch liegen sollte.
Also ehrlich gesagt finde ich es nicht sehr sinnvoll, sich mit dem Problem einer KI (auch wenn die für Schiffeversenken nicht so schwierig ist) auseinanderzusetzten, wenn man die wichtigsten Grundlagen der Programmierung noch nicht beherrscht.

Du hast z.B. für jedes Schiff, welches gesetzt werden soll eine extra Prozedur geschrieben und diese dann auch noch einmal für Feld 1 und dann für Feld 2, sowas kann man alles in einer Prozedur zusammenfassen und übergibt dieser dann bestimmte Parameter.

Und wenn ich ehrlich sein soll, dann müsste ich wenigsten 90% deines Codes verwerfen und durch neuen ersetzten, um dir helfen zu können, weil es einfach nur zu kompliziert von dir geschrieben ist.

Dann wollte ich noch erwähnen, dass ich das Prinzip von Schiffe versenken anders kenne und zwar wird abwechseld immer nur ein Schuss abgegeben, egal ob man etwas getroffen hat oder nicht.

Ich möchte dir hiermit keines Falls die Lust am Programmieren des Spiels verderben, sondern dir nur sagen, dass du es dir sehr kompliziert machst, was höchtwahrscheinlich aus deiner Unerfahrenheit im Programmieren zu schlussfolgern ist. Also falls es so sein sollte, dass ihr euch die Aufgabe selber ausdenken durftet, dann würde ich dir empfehlen, dir ein etwas leichteres Problem auszusuchen, denn dann wirst du mehr Spaß am Programmieren haben.

Ich könnte mich zwar jetzt hinsetzten und ein Schiffeversenkenspiel zusammencoden und dir den Quellcode zeigen, nur bin ich der Meinung, dass ich dir damit keines Wegs helfe, da du Programmieren lernen möchtest, nicht ich und Programmieren lernt man eben nur durch Programmieren. Nur dabei sollte man sich nicht zuweit aus dem Fenster lehnen, was du meiner Meinung nach mit der Idee eine KI für Schiffeversenken zu programmieren getan hast, denn sonst verliert man schnell du Lust am Programmieren.

Falls du deinen Code nochmal überarbeitet haben solltest, dann kannst du ihn ja nochmal posten, vllt ist er ja besser, so dass ich dir an deinem Code helfen kann.
  Mit Zitat antworten Zitat
sven.ghostrider

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

Re: Bitte um Hilfe bei der "KI" von schiffeversenk

  Alt 11. Feb 2009, 16:37
also das problem mit der KI hab ich jetzt schon fast gelöst, ich habe jedem feld einfach die schiffgröße in feld[x,y,4] gegeben
somit kann der PC dann aufhören zu suchen, wenn die treffer gleich der größe sind
ich bin nur nicht auf den ansatz gekommen einfach die größe weiterzugeben

das mit dem schiffsetzen in eine procedure mach ich noch...
ich hatt jetzt 7 monate nur prolog. Somit musste ich mich noch in delphi reindenken und das setzen geschah gleich am anfang
ich will nur erstmal das spielprinzip fertig machen, dannach optimieren
1ner, 2er und 3er trifft er schon

viel können wir im info kurs nicht
unser lehrer kanns einfach nicht
der konnte mir nicht helfen, da es ihm zuviele arrays waren...
und ich muss rücksicht auf meinen partner nehmen, der versteht auch fast nichts

erstmal danke für die antworten,
fals nochmal probleme auftreten meld ich mich
  Mit Zitat antworten Zitat
sven.ghostrider

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

Re: Bitte um Hilfe bei der "KI" von schiffeversenk

  Alt 11. Feb 2009, 16:40
nochmal wegen oop
ich habe davon keine ahnung
aber bisher kam jeder immer mit, "da musste oop machen" an,
auch wenn es dann einfacher ist bringt es mir nichts
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz