alea iacta est – Teil 3

closeDieser Beitrag gehört zu der Artikelserie alea iacta est
closeDieser Beitrag wurde vor über 3 Monaten veröffentlicht. Die darin beschriebenen Informationen sind mit Vorsicht zu geniessen, da sie bereits veraltet oder nicht mehr gültig sein könnten. Solltest du von Neuerungen oder Verbesserungen wissen, so freue ich mich über einen klärenden Kommentar.

So nun geht es in die dritte Runde!
Mein Bot ist fertig und hat bereits die ersten Testläufe absolviert. Begonnen habe ich auf dem offiziellen Server, doch dummerweise ist dieser mehr als nur langsam. So kann es da problemlos mal vorkommen, dass man 15 Minuten auf ein neues Spiel wartet.
Doch glücklicherweise hat ein findiger Mitstreiter eine in Ruby implementierte Serverkopie geschrieben und veröffentlicht. Damit können problemlos 10 Spiele pro Minute gespielt werden und ist somit für Tests viel besser geeignet.
Erreichbar ist dieser Server unter:

1
telnet littleforumpeople.com 3333

Mein Bot selbst hat sich eine bereits eine nicht allzuschlechte Statistik erarbeitet:

Gewonnen: 2258
Verloren: 1542
Spiele: 3800

Daraus ergibt sich eine Erfolgsquote von ganzen 59.4%, wodurch er problemlos mit den Besten mithalten kann :)

Der Bot selbst ist relativ einfach aufgebaut:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/bin/bash
#------------------------------------------------------------------------------
# Author:	Patrick Schmid
# Web:		http://blog.encodingit.ch
# Version:	1.1
# Changes:	- Grundversion (13.8.10)
#		- Script umgestellt auf NC-Version (16.8.10)
#------------------------------------------------------------------------------
 
# Umgebung festlegen
name="encodingit" # mein Name
active=0 # Nicht mein Zug
zaehler=0
 
function play { # Spielfunktion
 
	# Dies müsst ihr selbst machen ;)
 
}
 
while read command a1 a2 a3
do
	case $command in
		HELO)
			echo "AUTH $name Ich bin bereit!"
			;;
		TURN)
			play $a1 $a2
			;;
		THRW)
			if [ "$active" = "1" ] 
			then
				if [ "$a1" = "6" ]
				then
					active=0
				fi
			else
				if [ "$a1" = "6" ]
				then
					active=1
				fi
			fi
			;;
		WIN|DEF)
			echo "$command" >> log
			exit 0
			;;
		*)
			echo "AUTH $name Ich bin bereit!"
			;;
	esac
done

Ich denke ihr werdet verstehen, dass ich die Play-Funktion erst nach dem Abgabetermin veröffentliche.
Gestartet wird das Script via netcat oder ncat:

1
sudo ncat -v -e ./wettbewerb.sh littleforumpeople.com 3333

Ich wünsche euch viel Spass beim würfeln. :)

close
Immer informiert sein dank meines RSS Feeds.Oder folge mir via Twitter!

