Browse Source

Init TicTacToe

Marvin Löschenkohl 3 years ago
commit
1733f3fe94
2 changed files with 210 additions and 0 deletions
  1. 114 0
      src/Main.java
  2. 96 0
      src/PlayField.java

+ 114 - 0
src/Main.java

@@ -0,0 +1,114 @@
+import java.util.Scanner;
+
+public class Main {
+
+	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);
+
+		} 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);
+	}	
+	
+}

+ 96 - 0
src/PlayField.java

@@ -0,0 +1,96 @@
+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
+		}
+	}
+	
+}