Test all game versions

This commit is contained in:
2025-08-06 12:36:47 +02:00
parent 5232310e3e
commit 1e0559f386

34
nimm.py
View File

@ -13,7 +13,10 @@ def optimal_move():
return n return n
return random.randint(1, 3) # Wenn keine perfekte Wahl, dann irgendein Zug return random.randint(1, 3) # Wenn keine perfekte Wahl, dann irgendein Zug
def ki_move(lastMove): def random_move():
return random.randint(1, 3)
def ki_move(lastMove, better_version):
global state global state
antiMoves = lostMoves.get(state) antiMoves = lostMoves.get(state)
if antiMoves == None: if antiMoves == None:
@ -26,6 +29,7 @@ def ki_move(lastMove):
return i + 1 return i + 1
# Es gibt keine guten Züge mehr, also muss der letzte Zug schlecht gewesen sein. # Es gibt keine guten Züge mehr, also muss der letzte Zug schlecht gewesen sein.
if better_version:
addLostMove(lastMove.state, lastMove.move) addLostMove(lastMove.state, lastMove.move)
return random.randint(1, 3) return random.randint(1, 3)
@ -44,13 +48,13 @@ def addLostMove(state, move):
moves.append(move) moves.append(move)
lostMoves[state] = moves lostMoves[state] = moves
def game(train): def game(train, opponent, better_version):
global state global state
state = 12 state = 12
lastMove = None lastMove = None
while True: while True:
# KI beginnt, sonst kann sie nicht gewinnen # KI beginnt, sonst kann sie nicht gewinnen
move = ki_move(lastMove) move = ki_move(lastMove, better_version)
lost = makeMove(move) lost = makeMove(move)
if lost: if lost:
if train: if train:
@ -58,7 +62,7 @@ def game(train):
return 0 # optimale Strategie hat gewonnen return 0 # optimale Strategie hat gewonnen
lastMove = Move(state + move, move) lastMove = Move(state + move, move)
move = optimal_move() move = opponent()
lost = makeMove(move) lost = makeMove(move)
if lost: if lost:
return 1 # KI hat gewonnen return 1 # KI hat gewonnen
@ -67,13 +71,19 @@ state = 12
lostMoves = {} lostMoves = {}
# train # train
for _ in range(1000): opponents = [random_move, optimal_move]
game(True) for ki_version in [False, True]:
for train_opponent in opponents:
for eval_opponent in opponents:
ki_text = "optimale Version" if ki_version else "erste Version"
print(f"KI: {ki_text} trainiert mit {train_opponent.__name__} und evaluiert mit {eval_opponent.__name__}")
for _ in range(1000):
game(train=True, opponent=train_opponent, better_version=ki_version)
# eval # eval
numberEvalGames = 100000 numberEvalGames = 100000
wonGames = 0 wonGames = 0
for _ in range(numberEvalGames): for _ in range(numberEvalGames):
wonGames += game(False) wonGames += game(False, opponent=eval_opponent, better_version=ki_version)
print(f"Die KI hat {wonGames / numberEvalGames * 100}% der Spiele gewonnen.") print(f"Die KI hat {wonGames / numberEvalGames * 100}% der Spiele gewonnen.\n")