• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Gra kółko i krzyżyk- problem z wyświetlaniem tablicy podsumowującej kolejne ruchy + ocena kodu

Object Storage Arubacloud
0 głosów
187 wizyt
pytanie zadane 21 marca 2020 w Java przez marzena12345 Użytkownik (770 p.)

Witam,

napisałam grę kółko i krzyżyk. Chciałam, żeby po zakończeniu gry wyświetliły się wszystkie ruchy po kolei jakie zostały wykonane w grze(pętla for each na końcu Main), niestety nie wiem jak to napisać, żeby każdy kolejny move był elementem mojej tablicy i funkcje w klasie Statistic działały. Program już mówi o błędzie w linijce 66 klasy Main (pierwsze użycie get.Statistic).

Proszę też o zerknięcie na kod, co poprawić, generalnie zastanawiałam się jeszcze nad klasą board. 

package pl.com.marzena.first;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        System.out.println("Witaj w grze kółko i krzyżyk");
        System.out.println("Położenie pól w planszy kształtuje się jak na obrazku poniżej, gdzie pierwsza cyfra ozanacza położenie poziome, druga pionowe.");
        System.out.println("0, 0" + "|" + "0, 1" + "|" + "0, 2");
        System.out.println("----+----+----");
        System.out.println("1, 0" + "|" + "1, 1" + "|" + "1, 2");
        System.out.println("----+----+----");
        System.out.println("2, 0" + "|" + "2, 1" + "|" + "2, 2");

        Player[] players = new Player[2];


        System.out.println("Podaj imię gracza nr 1: ");
        String firstName = scan.nextLine();
        players[0] = new Player(firstName);

        System.out.println("Podaj imię gracza nr 2: ");
        String secondName = scan.nextLine();
        players[1] = new Player(secondName);
        System.out.println("Losuję gracza...");


        Game game = new Game(players);
        Player playerWhoStarts = game.getPlayerWhoStarts();
        System.out.println("Zaczyna gracz: " + playerWhoStarts.getName());

        int i = 0;

        Player secondPlayer;
        if (players[0] == playerWhoStarts) {
            secondPlayer = players[1];
        } else {
            secondPlayer = players[0];
        }
        Integer coordinateHorizontal;
        Integer coordinateVertical;
//        Move move = null;
        System.out.println(i);

        do {
            char value;
            Player playerWhoMoves;
            if (i % 2 == 0) {
                playerWhoMoves = playerWhoStarts;
                System.out.println("Gracz: " + playerWhoMoves.getName() + "-krzyżyk");
                value = 'X';
            } else {
                playerWhoMoves = secondPlayer;
                System.out.println("Gracz: " + playerWhoMoves.getName() + "- kółko");
                value = 'O';
            }

            System.out.println("Podaj lokalizację poziomą: ");
            coordinateHorizontal = scan.nextInt();
            System.out.println("Podaj lokalizację pionową: ");
            coordinateVertical = scan.nextInt();
            Move move = new Move(playerWhoMoves, coordinateHorizontal, coordinateVertical, value);
            game.getStatistic().add(move, i);
            if (move.checkIfCoordinatesAreCorrect(coordinateHorizontal, coordinateVertical)) {
                if (!game.checkTheFieldIsEmpty(coordinateHorizontal, coordinateVertical)) {
                    game.setField(coordinateHorizontal, coordinateVertical, value);
                    System.out.println(game.getField(0, 0) + "|" + game.getField(0, 1) + "|" + game.getField(0, 2));
                    System.out.println("-+-+-");
                    System.out.println(game.getField(1, 0) + "|" + game.getField(1, 1) + "|" + game.getField(1, 2));
                    System.out.println("-+-+-");
                    System.out.println(game.getField(2, 0) + "|" + game.getField(2, 1) + "|" + game.getField(2, 2));
                    if (game.checkAllFieldsForWin()) {
                        System.out.println("Wygrał gracz: " + playerWhoMoves.getName());
                        System.exit(0);
                    } else if (game.checkBoardForDeadHeat()) {
                        System.out.println("Remis. Koniec gry");
                        System.exit(0);
                    }
                    i++;
                } else {
                    System.out.println("Ta pozycja jest już zajęta, ponów ruch");
                }
            } else {
                System.out.println("Podałeś błędną lokalizację, ponów ruch");
            }

        } while (!game.checkAllFieldsForWin() || !game.checkBoardForDeadHeat());

        for (Move mov : game.getStatistic().findAll())
            System.out.println(mov.getPlayer().getName() + " " + mov.getCoordinateHorizontal() + " " + mov.getCoordinateVertical() + " " + mov.getValue());

    }
}

import java.util.Random;

public class Game {
    private Player[] players;
    private Statistic statistic;
    private char[][] board = new char[3][3];

    public Game(Player[] players) {
        this.players = players;
    }

    public Statistic getStatistic() {
        return statistic;
    }

