Autor Thema: WH(40K) Würfelscript | Jetzt auch als .exe  (Gelesen 2070 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline SeelenJägerTee

  • Legend
  • *******
  • Biomancer
  • Beiträge: 6.445
  • Geschlecht: Männlich
  • Username: SeelenJägerTee
WH(40K) Würfelscript | Jetzt auch als .exe
« am: 15.04.2012 | 23:48 »
Da ich gerade meine unzulänglichen Pythonkentnisse entroste hab ich mir gedacht ich produziere mal was nützliches und schreib ein Script, dass einem das elendige rumgewürfle und gerechne wie viele Erfolgsgrade man jetzt hat abnimmt.
Keine Ahnung ob das hier sonst noch jemand brauchen kann, aber es online zu stellen schadet ja nicht.

Ich geb's hier mal als Code an es in ne .txt Datei zu kopieren und die umzubenennen kriegt ihr wohl selber hin.

import random

#########
# Geschrieben von SJT 15.04.2012
#########
# Erstellt mit Python 2.7.2
#########

# Gibt die Erfolgsgrade eines Wuerfelwurfes bei WH40K RPG aus.
# Erinnerung: 30 gewuerfelt bei einem Wert von 45 ist Erfolg und 1 Erfolgsgrad bei DH und RT, aber 2 Erfolgsgrade bei BC
# Die Routine wuerde hier 2 ausgeben
def WH_Wuerfel(Fertigkeit, Zufallszahl):
if Zufallszahl+10 > Fertigkeit >= Zufallszahl:
return 1
elif Fertigkeit > Zufallszahl:
return ((Fertigkeit-Zufallszahl)/10+1)
elif Zufallszahl-10 < Fertigkeit < Zufallszahl:
return -1
else:
return (-1*((Zufallszahl-Fertigkeit)/10+1))

# Nimmt die DOS und wandelt sie in einen Text um der ausgegeben wird
def Auswertung(Deg_of_suc):
if Deg_of_suc == 1:
print "Erfolg (DH, RT) oder 1 Erfolgsgrad (BC)"
elif Deg_of_suc == 2:
print "Erfolg und 1 Erfolgsgrad (DH, RT) oder 2 Erfolgsgrade (BC)"
elif Deg_of_suc > 2:
print "Erfolg und %s Erfolgsgrade (DH, RT) oder %s Erfolgsgrade (BC)" %(Deg_of_suc-1, Deg_of_suc)
elif Deg_of_suc == -1:
print "Misserfolg (DH, RT) oder 1 Fehlschlagsgrad (BC)"
elif Deg_of_suc == -2:
print "Misserfolg und 1 Fehlschlagsgrad (DH, RT) oder 2 Fehlschlagsgrade (BC)"
else:
print "Misserfolg und %s Fehlschlagsgrade (DH, RT) oder %s Fehlschlagsgrade (BC)" %(abs(Deg_of_suc+1), abs(Deg_of_suc))

# Vergleicht die Erfolgsgrade beider Spieler um zu ermitteln wer um wie viel gewonnen hat.
def Vergleich(Deg_Suc_1, Deg_Suc_2):
if Deg_Suc_1 > 0:
Verg_1 = Deg_Suc_1
else:
Verg_1 = 0
if Deg_Suc_2 > 0:
Verg_2 = Deg_Suc_2
else:
Verg_2 = 0
if Verg_1 == Verg_2:
print "Unentschieden, niemand gewinnt!"
elif Verg_1 > Verg_2:
print "Spieler 1 gewinnt mit %s DoS" %(Verg_1-Verg_2)
elif Verg_2 > Verg_1:
print "Spieler 2 gewinnt mit %s DoS" %(Verg_2-Verg_1)
else:
INSANITY_ERROR = random.randint(1,10)
print "Error! This shouldn't exist in this reality. Gain 1d10 (%s) Insanity" %INSANITY_ERROR

RUN = 1
REROLL = 0
while RUN > 0:
if REROLL == 0:
# Hier gibt man den Fertigkeitswert der Kontrahenten ein
Fertigkeit_SP1 = int(raw_input('Fertigkeitswert Spieler 1: '))
Fertigkeit_SP2 = int(raw_input('Fertigkeitswert Spieler 2: '))

# Erzeugt Zufallszahl und vergleicht mit Fertigkeitswert von Spieler 1
Zufallszahl_1 = random.randint(1,100)
DOS_1 = WH_Wuerfel(Fertigkeit_SP1, Zufallszahl_1)
print "\nSpieler 1 Wuerfelt: %s" %Zufallszahl_1
Auswertung(DOS_1)

# Erzeugt Zufallszahl und vergleicht mit Fertigkeitswert von Spieler 2
Zufallszahl_2 = random.randint(1,100)
DOS_2 = WH_Wuerfel(Fertigkeit_SP2, Zufallszahl_2)
print "\nSpieler 2 Wuerfelt: %s" %Zufallszahl_2
Auswertung(DOS_2)
else: # Nachwuerfeln
GO_S1 = 1
GO_S2 = 1
while GO_S1 + GO_S2 > 0:
if GO_S1 == 1:
Nachw_SP1 = raw_input('\nSpieler 1 willst du:\nNachwuerfeln mit SchiP? (w) \nWarten ob Spieler 2 nachwuerfelt? (s) \nNicht nachwuerfeln? (x)\nEingabe zum Bestaetigen\n')
if Nachw_SP1 == 'w':
Zufallszahl_1_REROLL = random.randint(1,100)
DOS_1_REROLL = WH_Wuerfel(Fertigkeit_SP1, Zufallszahl_1_REROLL)
print "\nSpieler 1 Wuerfelt: %s" %Zufallszahl_1_REROLL
Auswertung(DOS_1_REROLL)
GO_S1 = 0
S1_Reroll_check = 1
elif Nachw_SP1 == 'x':
print "Spieler 1 wuerfelt nicht nach."
GO_S1 = 0
S1_Reroll_check = 0
else:
print "Spieler 1 wartet ob Spieler 2 nachwuerfelt."
GO_S1 = 1

if GO_S2 == 1:
Nachw_SP2 = raw_input('\nSpieler 2 willst du:\nNachwuerfeln mit SchiP? (w) \nWarten ob Spieler 1 nachwuerfelt? (s) \nNicht nachwuerfeln? (x)\nEingabe zum Bestaetigen\n')
if Nachw_SP2 == 'w':
Zufallszahl_2_REROLL = random.randint(1,100)
DOS_2_REROLL = WH_Wuerfel(Fertigkeit_SP2, Zufallszahl_2_REROLL)
print "\nSpieler 2 Wuerfelt: %s" %Zufallszahl_2_REROLL
Auswertung(DOS_2_REROLL)
GO_S2 = 0
S2_Reroll_check = 1
elif Nachw_SP2 == 'x':
print "Spieler 2 wuerfelt nicht nach."
GO_S2 = 0
S2_Reroll_check = 0
else:
print "Spieler 2 wartet ob Spieler 1 nachwuerfelt."
GO_S2 = 1

# Bei vergleichenden Tests. Denkt dran, dass 5 Misserfolgsgrade und 1 Erfolgsgrad im vergleichenden Test
# KEIN Sieg um 6 sondern um 1 Erfolgsgrad ist.
if REROLL == 0:
Vergleich(DOS_1, DOS_2)
else:
Comparison_sel = raw_input('\nSteht der bessere (beliebige Eingabe) oder der zweite (x) Wurf?')
if S1_Reroll_check == 1:
if Comparison_sel == 'x':
if DOS_1 > DOS_1_REROLL:
DOS_1_REROLL = DOS_1
else:
IDLE = 1
else:
IDLE = 1
else:
DOS_1_REROLL = DOS_1
if S2_Reroll_check == 1:
if Comparison_sel == 'x':
if DOS_2 > DOS_2_REROLL:
DOS_2_REROLL = DOS_2
else:
IDLE = 1
else:
IDLE = 1
else:
DOS_2_REROLL = DOS_2
Vergleich(DOS_1_REROLL, DOS_2_REROLL)

#Abfrage ob einer der Spieler nachwuerfeln will, ob man zum Anfang zurueck will oder ob man schliessen will.
Falsche_Eingabe = 1
while Falsche_Eingabe == 1:
Neustart = raw_input('\nPROGRAMM ENDE\nNachwuerfeln mit SchiP? (w) \nProgramm neu starten? (s) \nProgramm beenden? (x)\nEingabe zum Bestaetigen\n')
if Neustart == 'w':
print "\nPrepare to reroll!"
REROLL = 1
Falsche_Eingabe = 0
elif Neustart == 's':
RUN = 1
REROLL = 0
Falsche_Eingabe = 0
elif Neustart == 'x':
RUN = 0
Falsche_Eingabe = 0
else:
print "\nUngueltige Eingabe! - Tz tzt tz."
Falsche_Eingabe = 1
« Letzte Änderung: 21.04.2012 | 14:19 von SeelenJägerTee »

Offline SeelenJägerTee

  • Legend
  • *******
  • Biomancer
  • Beiträge: 6.445
  • Geschlecht: Männlich
  • Username: SeelenJägerTee
Re: WH(40K) Würfelscript
« Antwort #1 am: 21.04.2012 | 14:18 »
Jetzt auch als .exe.

Ich habe das Programm in C++ übertragen.
Es sollte jetzt als .exe zumindest auf Windows Betriebssystemen laufen.

Bitte nehmt zur Kenntnis, dass ich jegliche Haftung für irgend welche Schäden an Vermögen, Zeit, Gesundheit, geistiger Verfassung und Anderem ablehne.
Nehmt weiterhin zur Kenntnis, dass es sich um die Version 0.5 handelt. Deswegen hat sie noch einige Macken, z.B. werden Ümläüte nicht richtig angezeigt, im großen und ganzen sollte es aber Funktionieren wie es soll.

(Klicke zum Anzeigen/Verstecken)

Technisches:
Das Programm nutzt den Mersenne Twister, was ein Pseudozufallsgenerator von recht hoher Güte ist.
Das Programm fragt euch nach einer Saat.
Aufgrund der Funktionsweise von PRNGs liefert eine Saat immer die gleiche Abfolge von Zahlen. Um einen echten Zufall zu erreichen wird deswegen oft an die Systemzeit gekoppelt, da keiner so genau weiß was die GENAU anzeigt wenn er das Programm startet ist damit Zufälligkeit gewährleistet. Dieses Feature werde ich für die 1.0 noch einbinden.
MT braucht bei einer schlechten Saat ungefähr 80.000 Durchläufe, bis er gute Ergebnisse produziert, das muss euch aber nicht interessieren, da er einfach 80.000x durchläuft nachdem ihr die Saat eingetippt habt.
[Edit:]
PS: ach ja der MT hat eine lächerlich große Periode von 219937-1 ≈ 4,3·106001 das heißt für eine Gegebene Saat wiederholt sich der Generator erst nach 4,3·106001 Durchläufen, jeder Durchlauf generiert außerdem 426 Zahlen. Ihr könntet den Generator also einmal starten und für den Rest eures Lebens verwenden, so oft könnt ihr gar nicht würfeln die Periode einmal auszuschöpfen.

Denkt aber dran jedes mal wenn ihr die .exe startet eine andere Zahl als Saat zu nutzen.
[/Edit]

Manche werden jetzt wahrscheinlich sagen "Wäääh das ist ja gar kein echter Zufall!"
Ja aber eure Würfel sind nicht perfekt. Sie haben keine scharfen Kanten (ich habe zumindest noch keine solchen W10 gesehen) und ihre Achsen werden auch nicht gleich Lang sein.
Irgendwo haben hier im :T: mal ein paar Leute rumexperimentiert und festgestellt, dass auf dem W20 manche Zahlen signifikant häufiger fallen, als sie es bei einem perfekten Würfel sollten (ob sie auch relevant häufiger fallen ist jetzt natürlich ne andere Frage).
Ich würde wetten, dass das Programm hier bessere Ergebnisse produziert als normales Rumgewürfel. Ihr könnt ja außerdem die Saat auswürfeln. ;)

