alea iacta est – Teil 4

closeDieser Beitrag gehört zu der Artikelserie alea iacta est

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 😉

11 Kommentare bei „alea iacta est – Teil 4

  1. Sehr chic gemacht, ich werde meinen Bot auch bald vorstellen. Danke nochmal, dass du mich auf den Wettbewerb aufmerksam gemacht hast 🙂 Wie liefen deine Testläufe? Warst du oft auf dem offiziellen Server unterwegs? Mir kam es so vor, als wären dort die härteren Gegner gewesen als auf den zahlreichen Serverklonen…

    1. Vielen Dank und gern geschehen, bin gespannt auf deine Version.
      Das die stärksten Gegner auf dem offiziellen Server unterwegs waren, habe ich selbst auch bemerkt.
      Ich war am Anfang jedoch meist auf den Klonen unterwegs, bis der offizielle endlich mal ein Update erhalten hat. Vorher war es für Normalsterbliche ohne ellenlange Code-Konstrukte zum Timeouts und Fehler abfangen nicht möglich da zu spielen 😉
      Ich habe aber sehr oft festgestellt, dass besonders auf dem offiziellen, es sehr abhängig war, um welche Zeit du gespielt hast. So gab es Zeiten da bin ich auf Raten von über 60% gekommen und an anderen Tagen habe ich gerade mal ein bisschen mehr als 40% an Gewinnen hin gekriegt.

      Naja wir werden sehen, was die Auswertung bringt. Wie hast du deinen Bot denn genannt?

      1. Mein Bot wurde ganz kreativ nach meinem Blog benannt: bejonet. Und deiner?
        Mir ist auch aufgefallen, dass die Gegner stärker wurden, je näher der Einsendeschluss war. Allerdings glaube ich, dass die ganz harten Gegner ihre Bots nicht auf dem offiziellen Server getestet haben, sondern aus dem Hinterhalt kommen 😉
        Gegen Ende hatte ich dann keine Lust mehr, den Bot noch zu verfeinern. Wie du dann sehen wirst (wenn ich den Code veröffentliche), wäre es ein leichtes gewesen, noch weitere Faktoren (etwa die Taktik des Gegners) in die Entscheidung mit einfließen zu lassen.
        Es hat auf jeden Fall total Spaß gemacht!

  2. Ich bin auch durch deine Blogposts auf den Wettbewerb aufmerksam geworden und habe mich beteiligt. Eventuell veröffentliche ich das auch noch mal.
    Kannst du noch etwas dazu schreiben, wie du deine Strategie entwickelt hast?
    Ich habe in die Strategieentwicklung viel Zeit investiert, aber es ist nicht besonders viel dabei rausgekommen. Ich konnte also meine Anfangsstrategie (eine Abwandlung von „roll17“) kaum verbessern.
    Daher bin ich auch gespannt, ob vielleicht sogar so eine einfache Strategie gewinnt.

    1. Hm ich habe viel ausprobiert…
      Zuerst habe ich mal von Hand gespielt und aufgeschrieben wie ich auf bestimmte Situationen reagiere. Und dadurch sind die drei Punkte aus dem Artikel Folge 3 hervorgegangen.
      Dann habe ich alles umgesetzt und in mehreren Testläufen die optimalen Zahlen herausprobiert.
      Nichts wildes einfach 😉

      1. Ich habe schlechte Neuigkeiten für dich: Anscheinend schlägt deine Strategie nichtmal „roll17“ (vorausgesetzt ich habe sie richtig implementiert).
        Um das zu prüfen (und auch um meine Strategie zu erarbeiten) habe ich ein Script geschrieben, was einfach zwei Strategien gegeneinander spielen lässt, ohne Server. So kann man sehr zügig 100000 Spiele (und mehr) spielen.

        Außerdem sind mir dabei Ungereimtheiten bei deiner Implementierung aufgefallen: $zaehler wird nicht zurückgesetzt, wenn du eine 6 würfelst. Und im Kommentar steht „Minimal 3 Würfe vor erstem Speichern“, aber „[ $zaehler -gt 4 ]“ ist erst bei $zaehler = 5 richtig, was vier Würfe bedeutet.

        Für meine Strategie habe ich mir überlegt, dass man den Gegner so wenig wie möglich Spielen lassen darf. Da kommen dann roll13, roll17 und roll25 als Strategien in Frage, also erst speichern, wenn man 13, 17 bzw. 25 Punkte hat. roll17 ist anscheinend am günstigsten und bedeutet, dass man nur zwei mal speichert. Das habe ich noch so abgewandelt, dass man erst ein drittel der restlichen Punkte erreichen muss und dann noch die Hälfte. Wenn der Gegner über 25 Punkte hat, dann wird nicht mehr gespeichert, weil die Wahrscheinlichkeit zu groß ist, dass der Gegner dann fertig wird.

        1. Naja wie auch immer, bin in tests immer auf relativ gute Werte gekommen, also so schlecht wirds schon nicht sein 😉

          Die Kommentare sind leider untergegangen, als ich die Werte optimiert habe, aber ist ja egal. Wir werden sehen in der Endauswertung.

Schreibe einen Kommentar

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