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
    • Befehle mit „@“ einleiten
    • Mehrzeilig („_“ ⇒ „ “):
      /**
      _* Foo bar
      _*/
    • Einzeilig vor definition: /// @…
    • Einzeilig hinter definition: ///< @…
    • To do Listen werden automatisch erstellt mit
      /// @todo Has to be implemented
    • Bug Listen werden automatisch erstellt mit
      /// @bug This does not work
    • @param i Number of unicorns
    • @return A random numer (42)
  • Zeilenabstände …. mal schauen
  • 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 Chinook. Er wurde auch verwendet um zu beweisen das checkers gelöst ist.

Ein Spiel kann wie folgt gespielt werden

  • Anfangsspiel: 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 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 „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

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

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.

  1. Rechne schonmal, während der Gegner noch seinen Zug berechnet.
  2. Verwende vorberechnete Spiel-Teilbäume (Berechnung/Speicherung auf CIP Rechner verteilt)
  3. Antworte mit falschen Zügen wenn man Zeit braucht zum rechnen (geht vermutlich nicht)
  4. Trenne die Verbindung und verbinde dich erst wieder wenn du eine Antwort hast
  5. Antworte möglichst schnell damit der Gegner keine Zeit hat für Trick #1
  6. Lagere die Berechnung auf CIP Rechner aus.
  7. Spawne wahnsinnig viele Prozesse auf dem selben Rechner um dem Gegner die Kapazität zu klauen
  8. kill -9 der Gegner auf der Maschiene
  9. Remote C&C für die Tricks bzw. logger des Speils, der Umgebung

Bitmap/Tabellen mapping

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

GIT

users/skruppy/ext/uni/3/sysprak.txt · Zuletzt geändert: 2013/01/25 16:16 von 84.56.40.192