Funktionsweise:
1. Anhang herunterladen
2. Readme lesen
3. Programm starten (aus der .zip ausführbar)
4. Programm nutzen
  a.) Disclaimer noch mal lesen
  b.) Saat eingeben
  c.) Fertigkeitswert für Spieler 1 und Spieler 2 eingeben (falls ihr nicht konkurrierend würfeln wollt gebt einfach irgendwas für Sp2 ein)
  d.) Jetzt erhaltet ihr eine Auswertung wie viele Erfolgsgrade Sp1 und Sp2 haben und wer von beiden um wie viele EG gewinnt.
  e.) Das Programm fragt euch ob ihr
      - es Beenden wollt
      - einen neuen Wurf machen
      - Sp1 und/oder Sp2 nachwürfeln will
          + hier werden Sp1 und Sp2 nacheinander gefragt ob sie nachwürfeln wollen, nicht nachwürfeln oder auf den anderen warten
             (wenn Beide immer warten ob der andere nachwürfelt kann das natürlich etwas dauern  :P)


EDIT: Version 1.0 gibt es hier.

[gelöscht durch Administrator]
« Letzte Änderung: 22.04.2012 | 17:45 von SeelenJägerTee »

Taschenschieber

  • Gast
Re: WH(40K) Würfelscript | Jetzt auch als .exe
« Antwort #2 am: 21.04.2012 | 14:45 »
Ist das nicht eh schon völliger Overkill? Manipulationen und Vorhersagen sind doch schon bei normalen PRNGs mit Timestamp als Seed so aufwendig, dass man sie am Spieltisch nicht abziehen kann.

