public interface Game Note interface in place of class pl
public interface Game // Note *interface* in place of *class*
 {
         /// play the game and return the final score
         /// where a higher score should be better,
         /// and a negative score is allowed.
         int play(); // Note semicolon in place of a body
                                 // You can have multiple method headings declared
 }
 --------------------------------------------------------------------------------------------------------------
  import java.util.*;
/// Starting point for Interface Lab.
 public class PlayGames
 {
         private static Scanner in;
         private static Random rand = new Random();
         private static int gameCount = 0;
        public static Game popRandom(Game[] g)
         {
                 int n = gameCount;
                 int i = rand.nextInt(n);
                 Game ret = g[i];
                 g[i] = g[n-1];
                 gameCount--;
                 return ret;
         }
        public static void main(String[] args)
         {
                 Game[] games = new Game[10]; // Note Game as a type
                 games[gameCount] = new AdditionGame(rand, 100);
                 gameCount++; // next index to put a Game at
                 // write at least 2 more different types of Game classes
                 // and add a new one of each type to games
                 // ...
                  
                  in = new Scanner(System.in);
                 int totScore = 0;
                 do {
                         Game g = popRandom(games);
                         totScore += g.play(); // use numerical result from the game
                 } while (gameCount > 0 && agree(\"Want a game? \"));
                 System.out.println(\"Thanks for Playing!\");
                 System.out.println(\"Your total score is \" + totScore);
         }
        
         public static boolean agree(String prompt)
         {
                 System.out.print(prompt);
                 String input = in.next();
                 if (input.equalsIgnoreCase(\"y\")) return true;
                 return false;
         }
 ----------------------------------------------------------------------------------------------------------------------
  import java.util.*;
public class AdditionGame implements Game // note implements!!
 {
         private Random rand;
         private int n;
        // Constructor for objects of class AdditionGame
         public AdditionGame(Random r, int big)
         {
                 rand = r;
                 n = big;
         }
        
         // play all games and keep score.
         public int play() // exactly matches heading in Game interface
         {
                 final int numGames = 3;
                 Scanner in = new Scanner(System.in);
                 int score = 0;
                 System.out.println(\"Welcome to the addition game! We\'ll now play \" + numGames + \" rounds.\");
                 for (int i = 0; i < numGames; i++) {
                         int x = rand.nextInt(n), y = rand.nextInt(n), ans = x+y;
                         System.out.print(String.format(\"Enter the sum: %d + %d = \", x, y));
                         int val = in.nextInt();
                         if (ans == val) {
                                 System.out.println(\"Correct!\");
                                 score++;
                         }
                         else
                                 System.out.println(\"Wrong! Right answer is \" + ans);
                 }
                 System.out.println(\"Thanks for playing the addition game. Your score is \" + score + \".\");
                 System.out.println();
                 return score;  
         }
 }
 -----------------------------------------------------------------------------------------------------------------------
Create two classes that implement a Game interface:
------------------------------------
There is a Game interface defined, and also a PlayGames class that uses objects from classes that implement that interface. The Game interface declares a single abstract method play that returns an int, the score from playing the game, where bigger is better.
-------------------------------------
PlayGames creates and stores Game objects in a Game[] and uses a popRandom method to randomly choose one of the games to play next by running that object’s play method.
------------------------------------
There is an example of one such game, AdditionGame, that implements the Game interface. PlayGames creates an AdditionGame object and stores it in the Game[] array.
--------------------------------------------
You must write at least 2 more classes that implement Game, store objects from those classes in the Game[] array in PlayGames, and run PlayGames to test that they work. You will test them manually by interacting with PlayGames, not by writing specific tests in a main method.
Solution
Please follow the code and comments for description :
CODE :
PlayGames.java :
import java.util.*;
// Starting point for Interface Lab.
 public class PlayGames {
    private static Scanner in;
     private static Random rand = new Random();
     private static int gameCount = 0;
    public static Game popRandom(Game[] g) { // pop the game to get the random game
         int n = gameCount;
         int i = rand.nextInt(n);
         Game ret = g[i];
         g[i] = g[n - 1];
         gameCount--;
         return ret;
     }
    public static void main(String[] args) { // driver method
         Game[] games = new Game[10]; // Note Game as a type
         games[gameCount] = new AdditionGame(rand, 100); // add the game of addition
         gameCount++; // increment the count
         games[gameCount] = new SubtractionGame(rand, 100); // add the game of subtraction
         gameCount++; // increment the count
         games[gameCount] = new MultiplicationGame(rand, 100); // add the game of multiplication
         gameCount++; // increment the count
       
         in = new Scanner(System.in); // get the value from the user
         int totScore = 0;
         do {
             Game g = popRandom(games); // get the random value
             totScore += g.play(); // use numerical result from the game
         } while (gameCount > 0 && agree(\"Want a game? \")); // prompt for the user
         System.out.println(\"Thanks for Playing!\");
         System.out.println(\"Your total score is \" + totScore); // print the total score
     }
    public static boolean agree(String prompt) {
         System.out.print(prompt);
         String input = in.next();
         if (input.equalsIgnoreCase(\"y\")) {
             return true;
         }
         return false;
     }
 }
 Game.java :
public interface Game // Note *interface* in place of *class*
 {
     int play();
 }
 MultiplicationGame.java :
import java.util.Random; // imports for the code to run
 import java.util.Scanner;
public class MultiplicationGame implements Game { // class that runs the code and implements the interface
    private Random rand; // instance variables
     private int n;
    public MultiplicationGame(Random r, int big) { // constructor
         rand = r;
         n = big;
     }
    @Override
     public int play() { // implemented classes
         final int numGames = 3;
         Scanner in = new Scanner(System.in); // scanner class
         int score = 0; // locla variables
         System.out.println(\"Welcome to the Multiplication game! We\'ll now play \" + numGames + \" rounds.\"); // message to the user
         for (int i = 0; i < numGames; i++) { // iterate over the games count
             int x = rand.nextInt(n), y = rand.nextInt(n), ans = x * y; // variable initialisation
             System.out.print(String.format(\"Enter the Multiplication Value : %d * %d = \", x, y)); // print the data
             int val = in.nextInt(); // get the value
             if (ans == val) { // check for the value
                 System.out.println(\"Correct!\");
                 score++; // increment the score
             } else {
                 System.out.println(\"Wrong! The Right answer is \" + ans); // message
             }
         }
         System.out.println(\"Thanks for playing the Multiplication game. Your score is \" + score + \".\"); // message
         System.out.println();
         return score; // return the score
     }
 }
 SubtractionGame.java :
import java.util.Random; // imports for the code to run
 import java.util.Scanner;
public class SubtractionGame implements Game { // class that runs the code and implements the interface
    private Random rand; // instance variables
     private int n;
    public SubtractionGame(Random r, int big) { // constructor
         rand = r;
         n = big;
     }
    @Override
     public int play() { // implemented classes
         final int numGames = 3;
         Scanner in = new Scanner(System.in);
         int score = 0;
         System.out.println(\"Welcome to the Subtraction game! We\'ll now play \" + numGames + \" rounds.\"); // message to the user
         for (int i = 0; i < numGames; i++) {
             int x = rand.nextInt(n), y = rand.nextInt(n), ans = x - y; // variable initialisation
             System.out.print(String.format(\"Enter the Difference : %d - %d = \", x, y));
             int val = in.nextInt(); // get the value
             if (ans == val) { // check for the value
                 System.out.println(\"Correct!\");
                 score++; // increment the score
             } else {
                 System.out.println(\"Wrong! The Right answer is \" + ans);
             }
         }
         System.out.println(\"Thanks for playing the Subtraction game. Your score is \" + score + \".\"); // message
         System.out.println();
         return score;// return the score
     }
}
 AdditionGame.java :
import java.util.*;
public class AdditionGame implements Game // note implements!!
 {
    private Random rand;
     private int n;
    // Constructor for objects of class AdditionGame
     public AdditionGame(Random r, int big) {
         rand = r;
         n = big;
     }
    // play all games and keep score.
     @Override
     public int play() // exactly matches heading in Game interface
     {
         final int numGames = 3;
         Scanner in = new Scanner(System.in);
         int score = 0;
         System.out.println(\"Welcome to the Addition game! We\'ll now play \" + numGames + \" rounds.\");
         for (int i = 0; i < numGames; i++) {
             int x = rand.nextInt(n), y = rand.nextInt(n), ans = x + y;
             System.out.print(String.format(\"Enter the Sum : %d + %d = \", x, y));
             int val = in.nextInt();
             if (ans == val) {
                 System.out.println(\"Correct!\");
                 score++;
             } else {
                 System.out.println(\"Wrong! Right answer is \" + ans);
             }
         }
         System.out.println(\"Thanks for playing the Addition game. Your score is \" + score + \".\");
         System.out.println();
         return score;
     }
 }
 OUTPUT :
Welcome to the Subtraction game! We\'ll now play 3 rounds.
 Enter the Difference : 30 - 66 = -36
 Correct!
 Enter the Difference : 6 - 75 = -69
 Correct!
 Enter the Difference : 65 - 25 = 40
 Correct!
 Thanks for playing the Subtraction game. Your score is 3.
Want a game? y
 Welcome to the Multiplication game! We\'ll now play 3 rounds.
 Enter the Multiplication Value : 66 * 69 = 548
 Wrong! The Right answer is 4554
 Enter the Multiplication Value : 15 * 84 = 1453
 Wrong! The Right answer is 1260
 Enter the Multiplication Value : 88 * 38 = 548
 Wrong! The Right answer is 3344
 Thanks for playing the Multiplication game. Your score is 0.
Want a game? n
 Thanks for Playing!
 Your total score is 3
Hope this is helpful.






