Artificial intelligence is the subdiscipline of Computer Science that focuses on how to get the computer to do this that we consider intelligent. This includes learning, understanding human language, emulating human expertise and playing games of strategy.
Nim is a simple example of such a game. There are seven sticks on the table. A player can pick up either 1, 2 or 3 at a time. whoever picks up the last stick loses. Therefore, the goal is to leave exactly one stick for your opponent.
You will find below a program written in Java to play Nim. Enter the program, and run it. Try to find the one strategy that will let you beat the computer. You will turn in a listing of Nim and how you beat it. If you couldn't beat it, give the deatils of how you played and why you lost.
import java.util.Scanner;
public class Nim2 {
// Play the game Nim against the computer
public static void main(String[] args) {
Scanner keyb = new Scanner(System.in);
int sticksLeft = 7, pickUp = 0, reply = 0;
boolean winner = false, move;
char answer = ' ';
String answerString = new String();
printInstructions();
// Find out if the user wants to go first or
// second
while (answer != 'f' && answer != 'F'
&& answer != 's' && answer != 'S') {
System.out.println
("Do you wish to go (f)irst or"
+ " (s)econd ?");
answerString = keyb.next();
answer = answerString.charAt(0);
}
// If the user goes second, have the computer
// take two sticks.
if (answer == 's' || answer == 'S') {
reply = 2;
sticksLeft = sticksLeft - reply;
System.out.println("The computer took "
+ reply + " sticks leaving "
+ sticksLeft + " on the table.");
}
// If the user goes first, tell him how many
// sticks are on the table
else
System.out.println("There are " + sticksLeft
+ " on the table.");
// As long as there is no winner, keep playing
while (!winner) {
pickUp = getMove(keyb, sticksLeft);
// Take the sticks off the table
sticksLeft = sticksLeft - pickUp;
//See if the user won
if (sticksLeft == 1) {
System.out.println
("Congratulations! You won!");
winner = true;
}
// See if the user lost
else if (sticksLeft == 0) {
System.out.println
("Sorry, the computer has "
+ "won - you have lost...");
winner = true;
}
else
reply = planMove(sticksLeft);
if (!winner)
sticksLeft
= updateSticks(sticksLeft, reply);
}
}
// printInstructions() - Print instructions for
// the player
public static void printInstructions() {
// Print the instructions
System.out.println
("There are seven (7) sticks on the table.");
System.out.println
("Each player can pick up one, two , or"
+ " three sticks");
System.out.println
("in a given turn. A player cannot pick "
+ "up more than");
System.out.println
("three stick nor can a player pass.\n");
}
// getMove() - Get the player's next move,
// testing to ensure that it is legal
// and that there are enough sticks
// on the table.
public static int getMove(Scanner keyb,
int sticksLeft) {
int pickUp = 0;
boolean move = false;
// How many sticks is the user taking
while (!move) {
System.out.println("How many sticks do you "
+ " wish to pick up ?");
pickUp = keyb.nextInt();
// Make sure its 1, 2 or 3
if (pickUp < 1 || pickUp > 3)
System.out.println(pickUp
+ " is not a legal number of sticks");
//Make sure that there are enough sticks on
// the table
else if (pickUp > sticksLeft)
System.out.println("There are not "
+ pickUp + " sticks on the table");
else
move = true;
}
return pickUp;
}
// planMove() - Plan the computer's next move
public static int planMove(int sticksLeft) {
int reply = 0;
// Plan the computer's next move
if (sticksLeft == 6 || sticksLeft == 5
|| sticksLeft ==2)
reply = 1;
else if (sticksLeft == 4)
reply = 3;
else if (sticksLeft == 3)
reply = 2;
return reply;
}
// updateSticks() - Update the count of sticks
// left on the table and
// determine if either the
// player or the computer has
// won.
public static int updateSticks(int sticksLeft,
int reply) {
// If neither player won, get ready for the
// next move
sticksLeft = sticksLeft - reply;
System.out.println("The computer picked up "
+ reply + " sticks.");
System.out.println("There are now "
+ sticksLeft
+ " sticks left on the table.\n\n\n");
return sticksLeft;
}
}