Files
java-games/TicTacToe/src/Main.java
2020-06-12 23:49:11 +02:00

229 lines
6.7 KiB
Java

import basis.*;
import writer.Writer;
import javax.swing.*;
import java.util.Objects;
class Main {
private final Frame frame;
private final Tastatur keyboard;
private final Maus mouse;
private final Pen pen;
private final Writer writer;
private int w;
private int h;
private String[][] grid;
private int[][] free;
private Main(){
frame = new Frame();
pen = new Pen(frame);
keyboard = new Tastatur();
mouse = new Maus();
writer = new Writer("TicTacToe/src/doc/probabilitys.txt");
writer.clear();
w = frame.wigth()/3;
h = frame.height()/3;
grid = new String[][] {
{"","",""},
{"","",""},
{"","",""}
};
free = new int[][] {
{-1,-1,-1},
{-1,-1,-1},
{-1,-1,-1}
};
}
private void computerMovement() {
boolean isFree = false;
while (!isFree) {
int x = Hilfe.zufall(0, 2);
int y = Hilfe.zufall(0, 2);
if (free[x][y] == -1) {
grid[x][y] = "O";
free[x][y] = 0;
isFree = true;
}
}
}
private void update(){
w = frame.wigth()/100;
h = w *100;
w = h;
frame.setSize(w,h);
w = frame.wigth()/3;
h = frame.height()/3;
frame.reset();
frame.middle();
pen.drawGrid();
place();
}
private int freeTiles(){
int value = 0;
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
if (free[i][j] == -1){
value ++;
}
}
}
return value;
}
private void minimax(String[][] oldGrid){
String [][] newGrid = oldGrid.clone();
for (int i = 0; i < 6; i++){
for (int j= 0; j < freeTiles(); j++){
System.out.println(i + " , " + j);
}
}
}
private void place(){
//row
for (int i = 0; i < 3; i++){
//collumn
for (int j = 0; j < 3; j++){
int x = (j) * w;
int y = (i) * h;
if (Objects.equals(grid[i][j], "X")){
pen.drawX(x,y);
} else if (grid[i][j].equals("O")) {
pen.drawO(x,y);
}
}
}
}
private void playerMovement(){
boolean placed = false;
while (!placed){
Hilfe.kurzePause();
if (mouse.istGedrueckt()){
double mouseX = mouse.vPosition();
double mouseY = mouse.hPosition();
mouseX = (int)(mouseX / w);
mouseY = (int)(mouseY / h);
if (free [(int)mouseX][(int)mouseY] == -1){
grid [(int)mouseX][(int)mouseY] = "X";
free [(int)mouseX][(int)mouseY] = 0;
placed = true;
} else {
JOptionPane.showMessageDialog(null, "This field is not free!", "Warning", JOptionPane.ERROR_MESSAGE);
Hilfe.warte(250);
if (mouse.istGedrueckt()){
mouseX = mouse.vPosition();
mouseY = mouse.hPosition();
mouseX = (int) (mouseX / w);
mouseY = (int) (mouseY / h);
if (free[(int) mouseX][(int) mouseY] == -1) {
grid[(int) mouseX][(int) mouseY] = "X";
free[(int) mouseX][(int) mouseY] = 0;
}
}
}
}
}
}
private String checkWin(){
for (int i = 0; i < 3; i++){
//vertical
if ((Objects.equals(grid[i][0], grid[i][1])) && (grid[i][0].equals(grid[i][2])) && (grid[i][1].equals(grid[i][2])) && !grid[i][0].equals("")) {
pen.drawWin(w/2 - 15, i* h+h/2, w*3-w/2+15, i*h+h/2);
return grid[i][0]+ " won the game!";
}
//horizontal
else if ((Objects.equals(grid[0][i], grid[1][i])) && (Objects.equals(grid[0][i], grid[2][i])) && (grid[1][i].equals(grid[2][i])) && !Objects.equals(grid[0][i], "")){
pen.drawWin(i * w+w/2, h/2-15, i * w+w/2, 3*h-h/2+15 );
return grid[0][i]+ " won the game!";
}
//diagonal: left to right
else if ((grid[0][0].equals(grid[1][1])) && (Objects.equals(grid[1][1], grid[2][2])) && (Objects.equals(grid[0][0], grid[2][2])) && !Objects.equals(grid[0][0], "")){
pen.drawWin(w/2, h/2, w*3-w/2,h*3-h/2);
return grid[0][0] + " won the game!";
}
//diagonal: right to left
else if ((Objects.equals(grid[2][0], grid[1][1])) && (Objects.equals(grid[1][1], grid[0][2])) && (Objects.equals(grid[2][0], grid[0][2])) && !Objects.equals(grid[2][0], "")){
pen.drawWin(w*3-w/2,h/2, w/2, h*3-h/2);
return grid[0][2] + " won the game!";
}
}
return "tie";
}
private void run(){
pen.drawGrid();
for (int i = 0; i < 9; i++){
if (w != frame.wigth()/3 || h != frame.height()/3){
update();
}
System.out.println(frame.wigth());
System.out.println(frame.height());
Hilfe.kurzePause();
//minimax(grid);
computerMovement();
place();
if (!checkWin().equals("tie") || freeTiles() == 0){
break;
}
playerMovement();
place();
if (!checkWin().equals("tie") || freeTiles() == 0){
break;
}
Hilfe.warte(500);
}
if (checkWin().equals("tie")){
pen.drawWin(0, 0, frame.wigth(), frame.height());
pen.drawWin(frame.wigth(), 0, 0, frame.height());
}
writer.write(checkWin()+"\n", true);
while (true){
Hilfe.kurzePause();
if (keyboard.istGedrueckt('f')){
frame.reset();
grid = new String[][] {
{"","",""},
{"","",""},
{"","",""}
};
free = new int[][] {
{-1,-1,-1},
{-1,-1,-1},
{-1,-1,-1}
};
run();
} else if (keyboard.istGedrueckt(Zeichen.ESC)){
System.exit(0);
}
}
}
public static void main(String[] args){
Main m;
m = new Main();
m.run();
}
}