Deitel. Instrução auxiliada por computador: variando os tipos de problema

Olá, pessoal.
Estou aprendendo Java.
Consegui resolver os exercícios 6.35 a 6.39 do livro do Deitel, mas não sei se foi na gambiarra ou se está correto.
Se alguém puder me ajudar, eu agradeço!

/* Exercício 6.35: InstrucaoAssistida.java
6.35 (Instrução assistida por computador) O uso de computadores na educação é chamado instrução assistida por computador (CAI).
Escreva um programa que ajudará um aluno da escola elementar a aprender multiplicação. Utilize um objeto SecureRandom para produzir
dois inteiros positivos de um algarismo. O programa deve então fazer ao usuário uma pergunta, como

6.36 (Instrução auxiliada por computador: reduzindo a fadiga do aluno) Um problema em ambientes CAI é a fadiga do aluno. Isso pode
ser reduzido variando-se as respostas do computador para prender a atenção do aluno. Modifique o programa da Questão 6.35 para que
vários comentários sejam exibidos para cada resposta como mostrado a seguir:
Possibilidades para uma resposta correta:
Muito bom!
Excelente!
Bom trabalho!
Mantenha um bom trabalho!
Possibilidades para uma resposta incorreta:
Não. Por favor, tente de novo.
Errado. Tente mais uma vez.
Não desista!
Não. Continue tentando.
Utilize a geração de números aleatórios para escolher um número de 1 a 4 que será utilizado para selecionar uma de quatro respostas
adequadas a cada resposta correta ou incorreta. Utilize uma instrução switch para emitir as respostas.

6.37 (Instrução auxiliada por computador: monitorando o desempenho do aluno) Sistemas mais sofisticados de instruções auxiliadas
por computador monitoram o desempenho do aluno durante um período de tempo. A decisão sobre um novo tópico frequentemente é
baseada no sucesso do aluno com tópicos prévios. Modifique o programa de Exercício 6.36 para contar o número de respostas corretas e
incorretas digitadas pelo aluno. Depois que o aluno digitar 10 respostas, seu programa deve calcular a porcentagem das que estão corretas.
Se a porcentagem for menor que 75%, exiba “Peça ajuda extra ao seu professor.” e, então, reinicialize o programa para que
outro estudante possa tentá-lo. Se a porcentagem for 75% ou maior, exiba “Parabéns, você está pronto para avançar para
o próximo nível!” e, então, reinicialize o programa para que outro estudante possa tentá-lo.

6.38 (Instrução auxiliada por computador: níveis de dificuldade) As questões 6.35 a 6.37 desenvolveram um programa de instrução
assistida por computador a fim de ajudar a ensinar multiplicação para um aluno do ensino fundamental. Modifique o programa para
permitir que o usuário insira um nível de dificuldade. Em um nível de dificuldade 1, o programa deve utilizar apenas números de um único
dígito nos problemas; em um nível de dificuldade 2, os números com dois dígitos, e assim por diante.

6.39 (Instrução auxiliada por computador: variando os tipos de problema) Modifique o programa da Questão 6.38 a fim de permitir ao
usuário selecionar um tipo de problema de aritmética a ser estudado. Uma opção de 1 significa apenas problemas de adição, 2 significa
apenas problemas de subtração, 3, de multiplicação, 4, de divisão e 5, uma combinação aleatória de problemas de todos esses tipos.
*/

package ch06_Ex06_35_InstrucaoAssistida;

import javax.swing.JOptionPane;
import java.security.SecureRandom;

