Python :: Aufgabe #177

3 Lösungen Lösungen öffentlich

Auslosung der Figurenaufstellung beim Chess960

Anfänger - Python von hollst - 12.02.2018 um 18:33 Uhr
Beim Chess960, auch Fischer-Random-Chess genannt, wird die
Ausgangsposition der acht weißen Offiziere ausgelost, wobei
zwei Regeln zu beachten sind:

1.) der König muss zwischen den zwei Türmen stehen (damit Rochaden möglich bleiben) und
2.) die zwei Läufer müssen ungleichfarbig sein.

Die schwarzen Offiziere werden spiegelsymmetrisch angeordnet (Bild 1, Beispielaufstellung),
alle anderen Schachspielregeln bleiben erhalten.

Man schreibe ein (vorzugsweise GUI-) Programm, das diesen Auslosungsregeln entspricht und eine
der möglichen 960 zufälligen Startpositionen rückgibt.

Lösungen:

vote_ok
von Mot_Sonne (910 Punkte) - 18.02.2018 um 18:56 Uhr
Quellcode ausblenden Python-Code
from tkinter import *
from PIL import Image,ImageTk
import random
WIDTH,HEIGHT=40,40
#in directory with the code are the pictures-look wikipedia
#the bishops are always on a black and a white position
class Chess():
    def __init__(self):
        self.fenster=Tk()
        self.fenster.title("Chess")
        

        self.neu()
        
        self.fenster.mainloop()

    def neu(self):
        self.frame=Frame(self.fenster)

        search=True
        officers=["knight1","rook1","bishop1","knight2","rook2","bishop2","queen1","king1"]
        while search:
            king,bishops=False,False
            random.shuffle(officers)
            a,b=officers.index("bishop1"),officers.index("bishop2")
            if (a%2 and not b%2) or (b%2 and not a%2):
                bishops=True
            a,b,c=officers.index("rook1"),officers.index("rook2"),officers.index("king1")
            if (a<c and b>c) or (a>c and b<c):
                king=True
            if king and bishops:
                search=False
                
        self.whites,self.blacks=[],[]#must be referenced, otherwise pictures are not there
        x=0
        for officer in officers:
            officer=officer.rstrip("1")
            officer=officer.rstrip("2")
            img=Image.open(officer+'_white.png')
            img=img.resize(size=(WIDTH,HEIGHT))
            img=ImageTk.PhotoImage(img)
            self.whites.append(img)
            Label(self.frame,image=img).grid(column=x,row=0)
            img=Image.open(officer+'_black.png')
            img=img.resize(size=(WIDTH,HEIGHT))
            img=ImageTk.PhotoImage(img)
            self.blacks.append(img)
            Label(self.frame,image=img).grid(column=x,row=1)
            x+=1
        self.frame.pack(side=LEFT,expand=1)
Chess()
vote_ok
von Taitsu (60 Punkte) - 19.02.2018 um 03:18 Uhr
Quellcode ausblenden Python-Code
import random
Felder = [1,2,3,4,5,6,7,8]
TurmA = random.randrange(1,8)
Felder.remove(TurmA)
TurmB = random.choice(Felder)
while abs(TurmA - TurmB) == 1:
    TurmB = random.choice(Felder)

if TurmB < TurmA:
    TurmA,TurmB = TurmB,TurmA
    Felder.remove(TurmA)
else:
    Felder.remove(TurmB) 

König = random.randrange(TurmA+1,TurmB)
Felder.remove(König)
LäuferA = random.choice(Felder)
Felder.remove(LäuferA)
Feldneu=[]
if LäuferA % 2 == 0:
    for n in Felder:
        if n % 2 == 1:
            Feldneu.append(n)
    LäuferB = random.choice(Feldneu)
    Felder.remove(LäuferB)

else:
    for n in Felder:
        if n % 2 == 0:
            Feldneu.append(n)
    LäuferB = random.choice(Feldneu)
    Felder.remove(LäuferB)

Dame = random.choice(Felder)
Felder.remove(Dame)
SpringerA = random.choice(Felder)
Felder.remove(SpringerA)
SpringerB = Felder[0]
print('TurmA:',TurmA,'TurmB:',TurmB,'SpringerA:',SpringerA,'SpringerB:',SpringerB,'LäuferA:', LäuferA,'LäuferB:', LäuferB,'Dame:',Dame, 'König:',König)

vote_ok
von Kubayann (120 Punkte) - 18.04.2018 um 22:11 Uhr
Nur der reine Backendcode, hab leider noch keine Erfahrung mit GUI-Implementierung. Auch ist der Quelltext sehr lange. Höre mir gerne Verbesserungsvorschläge an.

Quellcode ausblenden Python-Code
import random
import more_itertools as mit

#Figuren zufällig aufstellen
def Auslosen():
    Figuren=["T","T","L","L","S","S","D","K"]
    random.shuffle(Figuren)
    return Figuren

#Abstand der beiden Läufer ermitteln
#Ungerade bedeutet verschiedene Farben
def AbstandLaeufer(n):
    LauferPos=list(mit.locate(n, lambda x: x == "L"))
    LaeuferAbs=LauferPos[1]-LauferPos[0]
    if LaeuferAbs%2==0:
        LaeuferBool=False
    else:
        LaeuferBool=True
    return LaeuferBool

#Position des Königs mit Türmen vergleichen
def Koenig(n):
    Turmposition=list(mit.locate(n, lambda x: x == "T"))
    Koenigposition=n.index("K")
    if (Koenigposition<Turmposition[0]) or (Koenigposition>Turmposition[1]):
        Ergebniskoe=False
    else:
        Ergebniskoe=True
    return Ergebniskoe

#Funktionen ausführen und Regeln beachten
def Aufrufen():
    Aufstellung=Auslosen()
    a=AbstandLaeufer(Aufstellung)
    b=Koenig(Aufstellung)
    if (a and b)==True:
        Ende=True
    else:
        Ende=False
    return [Ende,a,b,Aufstellung]

#Schleife bis Bedingung erreicht worden ist
while True:
    erg=Aufrufen()
    if erg[0]==True:
        print(erg)
        break
    else:
        continue