Meinung zu meiner Lernaufgabe
Verfasst: Dienstag 31. Oktober 2023, 20:29
Ich bin gerade dabei mittels der "Bootstrap Academy" Python zu lernen und habe meine erste Lernaufgabe endlich fertig (also "fertig" im Sinne von, jetzt kann man es hoffentlich anderen zumuten) und falls jemand Bock hat sich das zu geben könnte ich etwas Feedback dazu gebrauchen.
Code: Alles auswählen
import random
class Player:
def __init__(self, id, name, symbol):
self.id = id
self.name = name
self.symbol = symbol
self.automatic = False
class Field:
def __init__(self, id, name):
self.id = id
self.name = name
self.content = " "
class Board:
fields = []
fields.append(Field(1, "oben links"))
fields.append(Field(2, "oben mitte"))
fields.append(Field(3, "oben rechts"))
fields.append(Field(4, "mitte links"))
fields.append(Field(5, "mitte"))
fields.append(Field(6, "mitte rechts"))
fields.append(Field(7, "unten links"))
fields.append(Field(8, "unten mitte"))
fields.append(Field(9, "unten rechts"))
players = []
players.append(Player(1, "Spieler 1", "X"))
players.append(Player(2, "Spieler 2", "O"))
current_player = players[0].id
gameover = False
winner = 0
def change_player(self, id, new_name, new_symbol, automatic = False):
self.players[id - 1].name = new_name
self.players[id - 1].symbol = new_symbol
self.players[id - 1].automatic = automatic
def gen_list_free_fields(self, with_name = False):
if not with_name:
for field in self.fields:
if field.content == " ":
yield field.id
else:
for field in self.fields:
if field.content == " ":
yield (str(field.id) + ": " + str(field.name))
def print_board(self):
print("+---+---+---+")
print(f'| {self.fields[0].content} | {self.fields[1].content} | {self.fields[2].content} |')
print("+---+---+---+")
print(f'| {self.fields[3].content} | {self.fields[4].content} | {self.fields[5].content} |')
print("+---+---+---+")
print(f'| {self.fields[6].content} | {self.fields[7].content} | {self.fields[8].content} |')
print("+---+---+---+")
def make_selection(self):
self.print_board()
selection_is_valid = False
while not selection_is_valid:
print("Die folgenden Auswahl steht zur Verfügung:")
for field in list(self.gen_list_free_fields(True)):
print(field)
print("10: Um das Spiel zu beenden")
if self.current_player == self.players[0].id:
print(f'{self.players[0].name} wähle ein Feld aus (bitte Zahl eingeben):')
else:
print(f'{self.players[1].name} wähle ein feld aus (bitte Zahl eingeben):')
try:
player_selection = int(input())
except ValueError:
player_selection = -1
if player_selection == 10:
exit()
for field in self.fields:
if player_selection == field.id and field.content == " ":
selection_is_valid = True
break
if not selection_is_valid:
print("Deine Auswahl ist ungültig!")
return player_selection - 1
def make_automatic_selection(self):
danger = 0
if self.current_player == self.players[0].id:
opponent_symbol = self.players[1].symbol
else:
opponent_symbol = self.players[0].symbol
win1 = [self.fields[0], self.fields[1], self.fields[2]]
win2 = [self.fields[3], self.fields[4], self.fields[5]]
win3 = [self.fields[6], self.fields[7], self.fields[8]]
win4 = [self.fields[0], self.fields[3], self.fields[6]]
win5 = [self.fields[1], self.fields[4], self.fields[7]]
win6 = [self.fields[6], self.fields[7], self.fields[8]]
win7 = [self.fields[0], self.fields[4], self.fields[8]]
win8 = [self.fields[2], self.fields[4], self.fields[6]]
allwins = [win1, win2, win3, win4, win5, win6, win7, win8]
for wins in allwins:
for field in wins:
if field.content == opponent_symbol:
danger = danger + 1
if danger > 1:
for field in wins:
if field.content == " ":
return field.id - 1
danger = 0
return random.choice(list(self.gen_list_free_fields())) - 1
def make_turn(self):
if self.current_player == self.players[0].id:
if self.players[0].automatic == True:
self.fields[self.make_automatic_selection()].content = self.players[0].symbol
else:
self.fields[self.make_selection()].content = self.players[0].symbol
self.current_player = self.players[1].id
else:
if self.players[1].automatic == True:
self.fields[self.make_automatic_selection()].content = self.players[1].symbol
else:
self.fields[self.make_selection()].content = self.players[1].symbol
self.current_player = self.players[0].id
def check_gameover(self):
win1 = [self.fields[0], self.fields[1], self.fields[2]]
win2 = [self.fields[3], self.fields[4], self.fields[5]]
win3 = [self.fields[6], self.fields[7], self.fields[8]]
win4 = [self.fields[0], self.fields[3], self.fields[6]]
win5 = [self.fields[1], self.fields[4], self.fields[7]]
win6 = [self.fields[6], self.fields[7], self.fields[8]]
win7 = [self.fields[0], self.fields[4], self.fields[8]]
win8 = [self.fields[2], self.fields[4], self.fields[6]]
allwins = [win1, win2, win3, win4, win5, win6, win7, win8]
for wins in allwins:
if all(item.content == self.players[0].symbol for item in wins):
self.gameover = True
self.winner = self.players[0].id
break
elif all(item.content == self.players[1].symbol for item in wins):
self.gameover = True
self.winner = self.players[1].id
break
if not self.gameover and all(field.content != " " for field in self.fields):
self.gameover = True
self.winner = 0
def run(self):
while not self.gameover:
self.make_turn()
self.check_gameover()
self.print_board()
if self.winner == self.players[0].id:
print(f'{self.players[0].name} hat gewonnen!')
elif self.winner == self.players[1].id:
print(f'{self.players[1].name} hat gewonnen!')
elif self.winner == 0:
print("Leider hat niemand gewonnen.")
if __name__ == "__main__":
board = Board()
print("Wie viele menschliche Spieler?:")
correct_choice = False
while not correct_choice:
try:
amount_players = int(input())
except ValueError:
amount_players = -1
if not amount_players < 0 and not amount_players > 2:
correct_choice = True
else:
print("Die Auswahl war ungültig, bitte gültige Auswahl eingeben.")
match amount_players:
case 0:
board.change_player(1 ,"Computer 1", "X", True)
board.change_player(2 ,"Computer 2", "O", True)
case 1:
board.change_player(2 ,"Computer", "O", True)
board.run()