public class InstrucaoAssistida {

static double acertos = 0;

public static void main(String[] args) {

	double tentativas = 10;
	
	int nivelDific = Integer.parseInt(JOptionPane.showInputDialog(null, "Nível de dificuldade (1 = 1 dígito; 2 = 2 dígitos? "));
	if (nivelDific == 1)
		nivelDific = 9;
	else
		nivelDific = 19;			
	
	int tipo = Integer.parseInt(JOptionPane.showInputDialog(null, "Aritmética. 1 - adição, 2 - substração, 3 - multiplicação, 4 - divisão, 5 - todos"));
	
	for (int counter = 1; counter <= tentativas; counter++) {

		switch (tipo)
		{
		case 1:
			adicao(nivelDific);
			break;
		case 2:
			subtracao(nivelDific);
			break;
		case 3:
			multiplicacao(nivelDific);
			break;
		case 4:
			divisao(nivelDific);
			break;
		case 5:
			todos(nivelDific);
			break;
		}

	}
	
	if ( (acertos / tentativas) >= 0.75 ) {
		JOptionPane.showMessageDialog(null, String.format("Parabéns, você está pronto para avançar para o próximo nível! Você acertou %.0f%%", (acertos / tentativas) * 100 ));
	}
	else {
		JOptionPane.showMessageDialog(null, String.format("Peça ajuda extra ao seu professor. Você acertou %.0f%%", (acertos / tentativas) * 100 ));
	}
}


public static int numAleat(int nivelDific) {
	SecureRandom numAlet1 = new SecureRandom();
	return numAlet1.nextInt(nivelDific);
}


public static void respostaCorreta() {
	switch (numAleat(5))
	{
	case 0:
		JOptionPane.showMessageDialog(null, "Muito bom!");
		break;
	case 1:
		JOptionPane.showMessageDialog(null, "Excelente!");
		break;
	case 2:
		JOptionPane.showMessageDialog(null, "Bom trabalho!");
		break;
	case 3:
		JOptionPane.showMessageDialog(null, "Mantenha um bom trabalho!");
		break;
	case 4:
		JOptionPane.showMessageDialog(null, "Muito bem!");
		break;
	}
}


public static void respostaErrada() {
	switch (numAleat(5))
	{
	case 0:
		JOptionPane.showMessageDialog(null, "Não. Por favor, tente de novo.");
		break;
	case 1:
		JOptionPane.showMessageDialog(null, "Errado. Tente mais uma vez.");
		break;
	case 2:
		JOptionPane.showMessageDialog(null, "Não desista!");
		break;
	case 3:
		JOptionPane.showMessageDialog(null, "Não. Continue tentando.");
		break;
	case 4:
		JOptionPane.showMessageDialog(null, "Errado. Você consegue!");
		break;
	}
}


public static void adicao(int nivelDific) {
	int number1 = numAleat(nivelDific);
	int number2 = numAleat(nivelDific);

	int resposta = Integer.parseInt(JOptionPane.showInputDialog(null, String.format("Quanto é %d mais %d?", number1, number2)));
	
	if ( (number1 + number2) == resposta ) {
		respostaCorreta();
		acertos++;
	}
	else
		respostaErrada();
}


public static void subtracao(int nivelDific) {
	int number1 = numAleat(nivelDific);
	int number2 = numAleat(nivelDific);
	
	int resposta = Integer.parseInt(JOptionPane.showInputDialog(null, String.format("Quanto é %d menos %d?", number1, number2)));

	if ( (number1 - number2) == resposta ) {
		respostaCorreta();
		acertos++;
	}
	else
		respostaErrada();
}


public static void multiplicacao(int nivelDific) {
	int number1 = numAleat(nivelDific);
	int number2 = numAleat(nivelDific);
	
	int resposta = Integer.parseInt(JOptionPane.showInputDialog(null, String.format("Quanto é %d vezes %d?", number1, number2)));

	if ( (number1 * number2) == resposta ) {
		respostaCorreta();
		acertos++;
	}
	else
		respostaErrada();
}


public static void divisao(int nivelDific) {
	int number1 = numAleat(nivelDific);
	int number2 = 1 + numAleat(nivelDific);
	
	int resposta = Integer.parseInt(JOptionPane.showInputDialog(null, String.format("Quanto é %d dividido por %d?", number1, number2)));

	if ( (number1 / number2) == resposta ) {
		respostaCorreta();
		acertos++;
	}
	else
		respostaErrada();
}


public static void todos(int nivelDific) {
	SecureRandom tipoAlea = new SecureRandom();
	
	int tipo = 1 + tipoAlea.nextInt(4);
	
	switch (tipo)
	{
	case 1:
		adicao(nivelDific);
		break;
	case 2:
		subtracao(nivelDific);
		break;
	case 3:
		multiplicacao(nivelDific);
		break;
	case 4:
		divisao(nivelDific);
		break;
	}
}

}