AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TicTacToe mit mittlerer KI und für 1vs1
Thema durchsuchen
Ansicht
Themen-Optionen

TicTacToe mit mittlerer KI und für 1vs1

Ein Thema von ferby · begonnen am 15. Okt 2005 · letzter Beitrag vom 11. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2      
ferby
Registriert seit: 15. Aug 2004
Hallo,

hab TicTacToe nachprogrammiert mit einer mittleren KI,
es ist auch mölich Mensch gegen Mensch zu spielen,

könnt ihr es mal testen und mir schreiben falls Fehler kommen???

danke!
Angehängte Dateien
Dateityp: exe tictactoe_196.exe (166,0 KB, 119x aufgerufen)
Dateityp: exe tictactoe_180.exe (166,0 KB, 63x aufgerufen)
 
Benutzerbild von devnull
devnull

 
Delphi 7 Personal
 
#2
  Alt 15. Okt 2005, 22:48
Sieht ganz gut aus
Allerdings setzt die KI noch auf ein Feld, nachdem Spieler 1 gewonnen hat

mfg
devnull
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo
 
#3
  Alt 15. Okt 2005, 22:59
Die KI würd mich mal interessieren... scheint wohl nicht sehr intelligent zu sein.

Code:
Erster Zug:
[ ][ ][X]
[ ][O][ ]
[ ][ ][ ]
Zweiter Zug:
[ ][ ][X]
[ ][O][X]
[ ][ ][O]
Dritter Zug:
[X][ ][X]
[ ][O][X]
[O][ ][O]
Man sieht also, beim Dritten Zug hat die KI mich (absichtlich?) gewinnen lassen. Sie hat weder selber versucht, 3 in einer Reihe zu bekommen, noch, mich am Gewinnen zu hindern
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

 
Delphi 2005 Personal
 
#4
  Alt 15. Okt 2005, 23:15
Auch eine sichere Gewinnstrategie:

Mitte, oben mitte, unten links, oben rechts.

Benutzt du in deinem Code die random-Funktion?

Wenn ich (oben mitte, links mitte, rechts unten) spiele, gibt es keine feste Regel dafür, wo der Computer als nächstes setzen wird. Ich habe es ein paar Mal durchgespielt und jedes noch freie Feld wird irgend wann mal vom Computer besetzt.

Zeigst du mal den Code?
  Mit Zitat antworten Zitat
Benutzerbild von whiteshark
whiteshark

 
Delphi 2005 Personal
 
#5
  Alt 15. Okt 2005, 23:53
Schönes Spiel.
Schade, dass die KI nicht gerade schlau ist. Aber das Spiel macht auch zu zweit Spaß.
  Mit Zitat antworten Zitat
Tubos

 
Delphi 7 Personal
 
#6
  Alt 16. Okt 2005, 00:00
Zitat:
Schade, dass die KI nicht gerade schlau ist.
Das Spiel hat keine KI.
Wenn ich mich dem Computer nie in den Weg stelle, setzt er trotzdem keine drei Steine in Reihe. Wie gibts das?

Vom Design her ist es sehr minimalistisch, aber genauso soll TicTacToe auch sein. Gut gemacht!
Ein etwas anspruchsvollerer Computergegner wär noch ganz nett
Lukas
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

 
Delphi XE Architect
 
#7
  Alt 16. Okt 2005, 01:08
Ich glaube die KI hat keinen Killerinstinkt

Mal scherz bei seite:
Noch ne Strategie
Mitte
Mitte rechts
Links unten
Rechts oben


Was daran Wizig ist ist ja des die KI manchmal variiert auch wenn der Weg gleich ist also ist die Idee von der Random funktion doch nicht so abwägig

PS: @ferby: Wie wärs mit dem source von der KI würd mich brennent interessieren
Alex
  Mit Zitat antworten Zitat
ferby

 
Delphi 2010 Enterprise
 
#8
  Alt 16. Okt 2005, 08:10
Hallo,

Die KI funktioniert so:

die ersten zwei Züge sind fix und alle weiteren werden per random ermittlet, der Quellcode hat sicher noch viele Fehler und wird zur Zeit von mir überarbeitet. Ich möchte auch mehrer KI-Levels machen, also die KI die jetzt ist (normal) und noch eine bessere (schwer).