30 Gedanken zu „alea iacta est – Teil 3

  1. Benni

    Junge, danke dir! Du hast meine Neugierde geweckt, ich werde auch mitmachen :D

    Ich werde wahrscheinlich keine Chance haben mal gut abzuschneiden, aber man lernt bei so einem Projekt sehr, sehr viel!

    Danke, danke :)

    Benni

    Antworten
  2. dharry

    Warum startest du dein Skript mit sudo? Gab es bei dir auf dem öffentlichen Server auch öfters das Problem, das gar kein Spiel zu Stande kam und mit einer zusätzlich gestarteten Botinstanz sofort ein Spiel zustande kam?

    Grüße

    Harry

    Antworten
    1. Patrick Artikelautor

      Wahrscheinlich aus Gewohnheit: Socket = root. Kannst du aber machen, wie du magst :)
      Zu den Verbindungsproblemen, ich konnte immer ein, zwei Spiele machen auf dem offiziellen Server, dann gabs ein Timeout und beim nächsten Mal wurde verbunden, aber es passierte nichts.
      Dann musste ich die Verbindung manuell trennen und nochmals aufbauen, dann ging alles wieder von vorne los.
      Das ist auch der Grund, warum ich schlussendlich auf littleforumpeople.com gewechselt habe.

      Antworten
  3. Skaldrom Y. Sarg

    Der offizielle Server zickt wirklich rum. Ein Grossteil meines Programmcodes beschäftigt sich mit Timeouts und Verbindungsproblemen.

    Leider scheint littlepeople im Moment auch offline zu sein :(.

    Um gewisse Dinge zu testen oder Parameter anzupassen, hat sich ein lokaler Simulator sehr bewährt: Ein kleines Proggie, ohne TCP, ohne Gegner, das nur bis 50 Spielt (also quasi nur die play-Routine aufruft). Das ermöglicht Millionen von Spiele pro Minute und schrittweises Verbessern….

    Antworten
    1. Benni

      Mich würde dein Programm interessieren. Da littlepeople offline ist und der offizielle Server unspielbar, übe ich gerade auf 67.222.30.123:3333, allerdings dauert das auch ziemlich lange und ich komme auf höchsten 2 Spiele pro Minute.

      Antworten
    2. Patrick Artikelautor

      Hmm, auf Port 80 bekomme ich auf jeden eine Antwort von littleforumpeople.com… Leider kann ich den Spielserver auf Port 3333 nicht testen – Firewall sei dank :(

      Das Problem aber wenn du alleine spielst sind Interaktionen mit dem Gegner vernachlässigt, so zum Beispiel wie reagierst du, wenn du weit vorne bist? Oder weit zurück? Oder dein Gegner sehr risikofreudig ist? Oder immer speichert?
      Solche Parameter gehen in deiner Bilanz vergessen….

      Antworten
    3. Skaldrom Y. Sarg

      Der Simulator ist in PHP geschrieben, und man wurstelt seinen Player (der halt auch in PHP geschrieben werden muss) einfach in eine Methode. Würde Dir das was helfen? Wenn ja, wie kann ich das Dir zukommen lassen?

      Grundsätzlich misst es die Anzahl Transaktionen, die ein Spieler braucht um auf 50 zu kommen. Eine Transaktion geht von einem Wurf bis zur 6 oder zum Save. Je weniger Transaktionen, desto weniger kann der Gegner punkten.

      Antworten
      1. Patrick Artikelautor

        Du kannst ihn ja hier anhängen: http://paste-it.net/

        Was mir bei einem lokalen Spiel aber fehlt, wenn du z.B. mehrmals nacheinander nur 6en Würfelst, so musst du das Speicher-Verhalten deines Botes doch auch anpassen. Also wenn du siehst, du bist 30 Punkte im Rückstand, so muss der Bot auch reagieren.
        So wende ich lieber etwas mehr Zeit zum Auswerten auf, habe dafür aber eine sehr realistische Aufstellung. Aber das grenzt ja schon fast an eine Glaubensfrage ;)

        Antworten
        1. Skaldrom Y. Sarg

          Ja, der Aspekt des Gegners kann man natürlich mit der Simulation nicht berücksichtigen. Ich denke aber sowieso, das ist der kleinere Teil :)…

          Der Simulator habe ich gepastet. Er ist nicht soooo komplex und einfach in andere Sprachen umzuschreiben: http://paste-it.net/public/l149ca5/

          Er ist halt nicht wirklich benutzerfreundlich, aber die Spielerklasse muss “Player” heissen und am richtigen Ort included werden…

          Für Fragen stehe ich gerne zur Verfügung ;)…. Viel Glück und nicedice!!!

      2. Benni

        Wenn er in PHP geschrieben ist, nützt er mir nicht viel, da ich meinen Bot in Bash ausbilde. Dann muss ich weiter einen guten Server suchen, solange littlepeople down ist…

        Aber danke :)

        Antworten
        1. Patrick Artikelautor

          Da fällt mir gerade ein, der Code von littleforumpeople.com wurde irgendwo im Wiki vom Linux Magazin veröffentlicht. Du könntest dir also auch eine lokale Instanz anlegen.

      1. Knorkebrot

        Das heißt du rufst auch einen Raketenwissenschaftler an, wenn dein Wasserhahn leckt? Je nach optionen mit denen die bash gebaut wurde, ist sie gerne zehn mal so groß, du benutzt einen Bruchteil (sh ~130kB, bash voll ~1,5MB). Das heißt du lädst jetzt 1,5MB in den Speicher, obwohl du nur <=130kB benutzt, der Rest versauert. Kostet alles Zeit und RAM, wieso also, wenn man es besser machen kann?

        Aber ich seh gerade… in Debian wird sh als link auf bash gesetzt. Hammer. Ich weiß gar nicht, was ich sagen soll… Panne.
        MßG

        Antworten
        1. Knorkebrot

          Das hat damit ja nichts zu tun, was glaubst du wie ihr von einer richtigen sh profitieren würdet. In den wenigsten scripts unter /etc/init.d/ wird bash benutzt, obwohl sie (über den Link /bin/sh, denn eigentlich will man da keine bash) geladen wird. Ds ist mehr so eine prinzipielle Frage möglichst immer den kleinsten Nenner zu finden. Du gehst hier auch gerade mit einem Flugzeugträger fischen, obwohl ein kleiner Kutter mehr als genügen würde. Man könnte auch sagen “take the one that sucks less”.
          Na wie auch immer, dein System hat ja eh keine sh *g*
          MßG

        2. Skaldrom Y. Sarg

          Knorkebrot: Ich verstehe Dich, manchmal fühle ich dasselbe wenn ich dran denke, wie viele Ressourcen da eigentlich nicht genutzt werden.

          Trotzdem verstehe ich es nicht, was ist der Vorteil, wenn die sh benutzt wird? Geradesogut könne man sagen, dass man für Textdateien keinen grafischen Editor benutzen soll (vi kann das auch), für das Programmieren besser auf der Kommandozeile bleibt und nur die Sprache benutzt, die gerade mal die Features unterstützt die man braucht und wenn man ein Blog lesen möchte, den Lynx benutzen soll. Klar, kann man, aber… Warum?

        3. Knorkebrot

          Du vergleichst hier gerade Eistee mit Schnitzel. Setzen wir das mal gegenüber:

          Die sh ist klein, schnell und fix geladen, weil sie eben kaum Balast mitbringt. Allerdings kann sie nicht viel, nur die Basics.
          Die bash ist groß und träge, kann dafür aber alles, was das Herz begehrt, von assoziativen Arrays bis hin zu Pipenegation.

          Beide haben sie Vorteile, beide Nachteile, aber wenn man die Funktionsvielfalt der bash nicht benutzt bleibt nur noch ein übergroßes langsames Monster. Und mal ehrlich: wenn man ihre Möglichkeiten braucht, dann ist man bei Shellscripten eigentlich auch schon auf dem Holzweg.
          MßG

  4. Benni

    Kurze Frage: Was hat es zu bedeuten, wenn ich bei 67.222.30.123:3333 und littleforumpeople.com:3333 mitspielen kann, bei wettbewerb.linux-magazin.de:3333 aber immer mit einem

    HELO 0.6 Welcome Player 2. GEGNERNAME waits. 
    DENY Du spielst nicht mit!   
    HELO 0.6 Welcome Player 1.   
    DENY Du spielst nicht mit! 

    abgespeist werde? Was geht hier vor??

    Antworten
    1. Patrick Artikelautor

      Möglicherweise hast du einen fehlerhaften Benutzernamen?
      Du müsstest wissen, worin die Unterschiede liegen, wobei dir sicher das Linux Magazin selbst helfen kann…
      Komisch nur, was soll “GEGNERNAME waits” sein?

      Antworten
      1. Benni

        Anstatt GEGNERNAME steht halt immer ein Name eines Bots.
        Ich habe es jetzt auch mal mit

        telnet wettbewerb.linux-magazin.de 3333

        ausprobiert und händisch AUTH benni eingegeben.
        Dabei kam jedes mal der gleiche Fehler. Keine Ahnung woran das liegen könnte (die Authentifizierung kam jedes mal sofort, also ohne mehrere Sekunden Verzögerung).

        Sehr verrückt das ganze. Bei littelforumpeople.com läuft mein Bot aber wunderbar!

        Antworten
    2. onli

      Ich habe hier gerade ein ähnliches Problem. Mein Client funktioniert wunderbar lokal mit dem Rubyserver( danke für seine Erwähnung) und auch mit littleforumpeople. Aber der Wettbewerbsserver verweigert sich. Nicht nur, dass dauernd timeouts kommen, sondern nach meinem AUTH passiert einfach nichts – bis ich ein DENY bekomme, weil ich angeblich nicht reagiert hätte (worauf denn auch, ein TURN kam ja nicht). Hier der Mitschnitt:

      timeout
      timeout
      timeout
      ‘HELO 0.6 Welcome Player 2. aixmeister waits.\n’
      sending: AUTH evolvingDiceClient test
      ‘DENY Du warst nicht schnell genug!\n’

      Hatte jemand das gleiche Problem und am besten eine Lösung? Wäre schade, wegen sowas das nicht einsenden zu können :/

      Antworten
        1. Patrick Artikelautor

          Soweit ich weiss, darf der Benutzername nur in Kleinbuchstaben vorliegen… Ich mag mich auch täuschen, aber mir war so, was in der Richtung gelesen zu haben, denn bei meinem Bot funktioniert alles problemlos. Auch ohne \n…
          Aber wenn es so klappt, auch schön :)

  5. Lysander

    Hi,

    danke für die tollen Artikel. Nur dadurch bin ich darauf aufmerksam geworden und habe mal einen Bot in Python entworfen. Hatte ein wenig zu kämpfen mit dem Kommando-Parsing und der Logik ;-) Nuja, nun läuft er… allerdings muss ich an der Strategie nun feilen – ist ja das eigentliche Herzstück :-)

    Mal sehen, was ich noch so hinbekomme.

    Grüße,
    Lysander

    Antworten
  6. Pingback: Nachtrag zum Programmierwettbewerb bei Linux-Magazin - deesaster.org

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <b> <blockquote cite=""> <cite> <del datetime=""> <em> <i> <pre lang="" line="" escaped=""> <strong>