Schlagwort-Archiv: Linux Magazin

alea iacta est – Teil 4

Vor noch nicht ganz einem Monat war Einsendeschluss für den Wettbewerb vom Linux-Magazin, über welchen ich ja schon in den vorigen 3 Teilen zu genügen berichtet habe.

So ist es nun an der Zeit, meinen kompletten Bot einzusenden. Er wird zwar niemandem mehr beim Wettbewerb helfen, aber vielleicht will ihn ja sonst jemand missbrauchen ;)

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/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
 
	meins=$1 # Meine Punktzahl umspeichern
	seins=$2 # Gegnerische Punktzahl umspeichern
 
	zaehler=$(( $zaehler+1 ))
	if [ $zaehler -gt 4 ] 
	then # Minimal 3 Würfe vor erstem Speichern, dann
		if [ 10 -gt $(( 50-$meins )) ] # fehlt noch viel bis zum Sieg?
		then
			active=1
			echo "ROLL Das reicht noch..." # würfeln
		else
			if [ $(( $meins-$seins )) -gt 5 ]
			then # Ich habe 4 Punkte mehr als Gegner, dann
				zaehler=0 # Zähler zurücksetzen
				active=0 # Zug beendet
				echo "SAVE Sicher ist sicher!" # Speichern
			else # sonst
				active=1
				echo "ROLL Ich muss..." # würfeln
			fi
		fi
	else # sonst
		active=1
		echo "ROLL Und los..." # würfeln
	fi
}
 
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)
			exit 0
			;;
		*)
			echo "AUTH $name Ich bin bereit!"
			;;
	esac
done

Ich weiss, die künstliche Intelligenz ist nicht überragend; wie es jedoch im Vergleich mit den anderen Mitstreitern aussieht, kann ich leider nicht sagen, vom Veranstalter habe ich bisher noch keine Rückmeldung, aber da wurde Magnus vom Linux Magazin wohl ein bisschen von den zahlreichen Einsendungen überrascht…

Trotzdem war es ein interessanter Wettbewerb, obwohl ich anmerken möchte, bei den prophezeiten Spielen, welche jeder Bot gegen einen Gegner spielt, entscheidet mehr der Zufall als eine ausgefeilte Programmierung. Ich weiss, ich suche nur eine Ausrede, falls ich nicht immer gewinne ;)
Naja, es zählt ja der Spass dabei und meine Bash-Kenntnisse auffrischen war auch nicht das dümmste ;)

alea iacta est – Teil 3

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. :)

alea iacta est – Teil 2

Mein Bot ist nun soweit geschrieben und mit Intelligenz gefüllt. Was ihm nun noch fehlt, sind ein paar Tests, danach werde ich (zumindest Auszüge daraus) auch hier veröffentlichen.

Doch noch ein paar Worte zu meinem Vorgehen:
Eigentlich wollte ich die Kommunikation von Script zu Server via dem virtuellen Device /dev/tcp abwickeln. Schon relativ früh zeigte sicher aber; das ist so nicht lösbar!
Das Problem dabei ist, dass sobald irgendetwas auf den Device umgeleitet wird, wird die TCP-Verbindung neu aufgebaut und nach dem Senden auch gleich wieder getrennt. Geplant ist aber, dass die Verbindung nur einmal hergestellt und dann natürlich auch gehalten wird…

Somit musste ich kurzerhand umdisponieren und bin auf eine andere Möglichkeit mittels Netcat ausgewichen. Dabei wird, wie hier schon zu lesen war, mittels der Option -e nach dem Verbinden ein Script gestartet. Die Kommunikation verläuft dabei über die Standard-Ein- und -Ausgabe. Jegliche Teile der Verbindung werden von Netcat geregelt, wodurch ich mich voll und ganz auf die KI konzentrieren kann.

Doch nun zum Wichtigsten: Die Strategie!
Ich habe in ein paar kurzen, manuellen Spielen ein paar Taktiken ausprobiert. Zur Zeit umgesetzt sind:

  1. Liege ich im Rückstand, muss ich risikofreudiger werden.
  2. Liege ich weit vorne, kann ich sicherer spielen.
  3. Speichert mein Gegner selten, kann ich sicherer spielen

Doch irgendwie reicht mir das noch nicht aus für meinen Bot.
Wenn also jemand noch weitere Ideen hat, dann immer her damit :) Jeder Input ist willkommen!

alea iacta est

Auch dieses Jahr wieder macht das Linux-Magazin einen Programmierwettbewerb. Diesmal ist ein binärer Spieler gefordert, welcher sich in einem Würfelduell mit anderen Mitstreitern messen kann.

Die Vorgaben dabei sind ganz einfach; der Bot muss schlussendlich mit einem Make-File gestartet werden können und auf einem Ubuntu 10.04 Rechner laufen. Insofern kann die Programmiersprache also fast frei gewählt werden. Der Spielablauf wird dabei vom Server wettbewerb.linux-magazin.de über ein für menschen-lesbares TCP-Protokoll gesteuert.

Das ganze Spiel an sich ist relativ einfach gehalten. Ein Bot kann solange Würfeln, wie er keine 6 wirft oder das Spiel nicht speichert. Alle Punkte werden dabei immer zusammengezählt.
Sobald jedoch eine 6 geworfen wird, so werden alle Punkte bis zum letzten Save wieder abgezogen, und der Spielzug ist beendet.
Es gilt also, seinem Bot soviel Intelligenz einzuhauchen, damit dieser das optimale Mittelmass zwischen “Roll” (würfeln) und “Save” (speichern) findet.

Meinen Bot habe ich in Bash-Script begonnen und bin bislang damit ganz gut gefahren, da es sich über ein virtuelles Device ohne viel Programmieraufwand problemlos via TCP mit einem beliebigen Server kommunizieren lässt:

1
echo "alea iacta est" > /dev/tcp/$server/$port

Wer es noch einfacher will, und sich überhaupt nicht um jegliche Kommunikation zwischen Server und Bot bemühen will, der kann sein Script via Netcat starten und alle Kommandos über die Standard-Ein- und Ausgabe verwalten:

1
nc -e bot.sh wettbewerb.linux-magazin.de 3333

Auch wer auf etwas komplexeres Zurückgreifen will, der findet auf der offiziellen Webseite bereits Beispiele in PHP und Ruby, welche man nur noch mit Intelligenz füllen muss.

Ein weiteres sehr gutes PHP-Beispiel gibt es auch auf blog.oncode.info, dank welcher Seite ich überhaupt auf den Wettbewerb aufmerksam geworden bin.

Noch bis zum 12. September ist das Spiel für jedermann und jedefrau geöffnet! Mögen die Würfel entscheiden ;)