Hier der Quellcode:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ImgList, Menus, Ferby;

type
  TForm1 = class(TForm)
    feld: TImage;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image8: TImage;
    Image9: TImage;
    Image5: TImage;
    Image7: TImage;
    Image6: TImage;
    ImageList: TImageList;
    menue: TMainMenu;
    NeuesSpiel: TMenuItem;
    Einstellung1: TMenuItem;
    Hilfe: TMenuItem;
    Info: TMenuItem;
    aus: TMenuItem;
    an: TMenuItem;
    procedure AufFeldClick(Sender: TObject);
    procedure check;
    procedure NeuesSpielClick(Sender: TObject);
    procedure KIClick(Sender: TObject);
    procedure HilfeClick(Sender: TObject);
    procedure InfoClick(Sender: TObject);
    procedure KI_Zug;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  feldwert:array [1..9] of byte;
  spieler:boolean;
  KI_var:boolean=true;
  zug:byte;
  BM:TBitmap;
  wahl: byte;

implementation

{$R *.dfm}

procedure KI_S(feld, w: byte);
begin
  if feldwert[feld]=1 then wahl:=w;
end;


procedure TForm1.KI_Zug;
var
unentschieden:boolean;
i:byte;
begin
  bm := TBitmap.create;
  inc(zug);

  wahl:=0;

  // ZUG 1
  if zug=1 then
  begin
    if feldwert[5]=1 then wahl:=1 else wahl:=5;
  end;

    // ZUG 2
  if zug=2 then
  begin
    if feldwert[1]=1 then
    begin
      KI_S(2,3);
      KI_S(3,2);
      KI_S(4,7);
      KI_S(6,2);
      KI_S(7,4);
      KI_S(8,4);
      KI_S(9,2);
    end;

    if feldwert[2]=1 then
    begin
      KI_S(3,1);
      KI_S(4,1);
      KI_S(6,3);
      KI_S(7,4);
      KI_S(8,4);
      KI_S(9,6);
    end;

    if feldwert[3]=1 then
    begin
      KI_S(4,2);
      KI_S(6,9);
      KI_S(7,2);
      KI_S(8,6);
      KI_S(9,6);
    end;

    if feldwert[4]=1 then
    begin
      KI_S(6,2);
      KI_S(7,1);
      KI_S(8,7);
      KI_S(9,8);
    end;
                                                     
    if feldwert[5]=1 then
    begin
      KI_S(2,8);
      KI_S(3,7);
      KI_S(4,6);
      KI_S(6,4);
      KI_S(7,3);
      KI_S(8,2);
      KI_S(9,3);
    end;

    if feldwert[6]=1 then
    begin
      KI_S(7,8);
      KI_S(8,9);
      KI_S(9,3);
    end;

    if feldwert[7]=1 then
    begin
      KI_S(8,9);
      KI_S(9,8);
    end;

    if feldwert[8]=1 then KI_S(9,7);

  end;

  end;

  unentschieden:=true;
  if wahl=0 then
  repeat
    wahl:=random(9)+1;
    for i:=1 to 9 do if feldwert[i]=0 then unentschieden:=false;
    if unentschieden then exit;
  until feldwert[wahl]=0;


  Imagelist.getbitmap(1,Bm);
  feldwert[wahl]:=2;
  TImage(FindComponent('Image' + inttostr(wahl))).Picture.Bitmap := BM;
end;

procedure TForm1.AufFeldClick(Sender: TObject);
var
i,nr:byte;
begin
  bm := TBitmap.create;

  // No KI
  if not ki_var then
  for i:= 1 to 9 do if (Sender = TImage(FindComponent('Image' + inttostr(i)))) then
  if (feldwert[i]=0) then
  begin
    spieler:=not spieler;
    if spieler then nr:=0 else nr:=1;
    Imagelist.getbitmap(nr,Bm);
    feldwert[i]:=nr+1;
    TImage(FindComponent('Image' + inttostr(i))).Picture.Bitmap := BM;
  end
  else
  ShowMessage('Dieses Feld ist berreits besetzt');

  // With KI
  if ki_var then
  for i:= 1 to 9 do if (Sender = TImage(FindComponent('Image' + inttostr(i)))) then
  if (feldwert[i]=0) then
  begin
    Imagelist.getbitmap(0,Bm);
    feldwert[i]:=1;
    TImage(FindComponent('Image' + inttostr(i))).Picture.Bitmap := BM;
    KI_Zug;
  end
  else
  ShowMessage('Dieses Feld ist berreits besetzt');

  check;

