Browse Source

code review with kajetan

Marvin Löschenkohl 3 years ago
parent
commit
9ae40ca94a
4 changed files with 179 additions and 202 deletions
  1. 1 0
      .gitignore
  2. 25 0
      src/ConsoleReader.java
  3. 71 110
      src/Main.java
  4. 82 92
      src/PlayField.java

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+/bin/

+ 25 - 0
src/ConsoleReader.java

@@ -0,0 +1,25 @@
+import java.util.Scanner;
+
+public class ConsoleReader implements AutoCloseable {
+    private Scanner scanner = new Scanner(System.in);
+
+    public int readInt(String error) {
+        while(true) {
+            String s = scanner.nextLine();
+            try {
+                return Integer.parseInt(s);
+            } catch(NumberFormatException nfe) {
+                System.out.println(error);
+            }
+        }
+    }
+
+    public String readLine() {
+        return scanner.nextLine();
+    }
+
+    @Override
+    public void close() {
+        scanner.close();
+    }
+}

+ 71 - 110
src/Main.java

@@ -1,114 +1,75 @@
-import java.util.Scanner;
-
 public class Main {
+    public static void main(String[] args) {
+        PlayField field = new PlayField();
+        try(ConsoleReader cr = new ConsoleReader()) {
+            do {
+                doGame(cr, field);
+            } while(askPlayAgain(cr, field));
+        }
+    }
+
+    public static void doGame(ConsoleReader cr, PlayField field) {
+        while(true) {
+            int nextPos = getPlayerTurn(cr, field);
+
+            field.setPos(nextPos, 1);
+            field.print();
+            if(hasGameEnded(field, 1)) {
+                break;
+            }
+
+            // Opponent's turn
+            System.out.println("Opponents turn:");
+            field.oppMove();
+            field.print();
+            if(hasGameEnded(field, 2)) {
+                break;
+            }
+        }
+    }
+
+    public static boolean hasGameEnded(PlayField field, int player) {
+        if(field.hasWon(player)) {
+            printWinner(player);
+            return true;
+        }
+        if(field.isDraw()) {
+            System.out.println("Draw.");
+            return true;
+        }
+        return false;
+    }
+
+    public static int getPlayerTurn(ConsoleReader cr, PlayField field) {
+        String s = "Where do you want to set your 'x'? (1-9)";
+        while(true) {
+            System.out.println(s);
+            int nextPos = cr.readInt(s) - 1;
+            if(nextPos >= 0 && nextPos <= 8 && field.isFree(nextPos)) {
+                return nextPos;
+            }
+        }
+    }
 
-	public static void main(String[] args) {
-		
-		PlayField field = new PlayField();
-		int nextPos;
-		boolean won;
-		Scanner myScanner = new Scanner(System.in);
-		
-		do {
-			
-			System.out.println("Where do you want to set your 'x'? (1-9)");
-			
-			do {
-				//Check input
-				if(!myScanner.hasNextInt()) {
-					System.out.println("Invalid input. Try again.");
-					myScanner.nextLine();
-					continue;
-				}
-				nextPos = myScanner.nextInt();
-				if(nextPos < 1 || nextPos > 9) {
-					System.out.println("Invalid int. 1 to 9 expected.");
-					myScanner.nextLine();
-					continue;
-				}
-				if(field.getPos(nextPos) != 0) {
-					System.out.println("Position not free.");
-					myScanner.nextLine();
-					continue;
-				}
-				
-				//Player's turn
-				won = field.updatePos(nextPos, 1);
-				if(won) {
-					printWinner(1);
-					if(!askPlayAgain(myScanner)) {
-						myScanner.close();
-						System.exit(0);
-					}
-					field.resetField();
-					break;
-					
-				}
-				if(field.isDraw()) {
-					System.out.println("Draw.");
-					if(!askPlayAgain(myScanner)) {
-						System.out.println("Game closed.");
-						myScanner.close();
-						System.exit(0);
-					}
-					field.resetField();
-					break;
-				}
-				
-				//Opponent's turn
-				System.out.println("Opponents turn:");
-				won = field.oppMove();
-				if(won) {
-					printWinner(2);
-					if(!askPlayAgain(myScanner)) {
-						System.out.println("Game closed.");
-						myScanner.close();
-						System.exit(0);
-					}
-					field.resetField();
-					break;
-					
-				}
-				if(field.isDraw()) {
-					System.out.println("Draw.");
-					if(!askPlayAgain(myScanner)) {
-						System.out.println("Game closed.");
-						myScanner.close();
-						System.exit(0);
-					}
-					field.resetField();
-					break;
-				}
-				
-				break;
-				
-			} while(true);
+    public static void printWinner(int player) {
+        if(player == 1) {
+            System.out.println("Player 'x' has won.");
+        } else {
+            System.out.println("Player 'o' has won.");
+        }
+    }
 
-		} while (true);
-		
-	}
-	
-	public static void printWinner(int player) {
-		if(player == 1) {
-			System.out.println("Player 'x' has won.");
-		} else {
-			System.out.println("Player 'o' has won.");
-		}
-	}
-	
-	private static boolean askPlayAgain(Scanner in) {
-		String again;
-		System.out.println("New game? Y/N");
-		do {
-			again = in.next();
-			if(again.equals("Y")) {
-				return true;
-			} else if(again.equals("N")) {
-				return false;
-			} else {
-				System.out.println("Invalid input. Try again.");
-			}
-		} while(true);
-	}	
-	
+    private static boolean askPlayAgain(ConsoleReader cr, PlayField field) {
+        while(true) {
+            System.out.println("New game? Y/N");
+            String s = cr.readLine();
+            if(s.equals("Y")) {
+                field.reset();
+                return true;
+            } else if(s.equals("N")) {
+                System.out.println("Game closed.");
+                return false;
+            }
+        }
+    }
 }

