AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wie entwickle ich einen performanten Othello Zuggenerator?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie entwickle ich einen performanten Othello Zuggenerator?

Ein Thema von beule · begonnen am 1. Sep 2008 · letzter Beitrag vom 9. Sep 2008
 
beule

Registriert seit: 28. Mai 2006
Ort: Hamburg
10 Beiträge
 
Delphi 2005 Personal
 
#1

Wie entwickle ich einen performanten Othello Zuggenerator?

  Alt 1. Sep 2008, 19:11
Hallo Foren-Mitglieder,

nach längerer Delphi Abstinenz wollte ich endlich mal ein kleines (großes?) Projekt in Angriff nehmen.
Ich entwickle gerade ein Othello-Programm und habe mich an dem Zuggenerator festgebissen.

Das Brett präsentiere ich intern durch 2 Cardinals (A1 bis H4 und A5 bis H8 ) mal 2 für (Schwarz und Weiss) ..Stichwort: bitboards.
UInt64 soll ja buggy sein?!

Jetzt kommt ein wenig Pseudo-Code. Ich vernachlässige hier mal die oberen Cardinals!

Delphi-Quellcode:
Const A1 = 1;
      B1 = A1 * 2;
      C1 = B1 * 2;
      {usw.}
      A5 = 1;
      B5 = A5 * 2;
      {usw.} 
      Empty = 0;
Var
      wbBoard, {schwarze + weisse Steine}
      wBoard, {weisse Steine}
      bBoard {schwarze Steine}: Cardinal;

wbBoard = wBoard or bBoard;
if (wbBoard and A1) = Empty then
  if (bBoard and B1) = B1 then
    if (bBoard and C1) = C1 then
      {usw.}
    else
      if (wBoard and C1) = C1 then
        {GEFUNDEN A1 leer, B1 schwarzer Stein, C1 weisser Stein}
      else
        {kein Match}
Also es gibt keine Schleife, hier wird jedes Bit umgedreht.

Jetzt meine Fragen:
1) Geht das hier evtl. eleganter und schneller? Besserer Algorithmus? (BESTIMMT )
2) Meine Assembler (68000-er) Kenntnisse sind schon veraltet. Gibt es
bestimmte Befehle die mein Vorhaben hier beschleunigen können? Also
Assembler in Delphi einbinden (..hier gibt es ja auch ein tolles Tutorial)

Dieser Code hier soll weniger als 200 Taktzyklen brauchen Othello Zuggenerator
..behauptet wird das hier: radagast siehe: Bitboard trickery
Dort steht übrigens auch:
The main trick used by the code is to find all moves that flip discs in a certain direction, e.g. up, in parallel. This can be done in several different ways, this code uses a variation first suggested by Richard Delorme which I have improved somewhat. There are 8 possible flip directions, 6 of these are managed by the MMX ALUs and the remaining 2 by the integer ALUs.

Leider weiss ich nicht ob ein z.B. ein And mit einem Vergleich ein oder 2 Taktzyklen sind, z.B. (bBoard and B1) = B1

Wenn ich nur das Feld A1 untersuche (Wagerecht, Senkrecht, Diagonale) sind das im schlimmsten Fall ca. 22 Vergleiche (jede Richtung 7 und das Ausgangsfeld) und 60 Felder habe ich zu vergleichen (64 - 4 gesetzte Steine).

Ich muss hier mehr parallel machen, aber wie

Ciao beule
  Mit Zitat antworten Zitat
 


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 01:02 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