0

I am currently working on a little game of tic tac toe. The game is basically finished, but currently I am experiencing an issue where my input is not being acknowledged by the scanner at completely random points. It will work sometimes, but for no reason that is apparent to me, it will just stop working entirely.

Sorry for the German strings also. Feel free to ask any questions if something is not clear or needs to be translated, but I think it's mostly self-explanatory. I'm still a beginner so any and all feedback is welcome!

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class TicTacToe {

        static ArrayList<Integer> SpielerPositionen = new ArrayList<Integer>();
        static ArrayList<Integer> CpuPositionen = new ArrayList<Integer>();
        
        public static void main(String[] args) {
                
                char[][] spielFeld = {{' ','|',' ','|',' '},
                                      {'-','+','-','+','-'},
                                      {' ','|',' ','|',' '},
                                      {'-','+','-','+','-'},
                                      {' ','|',' ','|',' '}}; 
                
                erstelleSpielFeld(spielFeld);
                
                while(true) {
                        Scanner scan = new Scanner(System.in);
                        System.out.println("Wähle ein freies Feld aus, wo du dein Zeichen setzt. (1 - 9)");
                        int spielerPos = scan.nextInt();
                        while(SpielerPositionen.contains(spielerPos) || CpuPositionen.contains(spielerPos)) {
                                System.out.println("Diese Position ist bereits besetzt! Wählen Sie ein freies Feld aus.");
                                spielerPos = scan.nextInt();
                        }
                        setzeZeichen(spielFeld, spielerPos, "Spieler");
                        
                           String ergebnis = checkSieger();
                           if(ergebnis.length() > 0) {
                                System.out.println(ergebnis);
                                erstelleSpielFeld(spielFeld);
                                  break;
                        }
                                
                        int zufall = (int) (Math.random()*9)+1;
                        int cpuPos = zufall;
                        while(SpielerPositionen.contains(cpuPos) || CpuPositionen.contains(cpuPos)) {
                                cpuPos = zufall;
                        }
                        setzeZeichen(spielFeld, cpuPos, "Cpu");
                        
                        erstelleSpielFeld(spielFeld);
                        
                        ergebnis = checkSieger();
                        if(ergebnis.length() > 0) {
                               System.out.println(ergebnis);
                               erstelleSpielFeld(spielFeld);
                                break;                        
                        }
      }
         }
        


        public static void erstelleSpielFeld(char[][] spielFeld) {
                for(char[] zeile : spielFeld) {
                        for(char spalte : zeile) {
                                System.out.print(spalte);
                        }
                        System.out.println();
                }
        }
        
        public static void setzeZeichen(char[][] spielFeld, int pos, String spieler) {
                
                char symbol = ' ';
                
                if(spieler.equals("Spieler")) {
                        symbol = 'X';
                        SpielerPositionen.add(pos);
                }else if(spieler.equals("Cpu")) {
                        symbol = 'O';
                        CpuPositionen.add(pos);
                }
                
                switch(pos) {
                        case 1:
                                spielFeld[0][0] = symbol;
                                break;
                        case 2:
                                spielFeld[0][2] = symbol;
                                break;
                        case 3:
                                spielFeld[0][4] = symbol;
                                break;
                        case 4:
                                spielFeld[2][0] = symbol;
                                break;
                        case 5:
                                spielFeld[2][2] = symbol;
                                break;
                        case 6:
                                spielFeld[2][4] = symbol;
                                break;
                        case 7:
                                spielFeld[4][0] = symbol;
                                break;
                        case 8:
                                spielFeld[4][2] = symbol;
                                break;
                        case 9:
                                spielFeld[4][4] = symbol;
                                break;
                        default:
                                break;
                }
        }
            public static String checkSieger() {
                
                List Zeile1 = Arrays.asList(1, 2, 3);
                List Zeile2 = Arrays.asList(4, 5, 6);
                List Zeile3 = Arrays.asList(7, 8, 9);
                List Spalte1 = Arrays.asList(1, 4, 7);
                List Spalte2 = Arrays.asList(2, 5, 8);
                List Spalte3 = Arrays.asList(3, 6, 9);
                List KreuzObenUnten = Arrays.asList(1, 5, 9);
                List KreuzUntenOben = Arrays.asList(3, 5, 7);
                
                ArrayList<List> siegen = new ArrayList<List>();
                siegen.add(Zeile1);
                siegen.add(Zeile2);
                siegen.add(Zeile3);
                siegen.add(Spalte1);
                siegen.add(Spalte2);
                siegen.add(Spalte3);
                siegen.add(KreuzObenUnten);
                siegen.add(KreuzUntenOben);
                
                for(List l : siegen) {
                    if(SpielerPositionen.containsAll(l)) {
                        return "Herzlichen Glückwunsch, Sie haben das Spiel gewonnen!";
                    }else if(CpuPositionen.containsAll(l)) {
                        return "Der Computer hat das Spiel gewonnen!";
                    }else if(SpielerPositionen.size() + CpuPositionen.size() == 9) {
                        return "Das Spiel geht Unentschieden aus!";
                    }
                }
                    return "";
            }
}
g0ggy
  • 1
  • it's working for me can you add an example when it's not woking – deadshot Jul 05 '20 at 12:03
  • Voting to close because debugging questions should contain the expected behavior, the actual behavior, and debug output. Also consider the tips given here https://stackoverflow.com/questions/25385173 and https://stackoverflow.com/help/minimal-reproducible-example. Also code contains to much irrelevant lines, no effort done to create a minimal example. Maybe this is related https://stackoverflow.com/questions/43573350/java-scanner-does-not-expect-next-input-ignores-nextline. Also should not create new scanner within the loop on every iteration. – tkruse Jul 05 '20 at 13:39

0 Answers0