Write a Java program called Assignment4.java. The program is to display question
ID: 3763122 • Letter: W
Question
Write a Java program called Assignment4.java. The program is to display questions and read user inputs, then calculate and print out the requested value with a proper format. The goal of this program will be to create math study guides be producing arithmetic tables for the user. This program will follow a very simple process. Specifications (20 points) Simple Memory Game Example: Flash Memory Game (Links to an external site.) http://www.best-flash-games.net/memory-games/remember-numbers.html Skills: Input/Output Arrays Loops Basic Description: Create a simple memory game using a single-dimension array. Game Description: Give the user a choice between difficult levels: Easy – User gets 20 turns Medium – User gets 10 turns Hard – User gets 5 turns When the user gets a match, they don't lose the turn. If they don't get a match, they lose a turn. 5 incorrect guesses = game over. The user guesses two items, these items are revealed to the user. If they match, the cards stay flipped over when presenting the puzzle. Otherwise re-hide the puzzle and ask for a new guess. The user wins if they match all the items. Specifications: Create a game according to the above rules Your array should use either numbers or letters. (integers might be easier) You should have at least 10 items to match (so your array should be at least 20 items) If you do more than 10 items, you might want to give the player more turns. The positions of the 10 items should be randomized every time the game is played. Note: populating the array is one of the big challenges of this assignment After every guess "clear the screen" before outputting the puzzle again. for (int n = 0; n < 10; n++) System.out.println( " "
Explanation / Answer
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.font.TextAttribute;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import java.util.concurrent.atomic.AtomicInteger;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class AUIApplet extends JApplet {
private final int APPLET_WIDTH = 600;
private final int APPLET_HEIGHT = 400;
private final int BASE_AMOUNT = 4; //base amount of numbers displayed in game
private final int[] DIFF_TIMES = {2000, 1400, 1000, 600}; //time numbers are displayed in each difficulty in milliseconds
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(0); //scheduled executer service to display numbers
private final int INITIAL_DELAY = 1000; //initial delay before numbers begin to display
private enum GameStatusEnum {RUNNING, WAITING, STOPPED};
private GameStatusEnum gameStatus = GameStatusEnum.STOPPED; //enum to use in cases where the game stops prematurely (as it does when a user quits a game)
private final int[] HIGH_SCORES = {0, 0, 0, 0}; //stores highscores for each difficulty
private int[] currentNumbers; //stores current set of numbers being displayed to the user
private int currentScore = 0; //stores current score of the user
private ScheduledFuture<?> setNumberService; //scheduler for setting numbers
private ScheduledFuture<?> endNumberService; //scheduler for re-enabling textfield and clearing number off screen after setNumberService ends
Color titleColour = new Color(0, 51, 102); //used for title on first screen
Font normalFont = new Font("Cambria", Font.PLAIN, 18); //used for most text
Font titleFont = new Font("Cambria", Font.BOLD, 24); //used for title on first page
Font headingFont = new Font("Cambria", Font.ITALIC + Font.BOLD, 20); //used for headings
Font numberFont = new Font("Cambria", Font.BOLD, 20); //used for the numbers being displayed
Font statusFont = new Font("Cambria", Font.BOLD, 24); //used for "Correct!", "Incorrect!", and "High Score!" notifications
Map titleAttributes = titleFont.getAttributes(); //used for underline on title
JPanel contPan; //main cardlayout container
JPanel startPan, setupPan, gamePan; //main screens
UsefulPanel usefulPan; //used to demo features not implemented in program
JPanel rulePan, startInfoPan; //panels used in start screen "startPan"
JPanel setupInfoPan, setupMidPan, gameOptPan, userInputPan; //panels used for setup screen "setupPan"
JPanel scorePan, gameInfoPan, innerGamePan; //panels used for game screen "gamePan"
JButton setupGameBut, cancelBut, endGameBut, startGameBut, checkAnswerBut, retryBut;
JLabel highScoreLab, currentScoreLab, titleLab, difficultyLab, difficultyScoreLab, currentNumberLab, currentDiffLab, statusLab;
JTextField answerField; //answer field
Choice difficulty; //difficulty Choice()
CardLayout cl = new CardLayout();
@Override
public void init() {
//set applet size
setSize(APPLET_WIDTH, APPLET_HEIGHT);
//start screen
startPan = new JPanel();
startPan.setLayout(new BorderLayout(5,5));
//setup screen
setupPan = new JPanel();
setupPan.setLayout(new BorderLayout(5, 5));
setupGameBut = new JButton("New Game");
cancelBut = new JButton("Cancel");
//game screen
gamePan = new JPanel();
gamePan.setLayout(new BorderLayout(5, 5));
endGameBut = new JButton("Quit Game");
//heading label
titleLab = new JLabel("Number Memory");
titleLab.setForeground(titleColour);
titleAttributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
titleLab.setFont(titleFont.deriveFont(titleAttributes));
//rule panel
rulePan = new JPanel();
rulePan.setLayout(new GridLayout(8, 1, 5, 5));
rulePan.add(new JLabel("Rules:")).setFont(headingFont);
rulePan.add(new JLabel("1. You will be shown a series of numbers, one at a time."));
rulePan.add(new JLabel("2. You must recite the series of numbers after the last number has been displayed."));
rulePan.add(new JLabel("3. After each correct recitation of the sequence, another sequence will play with one extra number."));
rulePan.add(new JLabel("Note: You can decrease/increase the time each number displays for by changing the difficulty."));
//difficulty selection Choice()
difficulty = new Choice();
difficulty.add("Easy");
difficulty.add("Normal");
difficulty.add("Hard");
difficulty.add("Extra Hard");
difficulty.select(1);
//game option panel
gameOptPan = new JPanel();
gameOptPan.setLayout(new GridLayout(1, 2, 5, 5));
startGameBut = new JButton("Start Game");
gameOptPan.add(startGameBut);
gameOptPan.add(difficulty);
//start info panel
startInfoPan = new JPanel();
startInfoPan.setLayout(new BorderLayout(5, 5));
startInfoPan.add(rulePan, BorderLayout.CENTER);
//setup high score display panel for on-selection display of high scores for
//each difficulty level
setupMidPan = new JPanel();
setupMidPan.setLayout(new GridLayout(1, 8, 5, 5));
difficultyLab = new JLabel();
difficultyLab.setText("High Score for " + difficulty.getSelectedItem() + " Difficulty:");
difficultyScoreLab = new JLabel(Integer.toString(HIGH_SCORES[difficulty.getSelectedIndex()]));
setupMidPan.add(difficultyLab);
setupMidPan.add(difficultyScoreLab);
//setup info panel
setupInfoPan = new JPanel();
setupInfoPan.setLayout(new BorderLayout(5, 5));
setupInfoPan.add(gameOptPan, BorderLayout.SOUTH);
setupInfoPan.add(setupMidPan, BorderLayout.CENTER);
//user input panel
userInputPan = new JPanel();
userInputPan.setLayout(new GridLayout(2, 1, 5, 5));
answerField = new JTextField(30);
userInputPan.add(answerField);
checkAnswerBut = new JButton("Check Answer");
userInputPan.add(checkAnswerBut);
//game info panel
gameInfoPan = new JPanel();
gameInfoPan.setLayout(new GridLayout(4, 1, 5, 5));
currentNumberLab = new JLabel("", SwingConstants.CENTER);
currentNumberLab.setFont(numberFont);
gameInfoPan.add(currentNumberLab);
gameInfoPan.add(userInputPan);
gameInfoPan.add(new JLabel("Enter each number seperated by a comma. e.g. '1,2,3,11,22,33'"));
statusLab = new JLabel("", SwingConstants.CENTER);
statusLab.setFont(statusFont);
gameInfoPan.add(statusLab);
//score panel
scorePan = new JPanel();
scorePan.setLayout(new GridLayout(10, 1, 5, 5));
currentDiffLab = new JLabel("");
highScoreLab = new JLabel("High Score: " + HIGH_SCORES[difficulty.getSelectedIndex()] + " ");
currentScoreLab = new JLabel("Current Score: " + currentScore + " ");
scorePan.add(currentDiffLab);
scorePan.add(highScoreLab);
scorePan.add(currentScoreLab);
//inner game panel
innerGamePan = new JPanel();
innerGamePan.setLayout(new BorderLayout(5, 5));
retryBut = new JButton("Retry");
innerGamePan.add(retryBut, BorderLayout.SOUTH);
innerGamePan.add(scorePan, BorderLayout.EAST);
innerGamePan.add(gameInfoPan, BorderLayout.CENTER);
//adding to start panel
startPan.add(titleLab, BorderLayout.NORTH);
startPan.add(setupGameBut, BorderLayout.SOUTH);
startPan.add(startInfoPan, BorderLayout.CENTER);
//adding to setup panel
setupPan.add(setupInfoPan, BorderLayout.CENTER);
setupPan.add(cancelBut, BorderLayout.SOUTH);
//adding to game panel
gamePan.add(endGameBut, BorderLayout.SOUTH);
gamePan.add(innerGamePan, BorderLayout.CENTER);
//setting up container panel and adding each screen to it
contPan = new JPanel();
contPan.setLayout(cl);
contPan.add(startPan, "Start Applet Screen");
contPan.add(setupPan, "Setup Game Screen");
contPan.add(gamePan, "New Game Screen");
setupGameBut.addActionListener((ActionEvent e) -> {
newGame(); //to setup screen
});
startGameBut.addActionListener((ActionEvent e) -> {
startGame(); //to new game
});
retryBut.addActionListener((ActionEvent e) -> {
startGame(); //to new game from inside previously lost game
});
cancelBut.addActionListener((ActionEvent e) -> {
quitGame(); //quits setup and returns to main menu
});
endGameBut.addActionListener((ActionEvent e) -> {
quitGame(); //quits game
});
//used to update speeds that the numbers are displayed at. Each difficulty has
//it's own high score
difficulty.addItemListener((ItemEvent e) -> {
switch(difficulty.getSelectedIndex()) {
case 0:
difficultyLab.setText("High Score for " + difficulty.getSelectedItem() + " Difficulty:");
difficultyScoreLab.setText(Integer.toString(HIGH_SCORES[difficulty.getSelectedIndex()]));
break;
case 1:
difficultyLab.setText("High Score for " + difficulty.getSelectedItem() + " Difficulty:");
difficultyScoreLab.setText(Integer.toString(HIGH_SCORES[difficulty.getSelectedIndex()]));
break;
case 2:
difficultyLab.setText("High Score for " + difficulty.getSelectedItem() + " Difficulty:");
difficultyScoreLab.setText(Integer.toString(HIGH_SCORES[difficulty.getSelectedIndex()]));
break;
case 3:
difficultyLab.setText("High Score for " + difficulty.getSelectedItem() + " Difficulty:");
difficultyScoreLab.setText(Integer.toString(HIGH_SCORES[difficulty.getSelectedIndex()]));
break;
}
});
answerField.addActionListener((ActionEvent e) -> {
checkAnswer(answerField.getText()); //submits answer
});
checkAnswerBut.addActionListener((ActionEvent e) -> {
checkAnswer(answerField.getText()); //submits answer
});
//add container panel
this.add(contPan);
}
//brings user to game setup screen
private void newGame() {
difficultyLab.setText("High Score for " + difficulty.getSelectedItem() + " Difficulty:");
difficultyScoreLab.setText(Integer.toString(HIGH_SCORES[difficulty.getSelectedIndex()]));
statusLab.setText("");
cl.show(contPan, "Setup Game Screen");
}
//starts a new game
private void startGame() {
answerField.setText("");
cl.show(contPan, "New Game Screen");
currentNumbers = getRandomNumbers(currentScore);
gameStatus = GameStatusEnum.RUNNING;
retryBut.setVisible(false);
updateScorePan(currentScore);
printNumbers(currentNumbers);
}
//returns an array of random numbers between 1 and 99 inclusive for the sum of the base
//amount (4) and the user's current score
private int[] getRandomNumbers(int currentScore) {
int[] randomNums = new int[BASE_AMOUNT + currentScore];
for (int i = 0; i < randomNums.length; i++) {
randomNums[i] = getRandomNumber();
}
return randomNums;
}
//return singular random number
private int getRandomNumber() {
Random rand = new Random();
int max = 99;
int min = 0;
int randomNum = rand.nextInt((max-min) + 1) + min;
return randomNum;
}
//deals with setting up for the numbers being displayed and calling scheduleNumbers()
//which executes schedulers for display of numbers
private void printNumbers(int[] randomNumbers) {
int speed = DIFF_TIMES[difficulty.getSelectedIndex()];
int amount = BASE_AMOUNT + currentScore;
answerField.setEditable(false); //stops user from entering text before the game has started
checkAnswerBut.setEnabled(false); //stops user from submitting an answer when the program isn't ready
showStatus(getNumbersAsString());
scheduleNumbers(randomNumbers, speed, amount);
}
//executes schedulers for display of numbers
public void scheduleNumbers(int[] randomNumbers, int speed, int amount) {
long initialDelay = INITIAL_DELAY;
final AtomicInteger curNumber = new AtomicInteger(-1); //used so can be updated in Runnable setNumber() lambda
final Runnable setNumber = () -> {
currentNumberLab.setText(Integer.toString(randomNumbers[curNumber.incrementAndGet()])); //sets text to next number
};
setNumberService = scheduler.scheduleAtFixedRate(setNumber, initialDelay, speed, MILLISECONDS); //schedules calls of setNumber() at specific intervals for certain time
//scheduled to clean up after setNumberService by enabling components, removing number display and canceling setNumberService
endNumberService = scheduler.schedule(() -> {
currentNumberLab.setText("");
answerField.setEditable(true);
checkAnswerBut.setEnabled(true);
gameStatus = GameStatusEnum.WAITING;
setNumberService.cancel(true);
}, ((speed * amount)+ initialDelay), MILLISECONDS);
}
//updates in-game score panel
private void updateScorePan(int curScore) {
currentDiffLab.setText(difficulty.getSelectedItem());
highScoreLab.setText("High Score: " + HIGH_SCORES[difficulty.getSelectedIndex()] + " ");
currentScoreLab.setText("Current Score: " + curScore + " ");
}
//ends game
private void quitGame() {
cl.show(contPan, "Start Applet Screen");
reset();
}
//performs actions usually taken by endNumberService in the case of a premature exit of game
private void reset() {
currentNumberLab.setText("");
currentScore = 0;
if (gameStatus == GameStatusEnum.RUNNING) {
setNumberService.cancel(true); //cancel setNumberService
endNumberService.cancel(true); //cancel endNumberService
}
gameStatus = GameStatusEnum.STOPPED;
}
//checks users answer against string of random numbers displayed
private void checkAnswer(String answer) {
String numbersAsString = getNumbersAsString();
if (answer.equals(numbersAsString)) {
answerCorrect();
}
else {
answerIncorrect();
}
}
//returns numbers displayed as string
private String getNumbersAsString() {
String numbersAsString = "";
for (int number : currentNumbers) {
numbersAsString += number + ",";
}
numbersAsString = numbersAsString.substring(0, numbersAsString.length()-1);
return numbersAsString;
}
//updates current score in the case of correct answer
private void updateScores(boolean isCorrect) {
if (isCorrect) {
currentScore++;
}
else {
currentScore = 0;
}
}
//updates high score in the case of it being beaten
private boolean checkHighScore() {
int highScore = HIGH_SCORES[difficulty.getSelectedIndex()];
if (currentScore > highScore) {
HIGH_SCORES[difficulty.getSelectedIndex()] = currentScore;
return true;
}
return false;
}
//if answer is correct
private void answerCorrect() {
System.out.println("Correct!");
updateScores(true);
if(checkHighScore()){
statusLab.setText("New High Score!");
}
else {
statusLab.setText("Correct!");
}
startGame(); //starts a new round
}
//if answer incorrect
private void answerIncorrect() {
statusLab.setText("Incorrect!");
updateScores(false);
retryBut.setVisible(true); //displays button which allows user to retry without returning to setup
}
//adds insets for aesthetic reasons around contPan
@Override
public Insets getInsets() {
return new Insets(10, 10, 10, 10);
}
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.