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()