![]() |
Bitte um Hilfe bei der "KI" von schiffeversenken
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:
platzieren ende
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; meine variablen
Delphi-Quellcode:
noch den brocken meiner KI, auch wenns nicht gut ersichtilich ist
//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;
Delphi-Quellcode:
[edit=mkinzler]Delphi-Tags ergänzt Mfg, mkinzler[/edit]
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 |
Re: Bitte um Hilfe bei der "KI" von schiffeversenk
Hallo erstmal,
Gib mal in der Suche Schiffe versenken ein und ich denke das könnte Dir helfen. z.B. hier ![]() MFG Jens |
Re: Bitte um Hilfe bei der "KI" von schiffeversenk
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. |
Re: Bitte um Hilfe bei der "KI" von schiffeversenk
Liste der Anhänge anzeigen (Anzahl: 1)
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) |
Re: Bitte um Hilfe bei der "KI" von schiffeversenk
Liste der Anhänge anzeigen (Anzahl: 1)
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 |
Re: Bitte um Hilfe bei der "KI" von schiffeversenk
Zitat:
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. |
Re: Bitte um Hilfe bei der "KI" von schiffeversenk
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 |
Re: Bitte um Hilfe bei der "KI" von schiffeversenk
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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