Offline SeelenJägerTee

  • Legend
  • *******
  • Biomancer
  • Beiträge: 6.445
  • Geschlecht: Männlich
  • Username: SeelenJägerTee
Re: WH(40K) Würfelscript | Jetzt auch als .exe
« Antwort #3 am: 21.04.2012 | 15:01 »
Ist das nicht eh schon völliger Overkill?
[...]
Ich verstehe nicht so ganz was das "DAS" ist auf das du dich beziehst.


Aber ja der Generator hat an einigen Stellen Overkillcharakter.
 - Mersenne Twister statt rand() nutzen
 - 80.000x Vorlaufen lassen damit man auch ja im optimalen Bereich läuft

Schon ein normaler PRNG mit der schlechteren rand() Funktion dürfte "zufälliger" sein als der Beutel-, Tisch- und Boxen-Würfel.

"Oh ein Moskikto! - Warum Insektenspray nutzen wenn wir ihn aus dem Orbit nuken können?"  ~;D

Außerdem stellst du die falsche Frage: "Warum sollten wir?"
Die richtige Frage ist doch: "Warum sollten wir NICHT?"

Taschenschieber

  • Gast
Re: WH(40K) Würfelscript | Jetzt auch als .exe
« Antwort #4 am: 21.04.2012 | 15:03 »
Weils die Datei aufbläst und die Nutzung verkompliziert? ;)  Aber ja, wenn's dir Spaß macht, dann mach.

