package go; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.util.InputMismatchException; import java.util.Scanner; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Chris */ public class Go_ConsoleIO implements Go_IO { int size=0; Board myboard; InputStreamReader input = new InputStreamReader(System.in); OutputStreamWriter output = new OutputStreamWriter(System.out); // Singleton private static Go_ConsoleIO instance = null; private Go_ConsoleIO() { } public static Go_ConsoleIO getInstance() { if (instance == null) { instance = new Go_ConsoleIO(); } return instance; } @Override public void setBoard(Board b){ myboard=b; } @Override public void printTurn(int turn){ try { printTurn(turn , output); } catch (IOException ex) { Logger.getLogger(Go_ConsoleIO.class.getName()).log(Level.SEVERE, null, ex); } } public void printTurn(int turn, OutputStreamWriter outputstream) throws IOException{ BufferedWriter writer = new BufferedWriter(outputstream); clear(); writer.newLine(); writer.write("------ TURN "+turn+ " ------"); writer.flush(); } @Override public void printCapturedStones(int p1stones, int p2stones){ try { printCapturedStones(p1stones, p2stones,output); } catch (IOException ex) { Logger.getLogger(Go_ConsoleIO.class.getName()).log(Level.SEVERE, null, ex); } } public void printCapturedStones(int p1stones, int p2stones, OutputStreamWriter outputstream) throws IOException { BufferedWriter writer = new BufferedWriter(outputstream); writer.newLine(); writer.write("--- CAPTURED STONES ---"); writer.newLine(); writer.write("Black: "+p1stones+" White: "+p2stones); writer.newLine(); writer.flush(); } @Override public void printBoard(){ try { printBoard(output); } catch (IOException ex) { Logger.getLogger(Go_ConsoleIO.class.getName()).log(Level.SEVERE, null, ex); } } public void printBoard(OutputStreamWriter outputstream) throws IOException{ BufferedWriter writer = new BufferedWriter(outputstream); String str; writer.newLine(); size=myboard.getDimension(); writer.write(" "); for(int i=65; i<(size+65);i++){ char b = (char) i; str=" "+b+" "; writer.write(str); } writer.newLine(); for(int y = size - 1; y >= 0 ; y--) { writer.write(y + 1 + "| "); for(int x = y * size; x < size * y + size; x++) { String stone; if (myboard.getStone(x).getColor() == 1) { stone = "B"; } else if (myboard.getStone(x).getColor() == 2) { stone = "W"; } else { stone = " "; } // System.out.print("["+myboard.getStone(x).getColor()+"]"); str="["+stone+"]"; writer.write(str); } writer.newLine(); } writer.newLine(); writer.flush(); /*for(int i=0; i= 97) { x = x - 97; } else { x = x - 65; } y = y - 49; if ((x >= 0 && x < size) && (y >= 0 && y < size)) { input = x + (y * size); } else { writer.write("Please enter a valid coordinate (for example: A1)!"); } } else { writer.write("Please enter a valid coordinate (for example: A1)!"); } } /* char[] c = inputstring.toCharArray(); for(int i=0; i=97) x=x-32; x=x-65; } } else{ int num1 = c[i]-49; if(num1<9 &&num1>-1){ if(y<=0) y=num1; else y=y*10+num1; } } } } if(x<=size && y<=size) input=x+(size*y); if(input<0){ System.out.println("The position you entered could not get matched:"); } */ } return input; } @Override public int getMenu(){ int r=-1; try { r=getMenu(input, output); } catch (IOException ex) { Logger.getLogger(Go_ConsoleIO.class.getName()).log(Level.SEVERE, null, ex); } return r; } public int getMenu(InputStreamReader inputstream, OutputStreamWriter outputstream) throws IOException { BufferedReader reader = new BufferedReader(inputstream); BufferedWriter writer = new BufferedWriter(outputstream); int r=0; clear(); writer.newLine(); writer.write("----- MAIN MENU -----"); writer.newLine(); writer.write("1: Start the game"); writer.newLine(); writer.write("2: Configure game settings"); writer.newLine(); writer.write("Select an option: "); writer.flush(); while(r==0){ int num = Integer.parseInt(reader.readLine()); if (num==1 || num==2) r=num; else { writer.write("Not a valid selection, please try again: "); writer.flush(); } } return r; } @Override public int getDimension() { int r=-1; while(r==-1){ try { r=getDimension(input, output); } catch (IOException ex) { Logger.getLogger(Go_ConsoleIO.class.getName()).log(Level.SEVERE, null, ex); } } return r; } public int getDimension(InputStreamReader inputstream, OutputStreamWriter outputstream) throws IOException { BufferedReader reader = new BufferedReader(inputstream); BufferedWriter writer = new BufferedWriter(outputstream); clear(); writer.newLine(); writer.write("----- CONFIGURATION -----"); int r=0; writer.newLine(); writer.write("Choose the size of the board (must be 9, 13 or 19): "); writer.flush(); while(r!=9 || r!=13 || r!=19) { r=Integer.parseInt(reader.readLine()); if (r!=9 && r!=13 && r!=19) { writer.newLine(); writer.write("Not a valid board size, please choose 9, 13 and 19: "); writer.flush(); } } setSize(r); return r; } @Override public int getPlayer(int i){ int r=-1; while(r==-1){ try { r=getPlayer(i,input,output); } catch (IOException ex) { Logger.getLogger(Go_ConsoleIO.class.getName()).log(Level.SEVERE, null, ex); } } return r; } public int getPlayer(int i,InputStreamReader inputstream, OutputStreamWriter outputstream) throws IOException { BufferedReader reader = new BufferedReader(inputstream); BufferedWriter writer = new BufferedWriter(outputstream); // clear(); int r=0; writer.newLine(); writer.write("Enter '1' if you want the player to be human controlled, else enter '2'"); writer.flush(); if(i==1)writer.write("Player 1 (Black): "); else if(i==2)writer.write("Player 2 (White): "); writer.flush(); while(r<1 || r>2){ r=Integer.parseInt(reader.readLine()); if(r<1||r>2) { writer.newLine(); writer.write("Not a valid choice, enter '1' for human or '2' for AI: "); writer.flush(); } } return r; } public void printUndoError(){ System.out.println("Undo not allowed at this point!"); } private void clear(){ System.out.print("\033[H\033[2J"); } /* private int getInput(){ int num; Scanner input = new Scanner(System.in); try{ num= input.nextInt(); } catch(InputMismatchException ex){ System.out.println("Incorrect input: an integer is required"); return -1; } return num; }*/ private void setSize(int s){ size=s; } @Override public void printForfeitMessage(int loser){ try { printForfeitMessage(loser, input, output); } catch (IOException ex) { Logger.getLogger(Go_ConsoleIO.class.getName()).log(Level.SEVERE, null, ex); } } public void printForfeitMessage(int loser,InputStreamReader inputstream, OutputStreamWriter outputstream) throws IOException { BufferedReader reader = new BufferedReader(inputstream); BufferedWriter writer = new BufferedWriter(outputstream); System.out.println(""); switch(loser){ case 1: writer.newLine(); writer.write("----- WHITE WON THE GAME VIA FORFEIT -----"); writer.flush(); break; case 2: writer.newLine(); writer.write("----- BLACK WON THE GAME VIA FORFEIT -----"); writer.flush(); break; } System.out.println("Thanks for playing!"); } @Override public void printEndGameMessage(double p1score, double p2score){ //printEndGameMessage() } public void printEndGameMessage(double p1score, double p2score, OutputStreamWriter outputstream) { BufferedWriter writer = new BufferedWriter(outputstream); System.out.println("----- GAME HAS ENDED -----"); System.out.println(); System.out.println("Final score (captured stones + komi): BLACK " + p1score + " - " + p2score + " WHITE"); System.out.println("Thanks for playing. You can now calculate the winner!"); System.out.println(); } @Override public void printBackToMenuMessage() { Scanner scanner = new Scanner(System.in); System.out.print("Press ENTER once you are ready to return to the main menu... "); scanner.nextLine(); } @Override public void printNoMoreValidPlaysMessage(int player){ try { printNoMoreValidPlaysMessage(player,output); } catch (IOException ex) { Logger.getLogger(Go_ConsoleIO.class.getName()).log(Level.SEVERE, null, ex); } } public void printNoMoreValidPlaysMessage(int player, OutputStreamWriter outputstream) throws IOException { BufferedWriter writer = new BufferedWriter(outputstream); Scanner scanner = new Scanner(System.in); writer.newLine(); switch(player) { case(1): writer.write("Black has no more valid plays left."); writer.flush(); break; case(2): writer.write("White has no more valid plays left."); break; } writer.write("Press ENTER to confirm... "); writer.flush(); scanner.nextLine(); } @Override public void printNotValidTurnMessage() { Scanner scanner = new Scanner(System.in); System.out.print("You can't place a stone on this field! Press ENTER to confirm..."); scanner.nextLine(); } @Override public int getStartingPlayer(){ int r=-1; while(r==-1){ try { r=getStartingPlayer(input,output); } catch (IOException ex) { Logger.getLogger(Go_ConsoleIO.class.getName()).log(Level.SEVERE, null, ex); } } return r; } public int getStartingPlayer(InputStreamReader inputstream, OutputStreamWriter outputstream) throws IOException { BufferedReader reader = new BufferedReader(inputstream); BufferedWriter writer = new BufferedWriter(outputstream); writer.newLine(); writer.write("Who should start the game? (Enter 'human' or 'AI'): "); writer.flush(); boolean run = true; while (run) { String inputstring = reader.readLine(); if (inputstring.equals("human") || inputstring.equals("Human")) { return 1; } else if (inputstring.equals("ai") || inputstring.equals("AI")) { return 2; } else { writer.newLine(); writer.write("Invalid command, please try again: "); writer.flush(); } } return 0; } }