Nano Hash - криптовалюты, майнинг, программирование

Как использовать логическое значение в другом методе?

Я программирую игру Tic Tac Toe, и, похоже, она работает довольно хорошо. Что я хочу реализовать сейчас, так это возможность перезапустить игру после того, как игра была выиграна, проиграна или закончилась ничьей. Чтобы получить желаемые результаты, я внедрил весь основной метод в цикл while (imGange), когда игра закончилась, цикл должен быть установлен в false. Чтобы добиться этого, я решил установить логические значения imGange и cool в false внутри всех операторов if в методе checkWinner(). Как только я набираю cool = false, лампочка с ошибкой: Unreachable code выскакивает в строке 136, даже если логические значения объявлены для всего класса TicTacToe.

Что я могу с этим поделать? Заранее спасибо!

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> playerPositions = new ArrayList<Integer>();//List<Bitch> = List of Bitch, or List of Integers in diesem BSP
    static ArrayList<Integer> cpuPositions = new ArrayList<Integer>();
    
    public static void main (String[] args) {
        
        //boolean imGange = true;
        
        while(imGange) {
            char[][] gameBoard = {{' ','|',' ', '|',' '}, {'-','+','-', '+','-'}, {' ','|',' ', '|',' '}, {'-', '+','-', '+','-'}, {' ','|',' ', '|',' '}};//2dimensionales Array mit jeder {} für eine "row" und die Symbole zwischendrin
            
            printGameBoard(gameBoard);//damit keine rote Linie unter row : gameBoard
            
            //boolean cool = true;
            
            while(cool) {
                Scanner scan = new Scanner(System.in);
                System.out.println("Enter your placement (1-9):");
                int pos = scan.nextInt();
                while(playerPositions.contains(pos) || cpuPositions.contains(playerPositions)) {
                    System.out.println("Position taken! Enter another Position!");
                    pos = scan.nextInt();
                }
                
                //System.out.println(pos);
                
                placePiece(gameBoard, pos, "player");
                
                Random rand = new Random();
                int cpuPos = rand.nextInt(9) +1;// 1-9
                while(playerPositions.contains(cpuPos) || cpuPositions.contains(cpuPos)) {
                    cpuPos = rand.nextInt(9) +1;// 1-9
                }
                placePiece(gameBoard, cpuPos, "CPU");
                
                printGameBoard(gameBoard);
                
                String result = checkWinner();
                System.out.println(result);
                
            }
        }
        System.out.println("Wollen Sie eine weitere Runde spielen?");
        Scanner s = new Scanner(System.in);
        int eingabe = s.nextInt();
        if(eingabe == 1) {
            imGange = true;
        }else if(eingabe == 0) {
            System.exit(0);
        }
    }
    public static void printGameBoard(char[][] gameBoard) {
        for(char[] row : gameBoard) {
            for(char c : row) {
                System.out.print(c);
            }
            System.out.println();
        }
    }
    public static void placePiece(char[][] gameBoard, int pos, String user) {//needs to know about gameBoard, which it is
        
        char symbol = ' ';//default
        
        if(user.equals("player")){//.equals used with Strings!
            symbol = 'X';
            playerPositions.add(pos);
        }else if(user.equals("CPU")){
            symbol = 'O';
            cpuPositions.add(pos);
        }
        
        switch(pos) {
            case 1:
                gameBoard[0][0] = symbol;
                break;
            case 2:
                gameBoard[0][2] = symbol;
                break;
            case 3:
                gameBoard[0][4] = symbol;
                break;
            case 4:
                gameBoard[2][0] = symbol;
                break;
            case 5:
                gameBoard[2][2] = symbol;
                break;
            case 6:
                gameBoard[2][4] = symbol;
                break;
            case 7:
                gameBoard[4][0] = symbol;
                break;
            case 8:
                gameBoard[4][2] = symbol;
                break;
            case 9:
                gameBoard[4][4] = symbol;
                break;
            default:
                break;
        }
    }
    
    public static String checkWinner() {
        
        List topRow = Arrays.asList(1, 2, 3);
        List midRow = Arrays.asList(4, 5, 6);
        List botRow = Arrays.asList(7, 8, 9);
        List leftCol = Arrays.asList(1, 4, 7);
        List midCol = Arrays.asList(2, 5, 8);
        List rightCol = Arrays.asList(3, 6, 9);
        List cross1 = Arrays.asList(1, 5, 9);
        List cross2 = Arrays.asList(7, 5, 3);
        
        List<List> winning = new ArrayList<List>();
        winning.add(topRow);
        winning.add(midRow);
        winning.add(botRow);
        winning.add(leftCol);
        winning.add(midCol);
        winning.add(rightCol);
        winning.add(cross1);
        winning.add(cross2);
        
        for(List l : winning){//for each List inside of winning
            if(playerPositions.containsAll(l)) {
                return"Congratulations you won!";
                cool = false;
            }else if (cpuPositions.containsAll(l)) {
                return"CPU wins!";
            }else if(playerPositions.size() + cpuPositions.size() == 9) {
                return"Tie!";
            }
        }
        
        
        return "";
    }
    static boolean cool;
    static boolean imGange;
}
22.07.2020

  • Вы не можете поместить код после оператора return 22.07.2020
  • Я переписал код так, чтобы он не содержал оператора return, и теперь я могу поместить под ним значение cool = false. Спасибо! 22.07.2020

Ответы:


1

Вместо возврата из метода или использования дополнительных статических переменных просто попросите продолжить после вывода результата.

while (true) {
   ...
   
    String result = checkWinner();
    System.out.println(result);

    System.out.println("Play again? [y/N]");
    char playAgain = scan.next();
    if (playAgain != 'y' || playAgain != 'Y') break;
}
22.07.2020
  • Но тогда это будет спрашиваться каждый раз, когда символ был размещен. Это означает, что размещается только один символ, и игрока спрашивают, хочет ли он перезапустить игру. 22.07.2020
  • Вы можете вставить оператор if вокруг этих последних трех строк, который проверяет, был ли победитель. 22.07.2020
  • Ах да, это возможность. Спасибо за вашу помощь! 22.07.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..