Source code for playing.cli.play

"""Play an interactive Nim Game in the CLI
"""


from source.core import Nim
from source.typedefs import Move
from source.playing.cli import ansi


[docs]def playCLI() -> None: """Play one interactive game Create random heaps first. Then, get the user to select who to start. Player and Computer take turns until the game ends. Computer will make good or bad decisions based on the error rate set in the instance attribute. """ #create instance and random heaps, then display them nim = Nim() nim.setup_heaps() print(nim.get_heapstatus()) #by default there is no error in input errormsg = '' #loop on getting the Computer error rate requirement while True: errorrate = input( f'{errormsg}Computer error rate % [10]: ' ) or '10' ansi.clean_prev_line() try: errorrate = int(errorrate) if not (0<=errorrate<=100): raise ValueError('Expecting % between 0 and 100') #set the error rate nim.set_error_rate(errorrate) except Exception as e: errormsg = str(e) + '; ' else: errormsg = '' break #loop on getting the first move requirement while True: moveby = input( f'{errormsg}First move by? (Auto, Random, Computer, Player) [a]: ' ) or 'a' ansi.clean_prev_line() try: #init compturn automatically nim.set_start(moveby) except ValueError as e: errormsg = str(e) + '; ' else: errormsg = '' break #initiate the last move string lastmovestr = 'a1' #do moves in a loop, until game end while not nim.game_end(): if nim.activeplayer == 'Computer': #make a good decision? if nim.make_good_choice(): #figure out the best move move = nim.figure_out_best_move() else: #set a random (most probably not good) move move = nim.get_random_move() else: while True: movestr = input( f'{errormsg}Heap?/Coins? [{lastmovestr}]: ' ) or lastmovestr ansi.clean_prev_line() if not len(movestr): continue heapletter = movestr[:1] try: removecount = int(movestr[1:]) except ValueError: continue if removecount < 0: continue move = Move(heapletter, removecount) lastmovestr = movestr break try: nim.do_move(move) errormsg = '' except ValueError as e: errormsg = str(e) + '; ' continue print(nim.get_heapstatus()) #The active player won after the last coin was taken by the opponent print(f'{nim.activeplayer} won')