© Sebastian Duda, 123RF.com
Programmierwettbewerb
Reiz des Mitmachens
von Nils Magnus
Erschienen im Linux-Magazin
2010/09
Siegen künstliche Intelligenz, kühle Stochastik oder schlichte Kühnheit? Bis Mitte September dürfen Leser selbst programmierte Bots einsenden, die gegeneinander um die Wette würfeln müssen.
Die Aufgabe erscheint simpel: Ein Spieler würfelt wiederholt und addiert seine Augenzahlen. Wirft er eine Sechs, muss er alle Punkte streichen und von vorne beginnen. Gilt es etwa, eine Summe von 50 Punkten zu erreichen, sind im Durchschnitt knapp 122 Würfe nötig, wie etwas Stochastik oder ein empirisches Perl-Skript offenbaren (Listing 1).
01 #!/usr/bin/perl
02 # simuliert einen einzelnen Würfelspieler
03 srand(time ^ $$);
04
05 foreach $i (1 .. 1000) { # Zahl der Testläufe
06 $turns = $sum = 0;
07 while ($sum < 50) { # Nötige Punktzahl
08 $turns++;
09 $wurf = int(rand(6) + 1);
10 $sum += $wurf;
11 $sum = 0 if ($wurf == 6);
12 }
13 $sumsum += $turns;
14 }
15 print "Mittlere Züge: ", $sumsum/1000, "n";
|
Mehr Spannung kommt auf, wenn zwei Spieler abwechselnd gegeneinander antreten: Wer nun die Sechs wirft, verliert seine gesammelten Punkte und der Mitspieler ist am Zug. Der aktive Spieler darf jedoch auch freiwillig an den Gegner abgeben: In dem Falle sichert er sich die bis dato gesammelten Punkte und fällt bei einer späteren Sechs nur auf diesen Stand zurück.
Spieltaktik mit Intelligenz
Ließ sich die erste Variante noch mit Schulmathematik in den Griff bekommen, erweist sich die zweite als kniffliger: Es kommt auf die Spieltaktik des Gegenübers an. Verspricht es mehr Erfolg, konservativ Punkte zu sammeln und fix abzugeben? Gelangt jener schneller ans Ziel, der mitzählt, wie häufig er schon der Sechs ausgewichen ist? Welchen Einfluss hat die Taktik des Mitspielers?
Um diese Fragen zu klären, schreibt das Linux-Magazin einen Wettbewerb aus, bei dem selbst programmierte Bots der Leser über das Netz gegeneinander antreten werden. Auf TCP-Port 3333 von [wettbewerb.linux-magazin.de] läuft dazu ein vorgegebener Gameserver, der Mitspieler vermittelt und auf die Einhaltung der Regeln achtet. Die Kommunikation erfolgt über ein einfaches Textprotokoll, das der Tradition vieler Unix-Handshakes wie etwa SMTP folgt. Tabelle 1 beschreibt die Kommandos des Servers, Tabelle 2 die Nachrichten des Spielers.
|
|
|
Kommando
|
Beschreibung
|
|
HELO Version Nachricht
|
So meldet sich der Gameserver bei Verbindungsaufbau. Die Version besteht aus Majornumber, einem Punkt und der Minornummer. Die Nachricht ist ein optionaler Freitext, die keine Auswirkung auf den Spielverlauf hat, aber auch Whitespace enthalten darf.
|
|
DENY Meldung
|
Aus einem Grunde verweigert der Server eine Anmeldung, typischerweise, weil der Client ein falsches Credential präsentiert hat. Die Nachricht ist optional. Anschließend beendet der Server die Verbindung.
|
|
TURN Deinepunkte Anderepunkte Nachricht
|
So meldet sich der Gameserver, wenn der Client an der Reihe ist zu spielen. Die beiden Parameter Deinepunkte und Anderepunkte sind ganzzahlige, positive Zahlen und geben den bisherigen Punktestand an. Die Nachricht ist wieder optionaler Text.
|
|
THRW Punktezahl Nachricht
|
Damit zeigt der Server das Ergebnis eines Wurfes an. Für welchen Spieler der Wurf gilt, muss der Client aus dem Spielverlauf selbst herausfinden. Die Nachricht ist optional.
|
|
DEF Deinepunkte Anderepunkte Nachricht
|
Damit zeigt der Gameserver an, dass der Client verloren hat. Die beiden Punkte geben noch einmal den Endstand wieder. Die Nachricht ist optional. Anschließend beendet der Server die Verbindung.
|
|
WIN Deinepunkte Anderepunkte Nachricht
|
Damit zeigt der Gameserver an, dass der Client gewonnen hat.Die beiden Punkte geben noch einmal den Endstand wieder. Die Nachricht ist optional. Anschließend beendet der Server die Verbindung.
|
|
|
|
Kommando
|
Beschreibung
|
|
AUTH Spielername Nachricht
|
So reagiert der neu angemeldete Client auf eine HELO-Nachricht und meldet sich beim Gameserver an. Der Spielername besteht ausschließlich aus Kleinbuchstaben. Großbuchstaben, Umlaute, Sonder- und Interpunktionszeichen sowie Whitespace sind nicht erlaubt.
|
|
ROLL Nachricht
|
Entscheidet sich der Client zu würfeln, sendet er diese Nachricht. Das eigentliche Würfeln übernimmt der Gameserver.
|
|
SAVE Nachricht
|
Entscheidet sich der Client, in dieser Runde nicht weiter zu würfeln, gibt er mit diesem Kommando an den Gegner ab. Die Nachricht ist optional.
|
Die Details des Ablaufes verdeutlicht Abbildung 1: Zunächst meldet sich ein Client beim Server mit der »AUTH«-Meldung und einem Namen an. Der Gameserver wählt aus, wer beginnt: Sobald ein Spieler an der Reihe ist, teilt das der Server mit der »TURN«-Meldung mit. Der Spieler hat dann zwei Optionen: Entscheidet er sich für »ROLL«, begibt er sich in Fortunas Hand und würfelt.