    public Player getPlayerWhoStarts() {
        Random random = new Random();
        int indexOfPlayer = random.nextInt(players.length);
        return players[indexOfPlayer];
    }

    public void setField(Integer horizontalCoordinate, Integer verticalCoordinate, char value) {
        board[horizontalCoordinate][verticalCoordinate] = value;
    }

    public char getField(Integer horizontalCoordinate, Integer verticalCoordinate) {
        return board[horizontalCoordinate][verticalCoordinate];
    }

    public boolean checkIfTheFieldsAreTheSame(char firstField, char secondField, char thirdField) {
        return (firstField != '\u0000') && (firstField == secondField) && (secondField == thirdField);
    }

    public boolean checkColumnsForWin() {
        for (int i = 0; i <= 2; i++) {
            if (checkIfTheFieldsAreTheSame(board[i][0], board[i][1], board[i][2])) {
                return true;
            }
        }
        return false;
    }

    public boolean checkRowForWin() {
        for (int i = 0; i <= 2; i++) {
            if (checkIfTheFieldsAreTheSame(board[0][i], board[1][0], board[2][i])) return true;
        }
        return false;
    }

    public boolean checkDiagonalsForWin() {
        return ((checkIfTheFieldsAreTheSame(board[0][0], board[1][1], board[2][2])) || (checkIfTheFieldsAreTheSame(board[0][2], board[1][1], board[2][0])));
    }

    public boolean checkBoardForDeadHeat() {
        char[][] boardSecondary = new char[3][3];
        if (getField(0, 0) != '\u0000' && getField(0, 1) != '\u0000' && getField(0, 2) != '\u0000' && getField(1, 0) != '\u0000' && getField(1, 1) != '\u0000' && getField(1, 2) != '\u0000' && getField(2, 0) != '\u0000' && getField(2, 1) != '\u0000' && getField(2, 2) != '\u0000') {
            return true;
        }
        return false;
    }

    public boolean checkAllFieldsForWin() {
        if (checkColumnsForWin() || checkDiagonalsForWin() || checkRowForWin()) {
            return true;
        }
        return false;
    }

    public boolean checkTheFieldIsEmpty(Integer horizontalCoordinate, Integer verticalCoordinate) {
        return  (board[horizontalCoordinate][verticalCoordinate] == 'X' || board[horizontalCoordinate][verticalCoordinate] == 'O');

    }
}


public class Move {
    private Player player;
    private Integer coordinateHorizontal;
    private Integer coordinateVertical;
    private char value;


    public Move(Player player, Integer coordinateHorizontal, Integer coordinateVertical, char value) {
        this.player = player;
        this.coordinateHorizontal = coordinateHorizontal;
        this.coordinateVertical = coordinateVertical;
        this.value = value;
    }

    public Player getPlayer() {
        return player;
    }

    public Integer getCoordinateHorizontal() {
        return coordinateHorizontal;
    }

    public Integer getCoordinateVertical() {
        return coordinateVertical;
    }

    public char getValue() {
        return value;
    }

    public boolean checkIfCoordinatesAreCorrect(Integer coordinateHorizontal, Integer coordinateVertical) {
        return (coordinateHorizontal <= 2 && coordinateHorizontal >= 0 && coordinateVertical <= 2 && coordinateVertical >= 0);
    }
}


public class Player {
    private String name;

    public Player(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}


public class Statistic {
    private Move[] moves;

    public Statistic(Move[] moves) {
        this.moves = moves;

    }

    public void add(Move move, int i) {
        moves[i] = move;
    }

    public Move[] findAll() {
        return moves;
    }
}

 

1 odpowiedź

0 głosów
odpowiedź 23 marca 2020 przez mbabane Szeryf (79,280 p.)

Prawdopodobnie nie inicjalizujesz tablicy w tym Statistic, o ile w ogóle tworzysz obiekt Statisitc dla klasy Game (a przynajmniej nie mogę się tego dopatrzeć w kodzie).

Pamiętaj, że jak dostajesz błąd w konsoli (stack trace) to warto go tu wrzucić.

 

Spróbuj jeszcze wyeliminować jawne podawanie gdzie ma być wstawiany kolejny ruch:

public void add(Move move, int i)

W zasadzie to klasa Statistic może tego pilnować, bo nowy ruch raczej na pewno będzie dodany jako kolejny element.

 

Sprawdź też jak używać ArrayList bo tutaj w sumie było by wygodniej z użyciem tej klasy niż, ze zwykłą tablicą - choć zwykła tablica w tym przypadku też jest dość rozsądna.

Podobne pytania

0 głosów
1 odpowiedź 780 wizyt
pytanie zadane 7 lipca 2016 w C i C++ przez L33TT12 Gaduła (3,950 p.)
0 głosów
1 odpowiedź 835 wizyt
0 głosów
3 odpowiedzi 1,344 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...