I have written a game in which the user has to guess six numbers between 1 and 49. I want that my program gets checked in the following criteria:
Does this program meet the requirements of object-oriented thinking and programming?
Did I have used the library of the Java language wisely or were parts of the program implemented more cumbersome than they must be?
Are I / O instructions in the right place?
Are there other things that are not mentioned here but can be improved?
The program can be tested here.
Main.java
public class Main {
public static void main(String[] args) {
Game game = new Game();
game.play();
}
}
Game.java
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;
public class Game {
private Lottery lottery;
private List<Integer> guess;
private Integer guessedNumber;
private boolean inputAccepted;
private int rightNumbers;
private static Scanner scanner = new Scanner(System.in);
public Game() {
lottery = new Lottery();
guess = new ArrayList<Integer>();
guessedNumber = 0;
inputAccepted = false;
rightNumbers = 0;
}
public void play() {
System.out.println("You have to guess six numbers.\n");
guessNumbers();
compareGuess();
printScore();
}
private void guessNumbers() {
while (guess.size() < 6) {
System.out.print("Number nr." + (guess.size() + 1) + ": ");
String input = scanner.nextLine();
guessedNumber = Integer.valueOf(input);
checkInput();
if (inputAccepted) {
guess.add(guessedNumber);
}
}
System.out.println();
Collections.sort(guess);
}
// checks if input is valid
private void checkInput() {
inputAccepted = true;
// check if number is out of range
if (guessedNumber > 49 || guessedNumber < 1) {
System.out.println("You have to guess a number between 1 and 49.");
inputAccepted = false;
}
// check if number allready exists in list
for (int i = 0; i < guess.size(); i++) {
if (guess.get(i).equals(guessedNumber)) {
System.out.println("You allready have guessed this number");
inputAccepted = false;
break;
}
}
}
private void compareGuess() {
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
if (lottery.getDraw().get(i).equals(guess.get(j))) {
rightNumbers++;
}
}
}
}
private void printScore() {
System.out.println("Draw: " + lottery.getDraw());
System.out.println("Your guess: " + guess);
if (rightNumbers == 0) {
System.out.println("You have no right numbers.");
} else if (rightNumbers == 1) {
System.out.println("You have one right numbers.");
} else if (rightNumbers > 1) {
System.out.println("You have " + rightNumbers + " right numbers.");
}
}
}
Lottery.java
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Random;
public class Lottery {
private static Random random = new Random();
private List<Integer> draw;
public Lottery() {
renewDraw();
}
public List<Integer> getDraw() {
return draw;
}
public void renewDraw() {
draw = new ArrayList<Integer>();
while (draw.size() < 6) {
Integer number = new Integer(random.nextInt(49) + 1);
boolean drawHasNumber = false;
for (int i = 0; i < draw.size(); i++) {
if (draw.get(i).equals(number)) {
drawHasNumber = true;
break;
}
}
if (!drawHasNumber) {
draw.add(number);
}
}
Collections.sort(draw);
}
public int compare(List<Integer> guess) {
int rightNumbers = 0;
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
if (draw.get(i).equals(guess.get(j))) {
rightNumbers++;
}
}
}
return rightNumbers;
}
}