Das Werwolf Spiel
Werwolf ist ein Spiel, bei dem die Spieler in Werwölfe und Dorfbewohner aufgeteilt werden. Die Werwölfe kennen sich gegenseitig und eliminieren nachts heimlich einen Dorfbewohner. Tagsüber diskutieren alle Spieler und stimmen darüber ab, wen sie für einen Dorfbewohner halten und aus dem Spiel wählen. Die Dorfbewohner gewinnen, wenn die gesamten Werwölfe ausgeschaltet sind; die Werwölfe gewinnen, sobald sie genauso viele oder mehr Spieler als die Dorfbewohner stellen. In der Regel haben verschiedene Dorfbewohner Sonderrollen, die es ihnen erlaubt Informationen über die Werwölfe zu sammeln oder das Spiel auf eine andere Art zu beeinflussen
Grundlegende Annahmen und Vereinfachungen
Um das Spiel einfacher mathematisch darzustellen, müssen wir einige Annahmen und Vereinfachungen machen. Nachts wählen die Werwölfe zufällig einen Dorfbewohner als Opfer aus, der in dieser Nacht ausscheidet. Am Tag wird per Zufall entschieden, wer nach der Abstimmungsphase ausscheidet. Die Werwölfe koordinieren sich nicht untereinander bei der Abstimmung. Gespielt wird, bis es gleich viele oder weniger Dorfbewohner als Werwölfe gibt oder alle Werwölfe ausgeschieden sind.
Funktionsweise des Programmes
Zu Beginn werden mehrere Packages importiert. Diese sind nötig, um zufällige Zahlen zu generieren oder die Ergebnisse in Diagrammform darzustellen. Die Genauigkeit gibt an, wie viele spiele pro Zustand (Anzahl von Werwölfen und Dorfbewohner) gespielt werden, um daraus später eine durchschnittliche Gewinnwahrscheinlichkeit zu berechnen.
Die darauffolgende Funktion berechnet aus zwei Eingabewerten (Anzahl der Spieler n und Anzahl der Werwölfe m) eine Gewinnwahrscheinlichkeit für die Werwölfe, den sie als Ausgabewert p ausgibt.
Der Folgende Graph gibt die Gewinnwahrscheinlichkeit für einen Werwolf bei variierender Spieleranzahl an. Dafür wird im Programm ein Höchstwert für die Spieleranzahl festgelegt und alle Situationen bis zum Höchstwert durch die oben erklärte Funktion berechnet. Im Diagramm dargestellt ergibt sich eine Funktion die näherungsweise durch 1/√x beschrieben werden kann. Um den Verlauf des Diagramms gleichmäßiger darzustellen, beschränken wir uns auf die Darstellung von geraden Spieleranzahl. Das geht darauf zurück, dass das Hinzufügen eines Dorfbewohners – also das Erhöhen der Spieleranzahl auf eine ungerade Menge – die Gewinnchance der Werwölfe erhöht. Die Gründe dafür sind mathematischer Natur (Migdał, 2010, S. 6–7).

Die Folgende Heatmap stellt die Gewinnwahrscheinlichkeit (Siegquote) der Werwölfe Abhängig vom Verhältnis von Werwölfen zu Spielern bis zu einer maximalen Spielerzahl (In diesem Fall ebenfalls 52) an. Das rote Dreieck in der oberen, linken Hälfte des Diagramms ist nicht definiert, da sonst die Anzahl der Werwölfe die Anzahl der Spieler übersteigen würde, was schlicht unmöglich ist. Ebenfalls ist die Gewinnwahrscheinlichkeit für die Werwölfe ab einem Verhältnis von 0,5 automatisch 100%. Interessant ist also nur der untere Teil, in dem die Gewinnwahrscheinlichkeit in etwas ausgeglichen ist.

Das Balkendiagramm vergleicht die Siegquote der Dorfbewohner mit der Spieleranzahl, wenn sich der Anteil der Wölfe an der Spieleranzahl aus der Wurzel der Spieleranzahl berechnet. Die Gewinnwahrscheinlichkeit der Werwölfe sinkt, solange mehr Dorfbewohner dazukommen. Das passiert so lange bis der Breaking Point erreicht ist und ein neuer Wolf dazukommt. Diese Mechanik liegt der logischen Annahme zugrunde keine nicht natürliche zahl an Wölfen hinzufügen zu können und ist für den stufenartigen Aufbau des Diagramms verantwortlich.

Letztendes sind diese Berechnungen und Modelle in ihrer Aussagekraft eingeschränkt und beruhen auf den Eingangs erwähnten Annahmen und Vereinfachungen. Die Diagramme dienen dazu, das grundlegende Prinzip zumindest annähernd zu beschreiben und nicht um Ereignisse im realen Leben akkurat vorherzusagen. Auch wenn diese Modelle die Realität nicht vollständig beschreiben, können sie Indizien oder Hinweise auf die Entscheidungsfindung im realen L eben liefern.
Literatur
Migdał, P. (2010). A mathematical model of the Mafia game, https://arxiv.org/pdf/1009.1031
Anhang (Code)
import matplotlib.pyplot as plt
import numpy as np
import random
from math import sqrt
genauigkeit = 50000
print("WERWOLFSIMULATION")
print("\n")
def simu(spieler: int, werwolf: int) -> float:
siege = 0
for _ in range(genauigkeit):
n = spieler
m = werwolf
while m > 0 and m <= n // 2:
zufall = random.randint(1, n)
if zufall <= m:
m = m - 1
n = n - 1
if m >= n / 2:
break
n = n - 1
if m > 0 and m >= n / 2:
siege = siege + 1
p = siege / genauigkeit
return p
#maximaler wert von n
max: int = 52
#i ist spieler und g werwolf
array = [0.0 for _ in range(0, max - 1)]
for i in range(2,max,2):
array[i-1] = simu(i, 1)
print("ein Werwolf:")
plt.figure(1)
plt.plot(range(2, max, 2), [array[x-1] for x in range(2, max, 2)])
plt.xlabel("Spieler*in")
plt.ylabel("Siegquote Werwölfe")
plt.show()
print("\n") #trennen
genauigkeit = 1000
array2 = [[0 for _ in range(0,10)] for _ in range(0,max-1)]
for i in range(1,max):
for g in range(1,11):
if i >= g:
array2[i-1][g-1] = simu(i, g)
plt.figure(2)
plt.imshow(np.array(array2).T, cmap='Reds', origin='lower')
plt.ylabel("Werwölfe")
plt.xlabel("Spieler*in")
plt.colorbar(label='Siegquote Werwölfe')
plt.show()
print("\n") #trennen
genauigkeit = 50000
array3 = [0.0 for _ in range(0, max - 1)]
for i in range(2,max,2):
array3[i-1] = 1-(simu(i, int(sqrt(i))))
print("Anzahl der Werwölfe = Wurzel aus Anzahl der Spielern:")
plt.figure(3)
plt.bar(range(2, max, 2), [array3[x-1] for x in range(2, max, 2)], width=1.2)
plt.xlabel("Spieler*in")
plt.ylabel("Siegquote Dorf")
plt.show()