====== 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]]