Moin,
zuerst mal zur Formel 'int(math.ceil(math.log(x, y)))' :
Da merke ich einschneidend, dass ich damals in der Schule wohl nicht allzu gut aufgepasst habe... Allerdings, soweit ich mich erinnern kann, haben wir Logarithmik damals in der 10. auch schon gar nicht mehr gehabt...
Danke für eure Erklärungen, ich denke, jetzt sollte soweit alles klar sein. Man stellt sich alles immer schwerer vor als es in Wirklichkeit vielleicht ist...
log(81, 3) würde (in diesem Fall) also eine glatte 3 ergeben. Wobei log(82, 3) als Ergebnis 3.037037... ergeben würde, weswegen dann mit der Funktion ceil() jede angefangene neue Zahl (0.00 bis 1.00 = 1. natürliche Zahl, 1.00 bis 2.00 = 2. nZ, 2.00 bis 3.00 = 3. nZ, 3.00-4.00000...1 = 4. "angebrochene Zahl" -> über ceil() interpretiert also = 4) auf die bereits angebrochene nächste Zahl aufgerundet wird - toll!
Folglich ist jede natürliche Zahl bis 1024 mit y = e^10 zu ermitteln, wobei für eine Zahl bis 2048 e^11 oder y = 11 gilt - das ist wirklich interessant, dass so mal zu sehen.
Ich glaube, ich werde den Begriff "Logarithmik" so schnell also nicht mehr vergessen, schön! Wofür Python alles gut ist...!
Ich muss jedoch auch hier noch kurz gestehen, dass ich bei meiner eigens erstellten Funktion (der lange Weg...) an das potenzieren überhaupt nicht gedacht habe, was sich wahrscheinlich an der Funktion bisect() auch einfach ablesen lässt.
Die Funktion über itertools.count habe ich schnell mal getestet. Rausgekommen ist bei mir für jede Berechnung im Endeffekt 'y = x**(b+1)', sprich für den Bereich 128 kam y = 8 heraus, ebenso für 127.Ich habe die Funktion dann "fachmännisch" folgendermaßen abgeändert, wobei das Ergebnis dann jedoch richtig ausgegeben wurde:
Code: Alles auswählen
def calculate_max_trials(n):
for i in itertools.count(1):
if n <= 1 + 1:
return i
n /= 2
Damit war das Ergebnis dann richtig. Für n = 128 also mathematisch ausgedrückt -> y = 2^7; für n = 129 -> y = 2 ^ 8, wobei 7 bzw. 8 hier jeweils 'b' sind, also das gesuchte Ergebnis.
Da ich das alles kurz im Terminal durchgeführt habe, ist es nicht als Datei gespeichert.
[Entwurf zwischengespeichert bis hierher: heute Nachmittag bei der Arbeit]
Ich habe mir eben noch kurz die englischen Documents auf python.org für itertools angeschaut, dort insbesondere count(). Daraufhin habe ich die Funktion folgendermaßen abgeändert:
Code: Alles auswählen
def calculate_max_trials(n):
for i in itertools.count(0, 1):
if n <= 1:
return i
n /= 2
Auf die beiden Parameter für .count bin ich über die Doc's gestoßen, sie stehen (was ich euch sicherlich nicht zu erzählen brauche...) für start = 0 und step = 1. Python hat .count(1) vermutlich als .count(start=1) interpretiert. Was dann für step genommen wurde, entzieht sich meiner Kenntnis, evtl. die 0 ? Ich weiß es allerdings nicht...
Meine `load_sounds()' - Funktion habe ich noch nicht ganz fertig. Die anderen Änderungen lade ich hier aber schonmal Funktionsweise hoch. Wo die Änderung minimal, die Funktion aber größer war, nenne ich kurz die Änderung.
___________________________________________________________________
ELSE_STR & EXCEPT_STR beginnen nun bei 0 und sind nummeriert bis 3.
Code: Alles auswählen
def random_str(dictionary):
'''Diese Funktion dient zur Zufallsausgabe eines else / except - Strings.
Als Grundlage dienen zwei Listen. Die Auswahl einer Liste erfolgt über
den Parameter (dictionary).'''
if dictionary == 1:
string = random.choice(ELSE_STR)
elif dictionary == 2:
string = random.choice(EXCEPT_STR)
print(string)
Code: Alles auswählen
def text_render(fast_text, beg, end):
'''Liest eine Datei ein und gibt die benötigten Zeilen wieder.
Zeilen sind einzeln ab 0 aufzurufen.
Die letzte auszugebende Zeile in einem Block ist stets um den Wert 1 zu
erhöhen.'''
if fast_text == 1:
delay = 0.000064
else:
delay = 1.6
try:
with open("guess.txt", "r") as textfile:
text_lines = textfile.read().split("\n")
li = []
for line in text_lines:
if line:
sep_list = line.split(";")
li.append(sep_list[0])
for line in range(beg, end):
print(li[line])
time.sleep(delay)
except IOError:
textfile = 0
print()
print()
print('''Dateizugriff nicht erfolgreich!
Hinweis: Datei "guess.txt" fehlt!
Programm wird beendet ...''')
time.sleep(3)
quit()
finally:
if textfile is True:
textfile.close()
else:
print()
^-- Hier bin ich mir nicht sicher, ob das nun richtig ist, sprich ob ich nun direkt über textfile iteriert habe, oder ob ich das ganze so umschreiben soll, dass die Liste gar nicht mehr gebraucht wird ...
'Import math'
'from math import ceil, log'
Die Funktion 'bisect(cipher_band)' habe ich erstmal so stehen lassen, alle Zeilen bis auf den DocString jedoch gelöscht und dafür die Formel eingefügt: 'return int(math.ceil(math.log(cipher_band, 2)))'
Die sound_on Flags hätte ich im Grunde auch noch gleich auf True / False geändert, habe ich aber noch nicht. Kommt natürlich noch.
Bzw., ich arbeite vorerst noch an meiner eigenen Idee bzgl. der load_sounds(), die ist zwar "ein wenig" komplizierter als der von dir vorgeschlagene Weg (@BlackJack), und benötigt auch die Flags für sound_on...
Sobald die aber steht und *richtig* (= wie gewollt) funktioniert, werde ich wohl deinen Vorschlag umsetzen. Der scheint wohl um einiges "leichter" (und sinnvoller...) zu sein. Dennoch möchte ich gerne erst noch meine eigene Idee mal wenigstens kurz zum funktionieren bringen.
Wie gesagt, an der 'load_sounds'-Funktion arbeite ich noch. Wenn die steht, werde ich die 'play_sound'-Funktion noch miteinbauen. Die Baustelle ist aber vorerst die 'load_sounds'. Ich denke, insgesamt sollte es jedoch machbar sein. Vorschweben tut mir auch (sobald die Ausgabe richtig funktioniert, momentan wird zwar der erste Dict-Value bei fehlen einer Datei ausgegeben, jedoch ist das natürlich nicht immer auch der richtige / einzige...), die fehlende Datei bzw. die fehlenden Dateien in eine .txt zu schreiben, die im Falle eines except pygame.error in der 'load_sounds' gleich mitgeneriert wird.
Es ist zwar
1. naiv zu glauben, dass irgendwer mal das Spielchen wirklich interessant finden sollte, und es daher mal irgendwann von GitHub runterladen sollte, und
2. noch naiver zu glauben, dass es irgendwen interessieren würde, welche Datei denn da nun eigentlich fehlt und diese Datei dann im Internet suchen, runterladen und in seinen Ordner kopieren würde, Aber:
Darum geht es ja auch gar nicht
Es würde dann also bei einem fehlerhaften Laden irgendeiner Datei eine .txt im selben Ordner wo das Hauptprogramm wäre erstellt, welche einen vorgeschriebenen Text plus eine Fehlerausgabe enthielte, in der aufgelistet würde, welche Dateien enthalten und welche fehlen würden.
Außerdem könnte in dieses file auch reingeschrieben werden, wo die fehlende Datei nachzubesorgen ist
Dieses file würde natürlich nur erstellt, sofern tatsächlich das fehlen einer benötigten Datei festgestellt würde. Ansonsten merkt der Nutzer von all dem natürlich auch nichts.
edit:
Code: Alles auswählen
import pygame
import time
pygame.mixer.init()
SOUND_FILES = {'noticed': 'signatur-Dil-7491_hifi.mp3',
'bkgrnd_people': 'People_T-Doogens-8720_hifi.mp3',
'win': 'Applause-SFXsourc-9027_hifi.mp3',
'check': 'plim-Gato_pre-7790_hifi.mp3'
}
KEY_DICT = {0: 'signatur-Dil-7491_hifi.mp3',
1: 'People_T-Doogens-8720_hifi.mp3',
2: 'Applause-SFXsourc-9027_hifi.mp3',
3: 'plim-Gato_pre-7790_hifi.mp3'
}
while True:
try:
response_snd = int(input('SOUND aktivieren? [1] JA | [0] NEIN '))
if response_snd == 1:
try:
pygame.mixer.music.load(SOUND_FILES['noticed'])
pygame.mixer.music.load(SOUND_FILES['bkgrnd_people'])
pygame.mixer.music.load(SOUND_FILES['win'])
pygame.mixer.music.load(SOUND_FILES['check'])
print('Sounddateien erfolgreich geladen ...')
sound_on = 1
time.sleep(0.4)
break
except pygame.error:
print('Sounddatei(en) nicht gefunden !')
keys = KEY_DICT.keys()
key_dict_top = max(KEY_DICT)
for key_nr in KEY_DICT:
try:
pygame.mixer.music.load(KEY_DICT[key_nr])
except pygame.error:
print('DATEI "{}" FEHLT !'.format(KEY_DICT[key_nr]))
print('''Behebung des Fehlers:
"{}" im WWW suchen ...'''.format(KEY_DICT[key_nr]))
print('Datei in den Spiel-Ordner kopieren ...')
time.sleep(3)
print('Spiel wird ohne Sound fortgesetzt ...')
sound_on = 0
time.sleep(3)
break
break
elif response_snd == 0:
sound_on = 0
break
else:
print('''Bestätige [1] um den Sound zu aktivieren
[0] deaktiviert die Soundausgabe!''')
except ValueError:
print('''Bestätige [1] um den Sound zu aktivieren
[0] deaktiviert die Soundausgabe ...''')
Ausgangslage:
eine Datei fehlt -> Dateiname wird richtig benannt
zwei Dateien fehlen -> Es wird lediglich der erste in der Liste erkannte fehlende Datei benannt. Der Rest steht im Code.
Ich habe auch eine andere Version, in der die Schleifenbearbeitung bei der ersten gefundenen fehlenden Datei stehen bleibt bzw. sich endlos an der Stelle wiederholt.
Sicher lässt sich das noch so modifizieren, so dass es läuft...also die erste, zweite und jede weitere fehlende Datei benannt wird. Ich habe da aber nun ein wenig dran gesessen und ich glaube, ich werde für heute Schluß machen und mich dann als nächstes an die von dir (@ BlackJack) vorgeschlagene Rangehensweise versuchen.
Da lohnt sich dann auch der Zeitaufwand, da es die anscheinend richtige Rangehensweise ist.
Mit Sicherheit würde ich es noch irgendwie hinbekommen, irgendwann würde es wohl wie gewollt funktionieren, aber: was bringt es mir? Ich werde am Ende eh auf die von dir vorgeschlagene Rangehensweise umswitchen, von daher also in erster Linie Zeitverlust.
Hab es nur mal schnell der Vollständigkeit halber gepostet. Der Code ist falsch und funktioniert nicht wie er eigentlich soll. Ich werde also auf die andere Methode mit der frisch zu erstellenden Liste (bei no_sound je sound_file = None) versuchen einzugehen. Mal sehen, wie's da läuft... Die Komplexität mit den SoundFlags umgehe ich damit, wie von dir beschrieben, ja auch direkt.