+ 82 - 92
src/PlayField.java

@@ -1,96 +1,86 @@
 import java.util.Random;
 
 public class PlayField {
-	int[] field = new int[9];
-	
-	//updates the field after a players move
-	//returns true if won
-	public boolean updatePos(int pos, int player) {
-		field[pos - 1] = player;
-		printField();
-		return hasWon(player);
-	}
-	
-	public boolean isDraw() {
-		for(int i = 0; i < 9; i++) {
-			if(field[i] == 0) {
-				return false;
-			}
-		}
-		return true;
-	}
-	
-	public boolean hasWon(int player) {
-		//Waagrecht
-		if(field[0] == player && field[1] == player && field[2] == player) {
-			return true;
-		}
-		if(field[3] == player && field[4] == player && field[5] == player) {
-			return true;
-		}
-		if(field[6] == player && field[7] == player && field[8] == player) {
-			return true;
-		}
-		//Senkrecht
-		if(field[0] == player && field[3] == player && field[6] == player) {
-			return true;
-		}
-		if(field[1] == player && field[4] == player && field[7] == player) {
-			return true;
-		}
-		if(field[2] == player && field[5] == player && field[8] == player) {
-			return true;
-		}
-		//Diagonal
-		if(field[4] == player) {
-			if(field[0] == player && field[8] == player) {
-				return true;
-			}
-			if(field[2] == player && field[6] == player) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	public void resetField() {
-		for(int i = 0; i < 9; i++) {
-			field[i] = 0;
-		}
-	}
-	
-	//the opponent player moves
-	//updates the field
-	//returns true if won
-	public boolean oppMove() {
-		Random move = new Random();
-		int pos = 1 + move.nextInt(9);
-		while(getPos(pos) != 0 ) {
-			pos = 1 + move.nextInt(9);
-		}
-		return updatePos(pos, 2);
-	}
-	
-	public int getPos(int pos) {
-		return field[pos - 1];
-	}
-	
-	public void printField() {
-		String sign;
-		for(int h = 0; h < 3; h++) {
-			for(int i = 0; i < 3; i++) {
-				int a = field[i + 3 * h];
-				if(a == 0) {
-					sign = " ";
-				} else if(a == 1) {
-					sign = "x";
-				} else {
-					sign = "o";
-				}
-				System.out.print("[" + sign + "]");
-			}
-			System.out.println(); //Zeilenumbruch
-		}
-	}
-	
+    private final int[] fields = new int[9];
+    private final Random move = new Random();
+
+    public void setPos(int pos, int player) {
+        fields[pos] = player;
+    }
+
+    public boolean isDraw() {
+        for(int i = 0; i < 9; i++) {
+            if(fields[i] == 0) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public boolean hasWon(int player) {
+        // Waagrecht
+        for(int i = 0; i < 9; i += 3) {
+            if(fields[i] == player && fields[i + 1] == player && fields[i + 2] == player) {
+                return true;
+            }
+        }
+        // Senkrecht
+        for(int i = 0; i < 3; i++) {
+            if(fields[i] == player && fields[i + 3] == player && fields[i + 6] == player) {
+                return true;
+            }
+        }
+        // Diagonal
+        if(fields[4] == player) {
+            if(fields[0] == player && fields[8] == player) {
+                return true;
+            }
+            if(fields[2] == player && fields[6] == player) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public void reset() {
+        for(int i = 0; i < 9; i++) {
+            fields[i] = 0;
+        }
+    }
+
+    // the opponent player moves
+    // updates the field
+    public void oppMove() {
+        while(true) {
+            int pos = move.nextInt(9);
+            if(isFree(pos)) {
+                setPos(pos, 2);
+                return;
+            }
+        }
+    }
+
+    public boolean isFree(int pos) {
+        return fields[pos] == 0;
+    }
+
+    private void printSlot(String sign) {
+        System.out.print("[" + sign + "]");
+    }
+
+    public void print() {
+        for(int y = 0; y < 3; y++) {
+            for(int x = 0; x < 3; x++) {
+                int a = fields[x + 3 * y];
+                if(a == 0) {
+                    printSlot(" ");
+                } else if(a == 1) {
+                    printSlot("x");
+                } else {
+                    printSlot("o");
+                }
+            }
+            System.out.println(); // Zeilenumbruch
+        }
+    }
 }