The game of Nim . This is a well-known game with a number of variants. The follo
ID: 3548054 • Letter: T
Question
The game of Nim. This is a well-known game with a number of variants. The following variant has an interesting winning strategy. Two players alternately take marbles from a pile. In each move, a player chooses how many marbles to take. The player must take at least one but at most half of the marbles. Then the other player takes a turn. The player who takes the last marble loses.
Write a program in which the computer plays against a human opponent. Generate a random integer between 10 and 100 to denote the initial size of the pile. Generate a random integer between 0 and 1 to decide whether the computer or the human takes the first turn. Generate a random integer between 0 and 1 to decide whether the computer plays smart or stupid. In stupid mode the computer simply takes a random legal value (between 1 andn/2) from the pile whenever it has a turn. In smart mode the computer takes off enough marbles to make the size of the pile a power of two minus 1
Explanation / Answer
import java.util.Random;
public class Game
{
public static void main(String args[]) {
//declare variables
Pile marbles = new Pile();
Random random = new Random();
Player player1;
Player player2;
int marblesToRemove = 0; //determine who goes first
if(random.nextInt(2) == 0)
{
System.out.println("User goes first ");
player1 = new Player(2);
player2 = new Player();
}
else
{
System.out.println("Computer goes first ");
player1 = new Player();
player2 = new Player(2);
}
//keep going until all the marbles are gone
while(marbles.getMarbles() > 0)
{
//check if player two wins
if(marbles.getMarbles() == 1)
{
System.out.println("Player 2 Wins!!!");
break;
}
//prompt/calculate number of marbles to remove
System.out.println("Number of marbles left: " + marbles.getMarbles());
System.out.println("Player 1's turn:");
marblesToRemove = player1.chooseNextMove(marbles.getMarbles());
System.out.println("Player 1 removed " + marblesToRemove);
System.out.println();
//remove the marbles
marbles.removeMarbles(marblesToRemove);
//check if player one wins
if(marbles.getMarbles() == 1)
{
System.out.println("Player 1 Wins!!!");
break;
}
//prompt/calculate number of marbles to remove
System.out.println("Number of marbles left: " + marbles.getMarbles());
System.out.println("Player 2's turn:");
marblesToRemove = player2.chooseNextMove(marbles.getMarbles());
System.out.println("Player 2 removed " + marblesToRemove);
System.out.println();
//remove marbles
marbles.removeMarbles(marblesToRemove);
}
}
}
import java.util.Random;
public class Pile
{
//fields
int numMarbles = 0;
//generate the number of marbles
public Pile()
{
Random random = new Random();
numMarbles = random.nextInt(89) + 11;
}
//get method
public int getMarbles()
{
return numMarbles;
}
//remove method
public void removeMarbles(int marblesToRemove)
{
numMarbles -= marblesToRemove;
}
}
import java.util.Random;
import java.util.Scanner;
public class Player
{
int playerType = 0;
// 0 dumb, 1 smart, 2 player
Random random = new Random();
Scanner input;
//constructor where player type is specified
public Player(int type)
{
if (type < 0 || type > 2)
playerType = 2;
else
playerType = type;
input = new Scanner(System.in);
}
//constructor where player type is specified
public Player()
{
playerType = random.nextInt(2);
input = new Scanner(System.in);
}
//pick next move
public int chooseNextMove(int marblesLeft)
{
//setup variables
int marblesToRemove = 0;
//remove the second to last marble
if(marblesLeft == 3)
return 1;
//if dumb, pick random number
if(playerType == 0)
{
marblesToRemove = random.nextInt((marblesLeft/2) - 1) + 1;
}
//if smart get to specific numbers
else if (playerType == 1)
{
if(marblesLeft > 63)
marblesToRemove = marblesLeft - 63;
else if(marblesLeft > 31)
marblesToRemove = marblesLeft - 31;
else if(marblesLeft > 15)
marblesToRemove = marblesLeft - 15;
else if(marblesLeft > 7)
marblesToRemove = marblesLeft - 7;
else if(marblesLeft > 3)
marblesToRemove = marblesLeft - 3;
else if(marblesLeft == 2)
marblesToRemove = 1;
//pick random number
else
marblesToRemove = random.nextInt((marblesLeft/2) - 1 ) + 1;
}
else
{
//prompt user
System.out.println("Please enter a number of marbles to remove between 1 and " + (marblesLeft / 2));
marblesToRemove = input.nextInt();
//error check
while(marblesToRemove > marblesLeft / 2 || marblesToRemove < 0)
{
System.out.println("That is not a valid entry, please try again (1 - " + (marblesLeft / 2) + ")");
marblesToRemove = input.nextInt();
}
}
//return values
return marblesToRemove;
}
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.