====== System Praktikum ====== ===== Coding style ===== * ca. 80 Zeichen Breite (use common sense) * Einrücken von Scopes mit //Tab// (also zwischen ''{'' und ''}'') * Einrücken zur Formatierung mit //Space// (also nach Umbruch bei zu langer Zeile oder Tabellen Format) * ''{'' in selber Zeile * ''}'' in eigener Zeile * [[http://en.wikipedia.org/wiki/Doxygen|Doxygen]] [[http://www.stack.nl/~dimitri/doxygen/docblocks.html|Kommentare]] * Befehle mit "@" einleiten * Mehrzeilig ("_" => " "): \\ ''/%%**%%'' \\ ''_* Foo bar'' \\ ''_*/'' * Einzeilig vor definition: ''%%///%% @...'' * Einzeilig hinter definition: ''%%///<%% @...'' * [[http://max-klinger.org/sysprak/todo.html|To do Listen]] werden automatisch erstellt mit \\ ''%%///%% @todo Has to be implemented'' * [[http://max-klinger.org/sysprak/bug.html|Bug Listen]] werden automatisch erstellt mit \\ ''%%///%% @bug This does not work'' * ''@param i Number of unicorns'' * ''@return A random numer (42)'' * [[http://www.stack.nl/~dimitri/doxygen/commands.html|Weitere befehle]] * Zeilenabstände .... mal schauen * [[http://en.wikipedia.org/wiki/CamelCase|camelCaseNames]] * Konstanten/Enums ALLCAPS * Kein Leerzeichen vor runden Klammern (''if(..'' bzw. ''int foo(..'') * Kommentare in broken englisch Sonstiges * Debugging am besten mit vg oder make debug * Ein free für jedes malloc! wir bauen keinen Firefox Ein paar Namen * Pieces (Spielfiguren): //men// / //king// * Spielfeld/Spieler: //black// / //white// ==== Checking ==== for f in *.h ; do head -n2 $f | tail -n1 | grep -v '_H '; done head -n2 `pwd`/src/*.h | sed 's/ <==/:1/' | sed 's/==> //' while sleep 2 ; do clear ; find `pwd`/src \( -name '*.c' -o -name '*.h' \) -print0 | xargs -0 grep -n -R -P '/\*[^*]*\*/' ; done while sleep 2 ; do clear ; find `pwd`/src \( -name '*.c' -o -name '*.h' \) -print0 | xargs -0 grep -n -P '\S{' | head -n30 ; done tail -n1 `pwd`/src/*{c,h} | sed 's/ <==/:1/' | sed 's/==> //' grepf -nR 'else' `pwd`/src | grep -v 'else if' | grep -v 'else {' ===== AI ===== Checkers ist "gelöst" (es ist einem Spieler möglich mit einem perfekten Spiel nicht zu verlieren) Der bekannterste/beste Algo ist [[http://webdocs.cs.ualberta.ca/~chinook/|Chinook]]. Er wurde auch verwendet um zu beweisen das checkers gelöst ist. Ein Spiel kann wie folgt gespielt werden * **Anfangsspiel**: [[http://web.archive.org/web/20081007064044/http://home.clara.net/davey/basicche.html|Bekante Strategien]] * **Mittelspiel**: Alpha-Betta-Suche mit bewertungsalgo der "zwei duzend" gewichtete heuristiken vermischt (Das wäre das interesante, aber darüber gibt es "keine" Infos) * **Endspiel**: Chinooks [[http://webdocs.cs.ualberta.ca/~chinook/databases/|Endspieldatenbank]]: Kann man runterladen, ist aber einige Gig groß. ==== Mögliche Bewertungskriterien ==== * Beweglichkeit: Der gegner soll möglichst wenig zugmöglichkeiten haben, man selbst möglich viel Weitere Bewertungen in DEM Buch auf pdf-Seite 71. ==== Alternative ==== Das "[[http://chinook.cs.ualberta.ca/users/chinook/index.html|Beweis Java-Applet]]" sendet simple TCP anfragen mit dem Board zustand in ASCII an deren Server und als Ergebniss bekommt man alle möglichen nächesten Züge und der Info ob man damit verlieren/gewinne kann. .... Das wäre eine perfekte AI und man würde den umgang mit sockets lerne (was wohl auch etwas Ziel des Praks ist xD) ==== Literatur ==== * http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.39.742&rep=rep1&type=pdf * [[http://www.sciencemag.org/content/317/5844/1518.abstract|Checkers Is Solved]] - Science Magazine (Kostenlose anmeldung) ===== Spielregeln ===== Die des Server * Es gibt keinen schlag zwang * Nach einem schlag darf der Spieler mit einem beliebigen Stein nochmal ziehen (egal ob schlag oder nicht) * men/king darf zu jeder Zeit nur diagonal ziehen * men/king darf zu jeder Zeit nur auf freie Felder ziehen * king darf zu jeder Zeit n Felder weit ziehen (auch über eigene/lehre felder) * men/king darf zum schlagen rückwärts ziehen * men darf zum schlagen nur direkten Nachbar schlangen und muss danach landen Andere * Lange Liste von kurzen [[http://en.wikipedia.org/wiki/Draughts#National_and_regional_standard_rules|Spielregeln je Land]] * Kurze Liste von langen [[http://en.wikipedia.org/wiki/Checkers_(disambiguation)#Board_games|populären Spielregeln]] ^ Was ^^^ men ^ king ^ | Schlagen | Weite || 2 | n | | ::: | Richtung || Vorwärts/Rückwärts | Vorwärts/Rückwärts | | ::: | Über | Fremde | Ja | Ja | | ::: | ::: | Eigene | Nein | Ja | | ::: | ::: | Leere | Nein | Ja | | Nicht Schlagen | Weite || 1 | n | | ::: | Richtung || Vorwärts | Vorwärts/Rückwärts | | ::: | Über | Fremde | - | - | | ::: | ::: | Eigene | Nein | Ja | | ::: | ::: | Leere | Nein | Ja | ===== Dreckige Tricks ===== Viele Dinge kann man tun, um es dem Gegner schwer zu machen, sortiert etwa nach Dreckigkeit. - Rechne schonmal, während der Gegner noch seinen Zug berechnet. - Verwende vorberechnete Spiel-Teilbäume (Berechnung/Speicherung auf CIP Rechner verteilt) - Antworte mit falschen Zügen wenn man Zeit braucht zum rechnen (geht vermutlich nicht) - Trenne die Verbindung und verbinde dich erst wieder wenn du eine Antwort hast - Antworte möglichst schnell damit der Gegner keine Zeit hat für Trick #1 - Lagere die Berechnung auf CIP Rechner aus. - Spawne wahnsinnig viele Prozesse auf dem selben Rechner um dem Gegner die Kapazität zu klauen - ''kill -9'' der Gegner auf der Maschiene - Remote C&C für die Tricks bzw. logger des Speils, der Umgebung ===== Bitmap/Tabellen mapping ===== Nach: http://www.3dkingdoms.com/checkers/bitboards.htm ==== Graphisch ==== | ^11| ^05| ^31| ^25^ ^10| ^04| ^30| ^24| | | ^03| ^29| ^23| ^17^ ^02| ^28| ^22| ^16| | | ^27| ^21| ^15| ^09^ ^26| ^20| ^14| ^08| | | ^19| ^13| ^07| ^01^ ^18| ^12| ^06| ^00| | ==== Tabelle -> Bitmap ==== k(x, y) = (18 + y*4 - x*3) % 32 ==== Bitmap -> Tabelle ==== x(k) = (6+k) % 8 y(k) = (k+2*((k+6) / 8)) % 8 ==== Bewegung ==== ^ Spieler ^ Bewegung \\ (Spieler Sicht) ^ Left shift ^ Right shift ^ | A (unten) | RT | 1 | 31 | | ::: | LT | 7 | 25 | | ::: | RB | 25 | 7 | | ::: | LB | 31 | 1 | | B (unten) | RT | 31 | 1 | | ::: | LT | 25 | 7 | | ::: | RB | 7 | 25 | | ::: | LB | 1 | 31 | ===== Protokol ===== ==== Int ==== ^ Src ^ Msg ^ Kommentar ^ | S | ''+ MNM Gameserver v1.0 accepting connections'' | Versionsnummer vermutlich auch Felxibel \\ (Kompatibel wenn Major = 1) | | C | ''VERSION 1.0'' | Versionsnummer Flexibel (Kompatibel wenn Major = 1) | | S | ''+ Client version accepted'' | | | C | ''ID ''//Game-ID// | 13-stellig, keine lehrzeichen | | S | ''+ PLAYING ''//Gamekind-Name// | Gamekind = ''Dame'' ... Ist das immer so??? | | S | ''+ ''//Game-Name// | Festlegbar im Webinterface | | C | ''PLAYER ''//Spielernummer(opt)// | Ist was? | | S | ''+ YOU ''//Spielernummer//'' ''//Farbname// | int, Farbname | | S | ''+ TOTAL ''//Anzahl// | = 2 | ==== Neue Spieler ==== ^ Src ^ Msg ^ Kommentar ^ | S | ''+ ''//Spielernummer//'' ''//Farbname// | int, Farbname | | S | ''+ ENDPLAYERS'' | | S: + STATUS Player 1 has some technical issues as it tried a wrong move - might take some time :-) S: + STATUS Schwarz hat eine Dame gewonnen S: + STATUS Schwarz hat einen Spielstein verloren - Koordinaten teilweise ausserhalb des Spielfelds - Zielfeld ist mit Stein belegt! - Mit normalem Spielstein darf nicht rueckwaerts gezogen werden - Wollte mit normalem Spielstein mehr als einen Sprung machen S: + WAIT Weiss hat einen Spielstein verloren Schwarz hat eine Dame gewonnen S: + WAIT Weiss hat einen Spielstein verloren S: + WAIT Weiss hat eine Dame gewonnen ===== Aufgaben ===== ^ Wer ^ Was ^ | Skruppy | State machine | | Skruppy | Connector main loop | | Skruppy | Geforke | | Max | Config | | Max | Logger | | Julia | Argumente | | Julia | Shared Mem | | Julia | Pipes | | Max | Signale | ===== Web interface ===== Sende per POST an ''/newgame.php'' * gameName = wgdfg * player1 = 0 * player2 = 0 * maxMsPerMove = 3000 * minMsPerMove = 3000 POST /newgame.php HTTP/1.1 User-Agent: Opera/9.80 (X11; Linux i686) Presto/2.12.388 Version/12.11 Host: sysprak.priv.lab.nm.ifi.lmu.de Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 Accept-Language: en-US,en;q=0.9 Accept-Encoding: gzip, deflate Connection: Keep-Alive Content-Length: 70 Content-Type: application/x-www-form-urlencoded gameName=wgdfg&player1=0&player2=0&maxMsPerMove=3000&minMsPerMove=3000 Antwort: Weiterleitung nach ''joingame.php?new=1&gameid=50b7e0d94f012'' (hier kann aufgehört werden und aus der weiterleitungs URL die Spiele ID gezogen werden.) HTTP/1.1 302 Found Date: Thu, 29 Nov 2012 22:25:29 GMT Server: Apache/2.2.22 (Debian) X-Powered-By: PHP/5.4.4-9 Cache-Control: no-cache, must-revalidate Expires: Sat, 26 Jul 1997 05:00:00 GMT Location: joingame.php?new=1&gameid=50b7e0d94f012 Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 20 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html Sende per GET an /joingame.php * new = 1 * gameid = 50b7e0d94f012 GET /joingame.php?new=1&gameid=50b7e0d94f012 HTTP/1.1 User-Agent: Opera/9.80 (X11; Linux i686) Presto/2.12.388 Version/12.11 Host: sysprak.priv.lab.nm.ifi.lmu.de Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 Accept-Language: en-US,en;q=0.9 Accept-Encoding: gzip, deflate Connection: Keep-Alive Antwort: Weiterleitung an ''watchgame.php?gameid=50b7e0d94f012&play=0'' HTTP/1.1 302 Found Date: Thu, 29 Nov 2012 22:25:29 GMT Server: Apache/2.2.22 (Debian) X-Powered-By: PHP/5.4.4-9 Cache-Control: no-cache, must-revalidate Expires: Sat, 26 Jul 1997 05:00:00 GMT Location: watchgame.php?gameid=50b7e0d94f012&play=0 Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 20 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html Sende per GET an /watchgame.php * gameid = 50b7e0d94f012 * play = 0 GET /watchgame.php?gameid=50b7e0d94f012&play=0 HTTP/1.1 User-Agent: Opera/9.80 (X11; Linux i686) Presto/2.12.388 Version/12.11 Host: sysprak.priv.lab.nm.ifi.lmu.de Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 Accept-Language: en-US,en;q=0.9 Accept-Encoding: gzip, deflate Connection: Keep-Alive Antwort: Die HTML Seite HTTP/1.1 200 OK Date: Thu, 29 Nov 2012 22:25:29 GMT Server: Apache/2.2.22 (Debian) X-Powered-By: PHP/5.4.4-9 Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 610 Keep-Alive: timeout=5, max=99 Connection: Keep-Alive Content-Type: text/html HTML FOO ===== Lernen ===== * **Signals** * http://www.alexonlinux.com/signal-handling-in-linux * **Meomory** * http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory ===== GIT ===== [[/misc/git|Wirre Sammlung an Infos über GIT]]