|
Abbildung 1: Zustände des Protokolls zwischen Gameservern (links) und einem Spieler-Client (rechts): Die abgerundeten Flächen zeigen Zustände, die eckigen Kästen enthalten die Nachrichten, die die jeweilige Seite versendet. Bei Nachrichten mit dickem Rand endet ein Spiel.
|
Sendet er »SAVE«, ist der Mitspieler an der Reihe - dafür sind dem Spieler die bislang erzielten Punkte sicher. Über die Statusmeldung »THRW« erhält der Client Informationen darüber, wie viele Augen ein Wurf zählte, und zwar sowohl für den eigenen wie für den gegnerischen Spieler. Derjenige Spieler, der als erster 50 Punkte oder mehr erzielt, hat gewonnen und beendet damit das Spiel. Es gibt keine Möglichkeit des Nachziehens. Abbildung 2 zeigt, wie ein Spiel manuell per Telnet abläuft.

|
Abbildung 2: Zu Testzwecken lässt sich der Gameserver auch manuell ansteuern – etwa mit einem Telnet-Client. So verfolgen Entwickler das Protokoll.
|
Trainingslager
Ein naiver Client könnte beispielsweise immer so lange per »ROLL« würfeln, bis er entweder gewinnt »WIN« oder der andere Spieler an der Reihe ist. Listing 2 implementiert diesen Ansatz als Bash-Skript, das Anwender mit dem Netcat-Aufruf »nc -e client01.sh wettbewerb.linux-magazin.de 3333« starten. Netcat kümmert sich dabei um den Aufbau der Verbindung und verdrahtet die Standard-Ein- und -Ausgabe mit dem Skript. Als Kniff gibt dieser Bot mit einer Wahrscheinlichkeit von 1:4 (Zeile 13) an seinen Mitspieler ab, um Punkte zu sichern.
01 #!/bin/bash
02
03 name=tux
04
05 while read command a1 a2 a3
06 do
07 case $command in
08 HELO)
09 echo "AUTH $name Ich bin bereit!"
10 ;;
11 TURN)
12 echo "Spielstand ${a1}:${a2}" >&2
13 if (($RANDOM % 4 == 1))
14 then
15 echo "SAVE Das reicht erstmal ..."
16 active=0
17 else
18 echo "ROLL Auf gut Glück!"
19 active=1
20 fi
21 ;;
22 THRW)
23 if [ "$active" = "1" ]
24 then
25 echo "Ich würfle eine $a1." >&2
26 if [ "$a1" = "6" ]
27 then
28 echo "Du bist dran!" >&2
29 active=0
30 fi
31 else
32 echo "Du würfelst eine $a1." >&2
33 if [ "$a1" = "6" ]
34 then
35 echo "Ich bin dran!" >&2
36 active=1
37 fi
38 fi
39 ;;
40 WIN|DEF)
41 echo "Spielende: $command" >&2
42 exit 0
43 ;;
44 *)
45 echo "Unbekannt: $command" >&2
46 ;;
47 esac
48 done
|
Bis zum 12. September 2010 haben die Bots Zeit, eine ausgefeiltere Taktik zu finden. Bis zu diesem Termin dürfen Leser ihre Programme an [wettbewerb@linux-magazin.de] einsenden, um am Abschlussturnier teilzunehmen. Dabei treten alle Teilnehmer mehrfach gegen jeden anderen Teilnehmer an. Jeder Leser darf nur mit einem einzigen Bot teilnehmen. Erhält die Redaktion mehrere Einsendungen vom selben Absender, startet die letzte fristgerechte Einsendung.
| Whitepaper |
|
Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele
Über die letzten Jahre hinweg haben sich Open Source Lösungen als fester Bestandteil des gesamten Datenintegrationsmarktes etabliert. Viele Unternehmen haben bereits das Open Source Modell für Ihre Datenintegrationsprojekte aufgegriffen. Das vorliegende White Paper illustriert anhand ausgewählter Fallstudien und Anwendungsbeispiele die Implementierung von Open Source Datenintegration in der Praxis und benennt die daraus resultierenden Vorteile.
Download PDF (Registrierung erforderlich)
|
|
The Role of Open Source in Data Integration
Obwohl in den letzten Jahren viele technische Fortschritte erzielt werden konnten, verfügen die meisten Datenintegrationsprozesse nach wie vor nur über eine sehr begrenzte Automatisierung. Das vorliegende White Paper von dem Industry Analyst Mark Madson wird zunächst ein grundlegendes Verständnis von Daten Integration vermitteln, die Vorzüge von Open Source Lösungen für Daten Integration erläutern und Ihnen professionelle Empfehlungen geben, damit Sie Ihre Integrationsjobs noch einfacher und produktiver gestalten können.
Download PDF (Registrierung erforderlich)
|
Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links"
nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedrucken Fassung entsprechen.
|
test0x7b,
26.08.2010 04:50
Bisher hat es einfach Spaß gemacht einen Client damit zu schreiben, aber ohne Starterlaubnis schwindet die Lust weiter an der engine zu feilen.
monsterDice,
07.08.2010 16:37
Das verdirbt einem regelrecht die Lust am Mitmachen...
Jörn,
05.08.2010 20:54
Rainer,
05.08.2010 18:54
Ich erreich den nicht immer!
Nils Magnus,
04.08.2010 16:39
Wenn es Probleme gibt, bitte auf
http://wettbewerb.linux-magazin.de/
eintragen. Dort habe ich auch Kontaktangaben und eine Art Forum (als Wiki) aufgesetzt.
worf,
04.08.2010 15:24
Alaroid,
04.08.2010 12:10
Habe wohl mein Programm zu schnell fertig bekommen.