end;

//////////////////////////////////////////////////////////////////////////////// CHECK
function check2(wert1,wert2,wert3,art:integer): boolean;
begin
 result:=false;
 if (feldwert[wert1]=art) and (feldwert[wert2]=art) and (feldwert[wert3]=art) then result:=true;
end;

procedure tform1.check;
var
i : byte;
unentschieden:boolean;
begin

  // Abfrage ob ein Spieler gewonnen hat
  for i:=1 to 2 do
  if
  check2(1,2,3,i) or
  check2(4,5,6,i) or
  check2(7,8,9,i) or
  check2(1,4,7,i) or
  check2(2,5,8,i) or
  check2(3,6,9,i) or
  check2(1,5,9,i) or
  check2(3,5,7,i)
  then
  begin
    if (i=2) and (ki_var) then showmessage('Die KI hat gewonnen') else
    showmessage('Spieler '+inttostr(i)+' hat gewonnen');
    NeuesSpielClick(nil)
  end;

  // Unentschieden?
  unentschieden:=true;
  for i:=1 to 9 do if feldwert[i]=0 then unentschieden:=false;
  if unentschieden then
  begin
    showmessage('Das Spiel ist Unentschieden ausgegangen');
    NeuesSpielClick(nil)
  end;

end;

//////////////////////////////////////////////////////////////////////////////// MENÜ
// Neues Spiel
procedure TForm1.NeuesSpielClick(Sender: TObject);
var
i:byte;
begin
  for i:=1 to 9 do
  begin
    feldwert[i]:=0;
    TImage(FindComponent('Image' + inttostr(i))).Picture.Bitmap := nil;
  end;

  spieler:=false;
  zug:=0;
end;

// KI Klick
procedure Tform1.KIClick(Sender: TObject);
begin
  an.checked:=false;
  aus.checked:=false;

  if sender=an then an.checked:=true
  else aus.checked:=true;

  ki_var:=an.checked;
end;

// Hilfe
procedure TForm1.HilfeClick(Sender: TObject);
begin
showmessage('Hilfe:' +#10#10+ '1) Die KI ist ausgeschalten:' +#10+ 'Zwei menschliche Spieler drücken immer abwechselnd auf ein leeres Feld.' +#10+ 'Sobald jemand drei X bzw drei O übereinander, nebeneinander, oder quer hat, hat dieser Spieler gewonnen.' +#10#10+ '2) Die KI ist eingeschalten:' +#10+ 'Jetzt spielt nur ein menschlicher Spieler gegen den Computer' +#10#10+ 'Viel Spaß!');
end;

// Info
procedure TForm1.InfoClick(Sender: TObject);
begin
  copyright('TicTacToe','2.00');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
end;

end.

Das der Quellcode noch nicht perfekt ist weiß ich selbst ,
solltet ihr Rechtschreibfehler finden dann bitte melden!
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

 
Delphi XE Architect
 
#9
  Alt 16. Okt 2005, 11:30
naja hab die funktionen etwas überflogen

Etwas noch was einzubauen wäre
wenn der Computer drannen ist und sieht des er schon zwei steine in einer Reihe hat dann muss er den richtigen stein an die richtige stelle setzen (außer natürlich ist belegt)
Alex
  Mit Zitat antworten Zitat
Nicodius

 
Delphi 2006 Architect
 
#10
  Alt 25. Okt 2005, 10:22
also wir haben das von der schule aus machen müssen


normal wird das so realisiert dass die KI in einem array "nachsehen kann" wies derweil ausschaut

2d array mit 9 feldern (1-3..1-3) und wenn ein x am feld ist heißt es -1 und wenn ein o am feld ist isses im array ein +1 nicht belegte felder sind eine 0


damit haste ma ne korrekte schöne abfrage ob wer gewonnen hat


dann kann die ki mit schleifen durchrechenen wo der beste zug wäre (zuerst gewinnchance abfrage dann defensivabfrage)


usw

wenn du willst kan nich dir mal den code (leider erst im november weil pc in der reperatur is) mitteilen



grüsse

Nico
Nico Müller
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:00 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