Jeg har for nylig lavet et poker-program hvor jeg skulle spørge brugeren om en helt masse...
Klassen kan både håndtere tal og strenge, via 2 forskellige metoder, og den sørger for alt fejlhåndtering...
Du skal blot ændre den lidt, så alle de kommandoer der findes i programmet ændres med mine...
Den er fint dokumenteret, men hvis ikke du forstår den skal du være velkommen til at spørge alt det du vil.
Om du kan bruge den i netop dit projekt ved jeg ikke, men det er i hvert fald en god måde at håndtere tekst-baseret inputs på
import java.util.ArrayList;
import java.util.HashMap;
import java.io.*;
/**
* Dialog-klassen. Håndterer bruger-input,
* og undersøger om brugerens svar stemmer overens med spørgsmålet.
* Hvis ja, sendes svaret tilbage til dealer klassen hvor det
* bliver behandlet, hvis nej udskrives en fejlmeddelse og brugeren
* bliver bedt om at komme med et nyt input.
*
* Klassen indeholder desuden forklaringer til de kommandoer der
* skal bruges for at spille spillet.
*
* @author Frederik W. Nørregaard
* @version 27/11-06
*/
public class Dialog
{
private HashMap<String, String> forklaring;
// De gyldige svar
private ArrayList<String> svar;
public Dialog() {
forklaring = new HashMap<String, String>();
svar = new ArrayList<String>();
fill();
}
// Forklaring på alle gyldige kommandoer
private void fill() {
forklaring.put("j"," - Accepter en forespørgsel");
forklaring.put("n"," - Afvis en forespørgsel");
forklaring.put("fold"," - Gå ud af den pågældende runde");
forklaring.put("bet", " - Byd en indsats");
forklaring.put("call", " - Gå med på indsatsen");
forklaring.put("raise", " - Forhøj indsatsen");
forklaring.put("help", " - Viser denne liste");
forklaring.put("command", " - Udskriver en liste over gyldige kommandoer");
}
/**
* Undersøger og behandler et bruger-input, der skal være en streng.
* Hvis strengen er gyldig, hvilket betyder at brugerens input stemmer overens med en gyldig svarmulighed,
* sendes strengen tilbage til dealeren.
* Hvis ikke, udskrives en fejlmeddelse og brugeren bliver bedt om at komme med et nyt input.
* @param spm Spørgsmålet fra dealeren
* @param fejl Fejl-meddelse der skal udprintes hvis nødvendigt
* @param boolean_'x' angiver om den pågældende kommando, x, skal være en gyldig svarmulighed. (fold, call, raise, bet, j, n)
* @return Et gyldigt svar
*/
public String makeDialog(String spm, String fejl, boolean fold, boolean call, boolean raise, boolean bet, boolean j, boolean n) throws IOException {
boolean fundet = false;
String string = "";
print(spm);
// Alle de svar der er gyldige tilføjes til en liste: svar
if (fold == true) {
svar.add("fold");
}
if (call == true) {
svar.add("call");
}
if (raise == true) {
svar.add("raise");
}
if (bet == true) {
svar.add("bet");
}
if (j == true) {
svar.add("j");
}
if (n == true) {
svar.add("n");
}
// Hvis svar-listen er tom, skal brugeren indtaste et navn
if (svar.size() == 0) {
boolean string_ok = false;
// Hvis brugeren har skrevet noget, der ikke blot er mellemrum,
// sendes strengen tilbage og do-loppet stoppes
do {
string = getCommand().trim();
if (string.length() != 0) {
string_ok = true;
}
else {
print(fejl);
}
}
while (string_ok == false);
}
else {
// Hvis brugerens input stemmer overens med en svarmulighed i svar-listen
// sendes det tilbage
do {
string = getCommand().trim();
int i = 0;
while (i < svar.size()) {
if(string.equalsIgnoreCase(svar.get(i))){
fundet = true;
}
i++;
}
// Brugerens svar kan ikke findes i listen, og der tjekkes om
// det er en af de 2 hjælpe-strenge
if (fundet == false) {
if (string.equalsIgnoreCase("help")){
printHelp(true) ;
}
else if (string.equalsIgnoreCase("command")) {
printHelp(false) ;
}
else {
print(fejl);
}
}
}
while (fundet == false);
}
// den korrekte streng sendes tilbage, men laves om til kun små
// bogstaver, så "casen" ikke skal tjekkes hos dealeren
string = string.toLowerCase();
svar.clear();
return string;
}
/**
* Undersøger og behandler et bruger-input, der skal være et tal.
* Hvis brugerens input er gyldigt, sendes det tilbage til dealeren, ellers
* udskrives en fejlmeddelse og brugeren bliver bedt om at komme med et nyt input.
* @param spm Spørgsmålet fra dealeren
* @param fejl Fejlmeddelse hvis input ikke er gyldigt
* @param min Den mindste værdi tallet kan være
* @param max Den højeste værdi tallet kan være
* @return En gyldig værdi
*/
public int getInteger(String spm, int min, int max, String fejl) {
int tal = 0;
boolean gyldig = false;
print(spm);
// Der tjekkes om brugerens input ligger i det tilladte interval
// Hvis max er 0, tjekkes kun for minimum-værdien; Max er uendelig
do {
try {
tal = Integer.parseInt(getCommand().trim());
if (max == 0) {
if (tal >= min) {
gyldig = true;
}
}
else {
if (tal >= min && tal <= max) {
gyldig = true;
}
}
if (gyldig == false) {
print(fejl);
}
}
catch (Exception e) {print(fejl);}
}
while (gyldig == false);
return tal;
}
// Modtager bruger-input og returnerer dette
private String getCommand() throws IOException {
System.out.print("\\n> ");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader stdin = new BufferedReader(isr);
return stdin.readLine();
}
/**
* Udskriver hjælp. Hvis forklar = true; forklaring til de respektive kommandoer udskrives.
* False; kun kommandoerne udskrives.
* @param forklar styrer om der skal udskrives beskrivende tekst eller ej
*/
public void printHelp(boolean forklar) {
String forklaring_ = "";
int u = 0;
for(String i : svar) {
if (forklar == true) {
forklaring_ = forklaring.get(svar.get(u));
u++;
}
print(i + forklaring_);
}
if (forklar == true) {
print("help - viser denne liste\\ncommand - viser liste over gyldige kommandoer");
}
else {
print("help\\ncommand");
}
}
public void visReadMe() {
try {
FileReader fr = new FileReader("Readme.txt");
BufferedReader br = new BufferedReader(fr);
String line = br.readLine();
do {
System.out.println(line);
line = br.readLine();
}
while (line !=null);
}
catch (Exception e) {System.out.println("Fejl");}
}
}
Klassen udskriver ikke de muligheder brugeren har automatisk, men du kan jo selv lige rette til hvis klassen har interesse at bruge
Indlæg senest redigeret d. 13.12.2006 00:41 af Bruger #10415