Offline SeelenJägerTee

  • Legend
  • *******
  • Biomancer
  • Beiträge: 6.445
  • Geschlecht: Männlich
  • Username: SeelenJägerTee
Re: WH(40K) Würfelscript | Jetzt auch als .exe
« Antwort #5 am: 21.04.2012 | 15:09 »
Weils die Datei aufbläst und die Nutzung verkompliziert? ;)  Aber ja, wenn's dir Spaß macht, dann mach.
Ach komm das Zip File hat ~360 KB und die Nutzung wird dadurch mMn nicht komplizierter, da das ja im Hintergrund abläuft.
Bei mir brauchen die 80.000 Durchläufe nach Eingabe der Saat unter 5 Sekunden.

Taschenschieber

  • Gast
Re: WH(40K) Würfelscript | Jetzt auch als .exe
« Antwort #6 am: 21.04.2012 | 15:12 »
Wollt's dir ja auch gar nicht miesmachen, ging mir nur darum, ob du da eine Notwendigkeit siehst, es so anzugehen, oder du einfach nur Lust drauf hattest ;)

Offline Gasbow

  • Experienced
  • ***
  • Beiträge: 372
  • Username: Gasbow
Re: WH(40K) Würfelscript | Jetzt auch als .exe
« Antwort #7 am: 21.04.2012 | 15:29 »
Ich finde für einen Wüfelscript für 40k ist das genau angemessen ;)

Offline SeelenJägerTee

  • Legend
  • *******
  • Biomancer
  • Beiträge: 6.445
  • Geschlecht: Männlich
  • Username: SeelenJägerTee
Re: WH(40K) Würfelscript | Jetzt auch als .exe
« Antwort #8 am: 22.04.2012 | 17:44 »
So die Version 1.0 ist jetzt draußen.

Sie beinhaltet jetzt folgendes:
 - Umlaute sollten korrekt dargestellt werden.
 - Schriftfarbe kann geändert werden
(Klicke zum Anzeigen/Verstecken)
- MT kann sowohl mit Zahl als auch über die Systemzeit initialisiert werden.
 - ein verspätetes Easteregg


Falls ihr Fehler findet seid so gut und teilt sie mir mit.

[gelöscht durch Administrator]
« Letzte Änderung: 22.04.2012 | 18:00 von SeelenJägerTee »