Integration von Logik in Code
Verfasst: Dienstag 9. Mai 2023, 09:29
Hallo!
Ich bin absoluter Python-Anfänger... vielleicht kann mir daher jemand bei meinem Problem helfen:
Ich habe einen Code, bei dem jeweils zwei Bilder (Vereinswappen) von Sportmannschaften miteinander verglichen werden, wobei der Nutzer auswählen muss, welche Mannschaft besser ist. Dabei tritt jede Mannschaft gegen jede andere an und der Sieger bekommt einen Punkt. Nachdem alle Duelle abgeschlossen sind, wird eine Rangliste anhand der erzielten Punkte ausgegeben.
Das funktioniert bei wenigen Mannschaften ganz gut, doch wenn es mehr werden, kommt es zu einer Anzahl an Duellen, die für einen Nutzer nicht mehr zu bewerkstelligen ist. Daher möchte ich den Code so ändern, dass eine Art Logik integriert wird, dass "unnötige" Duelle, bei denen der Sieger anhand früherer Ergebnisse schon feststeht, ausgelassen werden und der bereits feststehende Sieger automatisch einen Punkt erhält.
Zum Beispiel: Mannschaft 1 gewinnt gegen Mannschaft 2, Mannschaft 3 gewinnt gegen Mannschaft 4 und Mannschaft 1 gewinnt gegen Mannschaft 3. Also ist klar, dass Mannschaft 1 auch gegen Mannschaft 4 gewinnt, weshalb dieses Duell ausgelassen werden soll. Das Ziel ist es, mit so wenigen Duellen wie möglich eine Rangliste zu erstellen. Kann mir bitte jemand helfen, den Code entsprechend zu ändern?
Mein Code lautet wie folgt:
import os
import random
from itertools import combinations
from tkinter import *
from PIL import ImageTk, Image
root = Tk()
root.title("Mannschaftsvergleich")
# Pfad zum Ordner mit den Bildern
folder_path = "D:/Mannschaftsvergleich/Vereinswappen"
# Liste der Bilddateien im Ordner
image_files = os.listdir(folder_path)
# Punkteliste für die Bilder
scores = {}
for image in image_files:
scores[image] = 0
# Erstellung der Label-Objekte
label1 = Label(root)
label2 = Label(root)
# Erstellung einer Liste aller möglichen Bildpaare
all_image_pairs = []
for i in range(len(image_files)):
for j in range(i+1, len(image_files)):
all_image_pairs.append((image_files, image_files[j]))
# Erstellung einer Kopie der Liste aller Bildpaare
image_pairs = all_image_pairs.copy()
# Fortschrittsanzeige definieren
total_pairs = len(all_image_pairs)
progress_label = Label(root, text="Fortschritt: 0/" + str(total_pairs) + " (0%)", font=("Arial", 12))
progress_label.pack()
# Funktion, die beim Klicken auf ein Bild aufgerufen wird
def select_image(event, selected_image):
global selected_images
scores[selected_image] += 1
# Rufe die Funktion zur Anzeige des nächsten Bildpaars auf
show_next_images()
# Funktion, die das nächste Bildpaar anzeigt
def show_next_images():
global label1, label2, selected_images
# Löschen der Label-Objekte
label1.destroy()
label2.destroy()
if not all_image_pairs:
print("Alle Bildpaare wurden geladen")
return
# Fortschrittsanzeige aktualisieren
progress = total_pairs - len(all_image_pairs)
progress_percent = int((progress / total_pairs) * 100)
progress_label.config(text="Fortschritt: " + str(progress) + "/" + str(total_pairs) + " (" + str(progress_percent) + "%)")
selected_images = random.sample(all_image_pairs, 1)[0]
all_image_pairs.remove(selected_images)
image1 = Image.open(folder_path + "/" + selected_images[0])
image2 = Image.open(folder_path + "/" + selected_images[1])
photo1 = ImageTk.PhotoImage(image1)
photo2 = ImageTk.PhotoImage(image2)
label1 = Label(root, image=photo1)
label2 = Label(root, image=photo2)
label1.image = photo1
label2.image = photo2
label1.pack(side=LEFT)
label2.pack(side=RIGHT)
label1.unbind("<Button-1>")
label2.unbind("<Button-1>")
root.bind("<Left>", lambda event: select_image(event, selected_images[0]))
root.bind("<Right>", lambda event: select_image(event, selected_images[1]))
all_image_pairs = []
for i in range(len(image_files)):
for j in range(i+1, len(image_files)):
all_image_pairs.append([image_files, image_files[j]])
show_next_images()
root.mainloop()
# Ausgabe der Punkteliste
print("Punkteliste:")
for image, score in sorted(scores.items(), key=lambda x: x[1], reverse=True):
print(image + ": " + str(score))
Ich bin absoluter Python-Anfänger... vielleicht kann mir daher jemand bei meinem Problem helfen:
Ich habe einen Code, bei dem jeweils zwei Bilder (Vereinswappen) von Sportmannschaften miteinander verglichen werden, wobei der Nutzer auswählen muss, welche Mannschaft besser ist. Dabei tritt jede Mannschaft gegen jede andere an und der Sieger bekommt einen Punkt. Nachdem alle Duelle abgeschlossen sind, wird eine Rangliste anhand der erzielten Punkte ausgegeben.
Das funktioniert bei wenigen Mannschaften ganz gut, doch wenn es mehr werden, kommt es zu einer Anzahl an Duellen, die für einen Nutzer nicht mehr zu bewerkstelligen ist. Daher möchte ich den Code so ändern, dass eine Art Logik integriert wird, dass "unnötige" Duelle, bei denen der Sieger anhand früherer Ergebnisse schon feststeht, ausgelassen werden und der bereits feststehende Sieger automatisch einen Punkt erhält.
Zum Beispiel: Mannschaft 1 gewinnt gegen Mannschaft 2, Mannschaft 3 gewinnt gegen Mannschaft 4 und Mannschaft 1 gewinnt gegen Mannschaft 3. Also ist klar, dass Mannschaft 1 auch gegen Mannschaft 4 gewinnt, weshalb dieses Duell ausgelassen werden soll. Das Ziel ist es, mit so wenigen Duellen wie möglich eine Rangliste zu erstellen. Kann mir bitte jemand helfen, den Code entsprechend zu ändern?
Mein Code lautet wie folgt:
import os
import random
from itertools import combinations
from tkinter import *
from PIL import ImageTk, Image
root = Tk()
root.title("Mannschaftsvergleich")
# Pfad zum Ordner mit den Bildern
folder_path = "D:/Mannschaftsvergleich/Vereinswappen"
# Liste der Bilddateien im Ordner
image_files = os.listdir(folder_path)
# Punkteliste für die Bilder
scores = {}
for image in image_files:
scores[image] = 0
# Erstellung der Label-Objekte
label1 = Label(root)
label2 = Label(root)
# Erstellung einer Liste aller möglichen Bildpaare
all_image_pairs = []
for i in range(len(image_files)):
for j in range(i+1, len(image_files)):
all_image_pairs.append((image_files, image_files[j]))
# Erstellung einer Kopie der Liste aller Bildpaare
image_pairs = all_image_pairs.copy()
# Fortschrittsanzeige definieren
total_pairs = len(all_image_pairs)
progress_label = Label(root, text="Fortschritt: 0/" + str(total_pairs) + " (0%)", font=("Arial", 12))
progress_label.pack()
# Funktion, die beim Klicken auf ein Bild aufgerufen wird
def select_image(event, selected_image):
global selected_images
scores[selected_image] += 1
# Rufe die Funktion zur Anzeige des nächsten Bildpaars auf
show_next_images()
# Funktion, die das nächste Bildpaar anzeigt
def show_next_images():
global label1, label2, selected_images
# Löschen der Label-Objekte
label1.destroy()
label2.destroy()
if not all_image_pairs:
print("Alle Bildpaare wurden geladen")
return
# Fortschrittsanzeige aktualisieren
progress = total_pairs - len(all_image_pairs)
progress_percent = int((progress / total_pairs) * 100)
progress_label.config(text="Fortschritt: " + str(progress) + "/" + str(total_pairs) + " (" + str(progress_percent) + "%)")
selected_images = random.sample(all_image_pairs, 1)[0]
all_image_pairs.remove(selected_images)
image1 = Image.open(folder_path + "/" + selected_images[0])
image2 = Image.open(folder_path + "/" + selected_images[1])
photo1 = ImageTk.PhotoImage(image1)
photo2 = ImageTk.PhotoImage(image2)
label1 = Label(root, image=photo1)
label2 = Label(root, image=photo2)
label1.image = photo1
label2.image = photo2
label1.pack(side=LEFT)
label2.pack(side=RIGHT)
label1.unbind("<Button-1>")
label2.unbind("<Button-1>")
root.bind("<Left>", lambda event: select_image(event, selected_images[0]))
root.bind("<Right>", lambda event: select_image(event, selected_images[1]))
all_image_pairs = []
for i in range(len(image_files)):
for j in range(i+1, len(image_files)):
all_image_pairs.append([image_files, image_files[j]])
show_next_images()
root.mainloop()
# Ausgabe der Punkteliste
print("Punkteliste:")
for image, score in sorted(scores.items(), key=lambda x: x[1], reverse=True):
print(image + ": " + str(score))