AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"ki" für 4-gewinnt

Ein Thema von Mr. Pink · begonnen am 5. Mär 2006 · letzter Beitrag vom 6. Mär 2006
Antwort Antwort
Mr. Pink

Registriert seit: 29. Jan 2006
72 Beiträge
 
#1

"ki" für 4-gewinnt

  Alt 5. Mär 2006, 19:02
Hallo,

ich arbeite schon länger an einem 4-gewinnt, das man auch gegen den pc spielen kann.
die grundstruktur des spiels ist mir glaub ich auch ganz gut gelungen, jedenfalls kann man es mittlerweile buglos mensch vs. mensch spielen
bei der ki hab ich schon etwas mehr probleme, da ich in dieser richtung noch nie etwas gemacht habe:
der pc erkennt bis jetzt wenn ich 3 übereinander habe und blockt das ggf., 2 nebeneinander habe und die möglichkeit für eine zwickmühle gegeben ist, dann blockt er siese, und er merkt wenn er selber 3 übereinander hat und vervollständigt diese 4er wenn der spieler sie nicht geblockt hat.
Jetzt möchte ich gerne das so haben, dass er auch erkenn wenn der spieler und er selber die möglichkeit für 4 in einer waagerechten reihe haben.
bei diesem gebilde ist das ja kein problem: _xxx oder xxx_
aber wie mache ichdas bei sio einer konstellation: x_xx
ohne dass ich alle möglichkeiten mit if-struckturen überprüfe???
ich speichere jeweils den letzte zug des spielers und den des pcs, sie dann an die procedure übergeben werden.

wäre super, wenn mir jemand eine einfache lösung des problems sagen könnte.
btw, ich programmiere noch nicht lange und kenne deshalb noch nicht alle möglichkeiten, bezeichnungen, etc. deshalb wäre ich für einfach formilierte antworten dankbar
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#2

Re: "ki" für 4-gewinnt

  Alt 5. Mär 2006, 19:21
ich hab mal eine reine Probier-KI geschrieben, eine rekursive Funktion (für Reversi). sie geht jede Möglichkeit durch, wobei siei beliebig weit vorrausdenken kann:
Delphi-Quellcode:
function ki(spielfeld:tspielfeld;spieler:tinhalt;count:integer):tpoint;
var
  list:tpointarray;
  listpunkte:array of integer;
  i,j,bigestindex:integer;
  virt:tspielfeld;
begin
  setlength(list,0);
  for i:=0 to length(spielfeld)-1 do
    for j:=0 to length(spielfeld[i])-1 do begin
      copyspielfelddata(spielfeld,virt);
      if vollstreckezug(virt,spieler,point(i,j)) then begin
        setlength(list,length(list)+1);
        list[length(list)-1]:=point(i,j);
      end;
    end;
  setlength(listpunkte,length(list));
  for i:=0 to length(list)-1 do begin
    copyspielfelddata(spielfeld,virt);
    vollstreckezug(virt,spieler,list[i]);
    for j:=count-1 downto 0 do begin
      vollstreckezug(virt,gegner(spieler),ki(virt,gegner(spieler),j));
      vollstreckezug(virt,spieler,ki(virt,spieler,j));
    end;
    listpunkte[i]:=spieleritemscount(spieler,virt)-spieleritemscount(gegner(spieler),virt);
    setlength(virt,0);
  end;
  groesstes(listpunkte,bigestindex);
  try
    result:=list[bigestindex]
  except
    result:=point(0,0);
  end;
end;
mal als Pseudocode ohne Bezug auf Reversi:

Code:
function ki(spielfeld auf dem die ki arbeiten soll,spieler für den sie das ergebniss bestimmen soll,anzahl wiederholungen) gibt die reihe an, in die der Stein geworfen wird

var
  virtuelles spielfeld auf dem simuliert wird
  liste aller zugmöglichkeiten
  liste der Bewertung aller zugmöglichkeiten
begin
  alle möglichen zugmöglichkeiten in liste speichern;
  für jedes Listenelement wiederholen:
  begin
    für anzahl der wiederholungen (in funktionsparametern) wiederholen:
    begin
      berechnen was der gegner jetzt (aller wahrscheinlichkeit nach) tun wird, und zwar mit der ki-funktion (-> rekursiv) ABER mit einer wiederholung weniger im parameter, da sonst Endlosschleife
      berechnen was der computer jetzt tun wird, auch mit einer wiederholung weniger als parameter
    end;
    punkte für die liste gemäß dem Endstatus des virtuellen spielfelds vergeben (gewonnen, verloren, 3 nebeneinander etc.)
  end;
  listenelement mit der besten Bewertung als result zurückgeben
end;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Mr. Pink

Registriert seit: 29. Jan 2006
72 Beiträge
 
#3

Re: "ki" für 4-gewinnt

  Alt 5. Mär 2006, 19:36
danke erstmal, für die ausführliche beschreibung!

allerdings wollte ich eigentlich nur wissen, wie ich die abfrage waagerechter 4er-reihen am kürzesten/einfachsten aufbaue.
von der ki methode durch rekursives backtracking habe ich auch schon gehört, allerdings bin ich noch nicht so weit, da ich erstmal die einfachsten abfragen haben muss, bevor der computer die spielzüge bewerten kann.

aber dein posting wird mir sicher in einem späteren stadium weiterhelfen..

wahrscheinlich ist das problem, über das ich grübel gar kein großes, aber irgendwie komm ich immer nur auf if-abfragen, von denen ich dann sehr viele habe, wenn ich alle möglichkeiten miteinbeziehen will..
  Mit Zitat antworten Zitat
Sascha_OW

Registriert seit: 4. Aug 2005
Ort: Owschlag
129 Beiträge
 
Delphi 2005 Professional
 
#4

Re: "ki" für 4-gewinnt

  Alt 6. Mär 2006, 10:17
also mal vom programmieren weg. Ich würde es aufjedenfall so einbauen, das es sich jede Bewegung der Users merkt und wenn er Verliert, das nächstes mal zu baut.
Dann sollte er gucken ob es eine Chance hat in den nächsten 2 Zügen zu gewinnen.

Dann würde ich noch ein paar Spielzüge festeinabauen, die er aber selbst anpassen kann.
Sascha Schwarz
Kostenlose SMS unter:
http://www.smsjunky.de
  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 07:35 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