Hallo zusammen,
ich habe in den letzten paar Stunden ein Tic Tac Toe Spiel programmiert.
Leider habe ich festgestellt, dass die Logik, welcher Zug nun der Beste ist, sehr lang geworden ist und nur „Defensive“ Züge betrachtet.
Gibt es eine Möglichkeit, den Code kürzer zufassen und die Unterscheidung zwischen "Defensiven und Offensiven" Zügen entscheiden zu lassen?
Ich würde mich über eine Antwort freuen.
Hier ist das entscheidende Codesegment:
Ich würde mich auch über allgemeine Verbesserungstipps freuen, um meinen Codestil zu verbessern.
ich habe in den letzten paar Stunden ein Tic Tac Toe Spiel programmiert.
Leider habe ich festgestellt, dass die Logik, welcher Zug nun der Beste ist, sehr lang geworden ist und nur „Defensive“ Züge betrachtet.
Gibt es eine Möglichkeit, den Code kürzer zufassen und die Unterscheidung zwischen "Defensiven und Offensiven" Zügen entscheiden zu lassen?
Ich würde mich über eine Antwort freuen.
Hier ist das entscheidende Codesegment:
Java:
import GUI.GUI;
import static GUI.GUI.*;
import GUI.Winner;
import static java.lang.Thread.*;
/**
* {@code @Author} Tim
* {@code @Version} 1.0.2
*/
public class Game {
GUI frame;
public Game() {
frame = new GUI();
while (true) {
if (frame.newButtonClicked) {
frame.newButtonClicked = false;
ausgeben(spiel);
if (getXgewonnen()) {
xgewonnen = true;
System.out.println("X Gewonnen \n Herzlichen Glückwunsch");
winner = "Winner: X \n Herzlichen Glückwunsch";
new Winner();
} else if (get0gewonnen()) {
ogewonnen = true;
System.out.println("O Gewonnen \n Herzlichen Glückwunsch");
winner = "Winner: O \n Herzlichen Glückwunsch";
new Winner();
} else {
//doComputerMove();
dobestComputerMove();
try {
sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (get0gewonnen()){
ogewonnen = true;
System.out.println("O Gewonnen \n Herzlichen Glückwunsch");
winner = "Winner: O \n Herzlichen Glückwunsch";
new Winner();
}
}
}
try {
sleep(1);
}catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
private void doComputerMove() {
try {
int zufallszahl1 = (int) (Math.random() * 3);
int zufallszahl2 = (int) (Math.random() * 3);
if (computermovelegit(zufallszahl1, zufallszahl2)) {
spiel[zufallszahl1][zufallszahl2] = 2;
ausgeben(spiel);
frame.doupdate();
} else {
doComputerMove();
}
} catch (StackOverflowError ignored) {
}
}
private void dobestComputerMove(){
try {
if (spiel[0][0] == 1 && spiel[0][1] == 1){
if (computermovelegit(0,2)){
spiel[0][2] = 2;
frame.doupdate();
}
} else if (spiel[0][1] == 1 && spiel[0][2] == 1) {
if (computermovelegit(0,0)){
spiel[0][0] = 2;
frame.doupdate();
}
} else if (spiel[1][0] == 1 && spiel[1][1] == 1) {
if (computermovelegit(1,2)){
spiel[1][2] = 2;
frame.doupdate();
}
} else if (spiel[1][1] == 1 && spiel[1][2] == 1) {
if (computermovelegit(1,0)){
spiel[1][0] = 2;
frame.doupdate();
}
}else if (spiel[2][0] == 1 && spiel[2][1] == 1) {
if (computermovelegit(2,2)){
spiel[2][2] = 2;
frame.doupdate();
}
} else if (spiel[2][1] == 1 && spiel[2][2] == 1) {
if (computermovelegit(2,0)){
spiel[2][0] = 2;
frame.doupdate();
}
}else if (spiel[0][0] == 1 && spiel[1][1] == 1) {
if (computermovelegit(2,2)){
spiel[2][2] = 2;
frame.doupdate();
}
} else if (spiel[2][2] == 1 && spiel[1][1] == 1) {
if (computermovelegit(0,0)){
spiel[0][0] = 2;
frame.doupdate();
}
}else if (spiel[0][2] == 1 && spiel[1][1] == 1) {
if (computermovelegit(2,0)){
spiel[2][0] = 2;
frame.doupdate();
}
} else if (spiel[2][0] == 1 && spiel[1][1] == 1) {
if (computermovelegit(0,2)){
spiel[0][2] = 2;
frame.doupdate();
}
}else if (spiel[0][0] == 1 && spiel[1][0] == 1) {
if (computermovelegit(2,0)){
spiel[2][0] = 2;
frame.doupdate();
}
} else if (spiel[2][0] == 1 && spiel[1][0] == 1) {
if (computermovelegit(0,0)){
spiel[0][0] = 2;
frame.doupdate();
}
}else if (spiel[0][1] == 1 && spiel[1][1] == 1) {
if (computermovelegit(2,1)){
spiel[2][1] = 2;
frame.doupdate();
}
} else if (spiel[2][1] == 1 && spiel[1][1] == 1) {
if (computermovelegit(0,1)){
spiel[0][1] = 2;
frame.doupdate();
}
}else if (spiel[0][2] == 1 && spiel[1][2] == 1) {
if (computermovelegit(2,2)){
spiel[2][2] = 2;
frame.doupdate();
}
} else if (spiel[2][2] == 1 && spiel[1][2] == 1) {
if (computermovelegit(0,2)){
spiel[0][2] = 2;
frame.doupdate();
}
}else {
doComputerMove();
}
}catch (Exception ignored){
}
}
public void ausgeben(int[][] daten) {
for (int[] ints : daten) {
for (int j = 0; j < daten.length; j++) {
System.out.print("\t" + ints[j]);
}
System.out.println();
}
System.out.println();
System.out.println();
}
private boolean computermovelegit(int zahl1, int zah2){
if (spiel[zahl1][zah2] == 1) {
return false;
} else return spiel[zahl1][zah2] != 2;
}
private boolean getXgewonnen(){
if (spiel[0][0] == 1 && spiel[0][1] == 1 && spiel[0][2] == 1) {
return true;
} else if (spiel[1][0] == 1 && spiel[1][1] == 1 && spiel[1][2] == 1) {
return true;
} else if (spiel[2][0] == 1 && spiel[2][1] == 1 && spiel[2][2] == 1) {
return true;
} else if (spiel[0][0] == 1 && spiel[1][1] == 1 && spiel[2][2] == 1) {
return true;
} else return spiel[0][2] == 1 && spiel[1][1] == 1 && spiel[2][0] == 1;
}
private boolean get0gewonnen(){
if (spiel[0][0] == 2 && spiel[0][1] == 2 && spiel[0][2] == 2) {
return true;
} else if (spiel[1][0] == 2 && spiel[1][1] == 2 && spiel[1][2] == 2) {
return true;
} else if (spiel[2][0] == 2 && spiel[2][1] == 2 && spiel[2][2] == 2) {
return true;
} else if (spiel[0][0] == 2 && spiel[1][1] == 2 && spiel[2][2] == 2) {
return true;
} else return spiel[0][2] == 2 && spiel[1][1] == 2 && spiel[2][0] == 2;
}
}
Ich würde mich auch über allgemeine Verbesserungstipps freuen, um meinen Codestil zu verbessern.