Lab #9: Get the various points in this lab checked off by a TA during the week of 25 November. More Progress on Project. 1. Get HumanPlayer working, and try playing running two instances of java ataxx (with human players) against each other (in two shells). You can also play against the staff program (ataxx) with this. The --dump-in and --dump-out options on the staff program allow you to look at the messages going to and from your program. 2. Now implement MachinePlayer, and try to get --opp=m and --player=rm working properly. Start with a REALLY simple-minded MachinePlayer that picks any random move. 3. Arrange that when --player=Cm, (C=r or b), a proper transcript is printed. 4. How can you test all of this? Consider the following: a. The staff program will send back 'error' if you make an erroneous move. Your program can treat this as a fatal error. b. The staff program will always respond identically if started with the same seed. c. When you exit your program with System.exit(N), the program terminates and reports an "exit code" of N to the shell that started it. N==0 means (by convention) normal exit. The Bourne shell (which is the language used in test1.cmd in the initial project handout) has a syntax if COMMAND; then # That semicolon is IMPORTANT! echo "OK" # or any other command(s) else echo "BAD" # or any other command(s) fi That executes the 'then' clause if COMMAND returns a normal (0) exit code, and the else part otherwise. d. You can suppress output to the standard output from any command with COMMAND > /dev/null in the Bourne shell. You can suppress all output (to standard output and standard error) with the (rather cryptic) COMMAND > /dev/null 2>&1 e. Put these together to write a bunch of command scripts that simply run your program against the staff program (or against itself) when you type 'make check', such that each test simply prints OK or BAD, appropriately.