To continue from @FerryBig's answer:
His code looks like:
import java.util.Scanner;
public class Main {
public static int input;
public static int marble = 12;
public static void main(String[] args) throws InterruptedException {
System.out.println("There Are 12 Marbles, You Can Only Remove Up To 3 Marbles At A Time");
System.out.println("Your Goal Is To Remove The Last Marble, Marble 1");
System.out.println("To Remove A Marble Either Enter 1, 2 or 3");
System.out.println("");
try (Scanner scanInput = new Scanner(System.in)) {
while (scanInput.hasNextInput()) {
if (marble == 1) {
System.out.println("There Is " + marble + " Marble Remaining");
} else {
System.out.println("There Are " + marble + " Marbles Remaining");
}
input = scanInput.nextInt();
if (input > 3 || input < 1) {
System.out.println("You Can Only Remove 3 Marbles At A Time");
continue;
}
marble = marble - input;
if (marble - input =< 0) {
System.out.println("There Are No Marbles Remaining, You Have Won!!");
return;
}
Thread.sleep(250);
int cpuAnswer = 4 - input;
if (cpuAnswer == 1) {
System.out.println("The Computer Has Removed " + cpuAnswer + " Marble");
} else {
System.out.println("The Computer Has Removed " + cpuAnswer + " Marbles");
}
if (marble - cpuAnswer =< 0) {
System.out.println("There Are No Marbles Remaining, The Computer Has Won!!");
System.out.println("The Computer Has Won");
return;
}
marble = marble - cpuAnswer;
}
}
}
}
The issue with that code is that everything is in the main
method. Another issue is that it doesn't follow any OOP principle.
But first, let's fix the code. A lot of it can be replaced with ternary operators.
1:
if (marble == 1) {
System.out.println("There Is " + marble + " Marble Remaining");
} else {
System.out.println("There Are " + marble + " Marbles Remaining");
}
Can be changed to:
System.out.println("There " + (marble == 1 ? "Is" : "Are")
+ " " + marble + " Marble" + (marble == 1 ? "" : "s")
+ " Remaining");
Ugly. Try printf
:
System.out.println("There %s %d %s Remaining",
(marble == 1 ? "Is" : "Are"),
marble,
(marble == 1 ? "Marble" : "Marbles"));
2:
if (cpuAnswer == 1) {
System.out.println("The Computer Has Removed " + cpuAnswer + " Marble");
} else {
System.out.println("The Computer Has Removed " + cpuAnswer + " Marbles");
}
To:
System.out.println("The Computer Has Removed " + cpuAnswer +
(cpuAnswer == 1 ? " Marble" : " Marbles"));
3:
marble = marble - cpuAnswer;
To:
marble -= cpuAnswer;
4:
System.out.println("There Are 12 Marbles, You Can Only Remove Up To 3 Marbles At A Time");
System.out.println("Your Goal Is To Remove The Last Marble, Marble 1");
System.out.println("To Remove A Marble Either Enter 1, 2 or 3");
System.out.println("");
To:
System.out.println("There Are 12 Marbles, You Can Only Remove Up To 3 Marbles At A Time\n"
+ "Your Goal Is To Remove The Last Marble, Marble 1\n"
+ "To Remove A Marble Either Enter 1, 2 or 3\n");
After:
import java.util.Scanner;
public class Main {
public static int input;
public static int marble = 12;
public static void main(String[] args) throws InterruptedException {
System.out.println("There Are 12 Marbles, You Can Only Remove Up To 3 Marbles At A Time\n"
+ "Your Goal Is To Remove The Last Marble, Marble 1\n"
+ "To Remove A Marble Either Enter 1, 2 or 3\n");
try (Scanner scanInput = new Scanner(System.in)) {
while (scanInput.hasNextInput()) {
System.out.println("There %s %d %s Remaining",
(marble == 1 ? "Is" : "Are"),
marble,
(marble == 1 ? "Marble" : "Marbles"));
input = scanInput.nextInt();
if (input > 3 || input < 1) {
System.out.println("You Can Only Remove 3 Marbles At A Time");
continue;
}
marble = marble - input;
if (marble - input =< 0) {
System.out.println("There Are No Marbles Remaining, You Have Won!!");
return;
}
Thread.sleep(250);
int cpuAnswer = 4 - input;
System.out.println("The Computer Has Removed " + cpuAnswer +
(cpuAnswer == 1 ? " Marble" : " Marbles"));
if (marble - cpuAnswer =< 0) {
System.out.println("There Are No Marbles Remaining, The Computer Has Won!!");
System.out.println("The Computer Has Won");
return;
}
marble -= cpuAnswer;
}
}
}
}
Now, method separation.
First, let's extract the two main parts into displayHelp
and playGame
:
import java.util.Scanner;
public class Main {
public static int input;
public static int marble = 12;
public static void main(String[] args) throws InterruptedException {
displayHelp();
playGame();
}
public void displayHelp() {
System.out.println("There Are 12 Marbles, You Can Only Remove Up To 3 Marbles At A Time\n"
+ "Your Goal Is To Remove The Last Marble, Marble 1\n"
+ "To Remove A Marble Either Enter 1, 2 or 3\n");
}
public void playGame() {
try (Scanner scanInput = new Scanner(System.in)) {
while (scanInput.hasNextInput()) {
System.out.println("There %s %d %s Remaining",
(marble == 1 ? "Is" : "Are"),
marble,
(marble == 1 ? "Marble" : "Marbles"));
input = scanInput.nextInt();
if (input > 3 || input < 1) {
System.out.println("You Can Only Remove 3 Marbles At A Time");
continue;
}
marble = marble - input;
if (marble - input =< 0) {
System.out.println("There Are No Marbles Remaining, You Have Won!!");
return;
}
Thread.sleep(250);
int cpuAnswer = 4 - input;
System.out.println("The Computer Has Removed " + cpuAnswer +
(cpuAnswer == 1 ? " Marble" : " Marbles"));
if (marble - cpuAnswer =< 0) {
System.out.println("There Are No Marbles Remaining, The Computer Has Won!!");
System.out.println("The Computer Has Won");
return;
}
marble -= cpuAnswer;
}
}
}
}
Now extract methods into showMarbleCount
, getInput
, and getCPUInput
.
import java.util.Scanner;
public class Main {
public static int marble = 12;
public static void main(String[] args) throws InterruptedException {
displayHelp();
playGame();
}
public void displayHelp() {
System.out.println("There Are 12 Marbles, You Can Only Remove Up To 3 Marbles At A Time\n"
+ "Your Goal Is To Remove The Last Marble, Marble 1\n"
+ "To Remove A Marble Either Enter 1, 2 or 3\n");
}
public void playGame() {
try (Scanner scanInput = new Scanner(System.in)) {
while (scanInput.hasNextInput()) {
showMarbleCount(marble);
int input = getInput();
marble -= input;
if (marble - input =< 0) {
System.out.println("There Are No Marbles Remaining, You Have Won!!");
return;
}
Thread.sleep(250);
int cpuAnswer = getAndPrintCPUAnswer();
if (marble - cpuAnswer =< 0) {
System.out.println("There Are No Marbles Remaining, The Computer Has Won!!");
System.out.println("The Computer Has Won");
return;
}
marble -= cpuAnswer;
}
}
}
public void showMarbleCount(int marble) {
System.out.println("There %s %d %s Remaining",
(marble == 1 ? "Is" : "Are"),
marble,
(marble == 1 ? "Marble" : "Marbles"));
}
public int getInput() {
int input;
do {
input = scanInput.nextInt();
if (input > 3 || input < 1) {
System.out.println("You Can Only Remove 3 Marbles At A Time");
continue;
}
} while (true);
return input;
}
public int getAndPrintCPUAnswer(int input) {
int cpuAnswer = 4 - input;
System.out.println("The Computer Has Removed " + cpuAnswer +
(cpuAnswer == 1 ? " Marble" : " Marbles"));
return cpuAnswer;
}
}