//Main import java.util.Scanner; import java.io.*; final class inpData { public int numberOfPlayers; public int numberOut; public CircularLinkedList playerList; public inpData(int numberOfPlayers, int numberOut, CircularLinkedList playerList) { this.numberOfPlayers = numberOfPlayers; this.numberOut = numberOut; this.playerList = playerList; } } public class Main { private static final int MIN_PLAYERS = 3; private static final int MAX_PLAYERS = 10; private static final int MIN_VALUE = 1; //private static final int MAX_VALUE = 1; private static final Scanner scan = new Scanner(System.in); public static void outputTaskInfo() { System.out.println("Данная программа реализует игру: N ребят встали в круг." + "\n" + "Каждый раз, начиная с первого, из круга выводится каждый M-й." + "\n" + "Программа выводит номера в порядке выбывания и последнего оставшегося." + "\n" + "Диапазон ввода количества игроков: " + MIN_PLAYERS + "..." + MAX_PLAYERS + ". \n" + "Диапазон ввода номера выбывающего: " + MIN_VALUE + "..." + "(Номер последнего игркока)" + "."); } public static int getVerificationOfChoice() { int choice = 0; boolean isIncorrect; do { isIncorrect = false; try { choice = Integer.parseInt(scan.nextLine()); } catch (NumberFormatException e) { System.out.println("Проверьте корректность ввода данных!"); isIncorrect = true; } if (!isIncorrect && (choice != 0 && choice != 1)) { System.out.println("Для выбора введите 0 или 1!"); isIncorrect = true; } } while (isIncorrect); return choice; } public static String inputPathToFile() { boolean isIncorrect; String path; System.out.println("Укажите путь к файлу: "); do { isIncorrect = false; path = scan.nextLine(); File file = new File(path); if (!file.exists()) { System.out.println("По указанному пути файл не найден! Укажите правильный путь: "); isIncorrect = true; } } while (isIncorrect); return path; } public static int readNumberOfPlayersFromConsole() { int numberOfPlayers = 0; boolean isIncorrect; System.out.println("Введите значение количетва участников: "); do { isIncorrect = false; try { numberOfPlayers = Integer.parseInt(scan.nextLine()); } catch (NumberFormatException e) { System.out.println("Проверьте корректность ввода данных!"); isIncorrect = true; } if (!isIncorrect && (numberOfPlayers < MIN_PLAYERS || numberOfPlayers > MAX_PLAYERS)) { System.out.println("Введите число от " + MIN_PLAYERS + " до " + MAX_PLAYERS + "!"); isIncorrect = true; } } while (isIncorrect); return numberOfPlayers; } public static int readNumberOfPlayersFromFile(final String path) { int numberOfPlayers; boolean isIncorrect = true; System.out.println("Происходит чтение количества участников..."); try (BufferedReader br = new BufferedReader(new FileReader(path))) { numberOfPlayers = Integer.parseInt(br.readLine()); } catch (Exception e) { isIncorrect = false; System.out.println("Ошибка при чтении данных! Введите количество участников с консоли!"); numberOfPlayers = readNumberOfPlayersFromConsole(); } return numberOfPlayers; } public static void outputNumberOfPlayers(final int choice, int numberOfPlayers, String path) { boolean isIncorrect; if (choice == 0) System.out.println("Количество игроков равно: " + numberOfPlayers + "."); if (choice == 1) { System.out.println("Вывод количества игроков в файл..."); do { isIncorrect = false; try { FileWriter writer = new FileWriter(path); writer.write("Кол-во игроков: " + numberOfPlayers + "\n"); writer.close(); } catch (IOException e) { isIncorrect = true; System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!"); path = inputPathToFile(); } } while (isIncorrect); System.out.println("Данные успешно записаны в файл!"); } } public static int readNumberOutFromConsole(int numberOfPlayers) { int numberOut = 0; boolean isIncorrect; System.out.println("Введите номер выбывающего участника: "); do { isIncorrect = false; try { numberOut = Integer.parseInt(scan.nextLine()); } catch (NumberFormatException e) { System.out.println("Проверьте корректность ввода данных!"); isIncorrect = true; } if (!isIncorrect && (numberOut < MIN_VALUE || numberOut > numberOfPlayers)) { System.out.println("Введите число от " + MIN_PLAYERS + " до " + numberOfPlayers + "!"); isIncorrect = true; } } while (isIncorrect); return numberOut; } public static int readNumberOutFromFile(final String path) { int numberOut; boolean isIncorrect = true; System.out.println("Происходит чтение номера выбывающего..."); try (BufferedReader br = new BufferedReader(new FileReader(path))) { br.readLine(); numberOut = Integer.parseInt(br.readLine()); } catch (Exception e) { isIncorrect = false; System.out.println("Ошибка при чтении данных! Введите количество участников с консоли!"); numberOut = readNumberOfPlayersFromConsole(); } return numberOut; } public static void outputNumberOut(final int choice, int numberOut, String path) { boolean isIncorrect; if (choice == 0) System.out.println("Номер выбывающего игрока: " + numberOut + "."); if (choice == 1) { System.out.println("Вывод номера выбывающего игрока в файл..."); do { isIncorrect = false; try { FileWriter writer = new FileWriter(path, true); writer.write("Номер выбывающего игрока: " + numberOut + "\n"); writer.close(); } catch (IOException e) { isIncorrect = true; System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!"); path = inputPathToFile(); } } while (isIncorrect); System.out.println("Данные успешно записаны в файл!"); } } public static CircularLinkedList createCircularLinkedList(final int numberOfPlayers) { CircularLinkedList cll = new CircularLinkedList(); for (int i = 1; i <= numberOfPlayers; i++) { cll.addNode(i); } return cll; } public static void outputStartPlayerList(String path, final int choice, final CircularLinkedList playerList){ boolean isIncorrect; Node currentNode = playerList.head; if (choice == 0) { System.out.println("Вывод начальной последовательности игроков: "); if (playerList.head != null) { do { System.out.print(currentNode.value + " "); currentNode = currentNode.nextNode; } while (currentNode != playerList.head); } System.out.print("\n"); } if (choice == 1) { System.out.println("Вывод начальной последовательности игроков в файл..."); do { isIncorrect = false; try { FileWriter writer = new FileWriter(path, true); BufferedWriter bufferWriter = new BufferedWriter(writer); bufferWriter.write("Начальная последовательноcть: "); if (playerList.head != null) { do { bufferWriter.write(currentNode.value + " "); currentNode = currentNode.nextNode; } while (currentNode != playerList.head); } bufferWriter.write("\n"); bufferWriter.close(); writer.close(); } catch (IOException e) { isIncorrect = true; System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!"); path = inputPathToFile(); } } while (isIncorrect); System.out.println("Данные успешно записаны в файл!"); } } public static int[] processGame(inpData data) { Node currentNode = data.playerList.head; int counter = 0; int[] ansArr = new int[data.numberOfPlayers]; if (data.playerList.head != null) { do { int i = 0; while (i < data.numberOut - 1) { currentNode = currentNode.nextNode; i++; } ansArr[counter] = currentNode.value; counter++; data.playerList.deleteNode(currentNode.value); currentNode = currentNode.nextNode; } while (data.playerList.tail != data.playerList.head); } ansArr[counter] = currentNode.value; return ansArr; } public static void outputAnsArr(final int choice, String path, final int[] ansArr, final int numberOfPlayers) { boolean isIncorrect; if (choice == 0) { System.out.print("Вывод последовательсности выбывших: "); for (int i = 0; i < numberOfPlayers - 1; i++) { System.out.print(ansArr[i] + " "); } System.out.print("\nПоследний: " + ansArr[numberOfPlayers - 1]); } if (choice == 1) { System.out.println("Вывод последовательсности выбывших в файл..."); do { isIncorrect = false; try { FileWriter writer = new FileWriter(path, true); BufferedWriter bufferWriter = new BufferedWriter(writer); bufferWriter.write("Выбывшие: "); for (int i = 0; i < numberOfPlayers - 1; i++) { bufferWriter.write(ansArr[i] + " "); } bufferWriter.write("\nПоследний: " + ansArr[numberOfPlayers - 1]); bufferWriter.close(); writer.close(); } catch (IOException e) { isIncorrect = true; System.out.println("Ошибка! Измените параметры файла или укажите новую ссылку!"); path = inputPathToFile(); } } while (isIncorrect); System.out.println("Данные успешно записаны в файл!"); } } public static inpData processUserInput() { int numberOfPlayers = 0, numberOut = 0; CircularLinkedList playerList = null; int choiceForInput; String pathToIn; System.out.println("Вы желаете ввести данные с консоли(0) или взять данные из файла(1)?"); choiceForInput = getVerificationOfChoice(); if (choiceForInput == 0) { numberOfPlayers = readNumberOfPlayersFromConsole(); numberOut = readNumberOutFromConsole(numberOfPlayers); playerList = createCircularLinkedList(numberOfPlayers); } if (choiceForInput == 1) { pathToIn = inputPathToFile(); numberOfPlayers = readNumberOfPlayersFromFile(pathToIn); numberOut = readNumberOutFromFile(pathToIn); playerList = createCircularLinkedList(numberOfPlayers); } return new inpData(numberOfPlayers, numberOut, playerList); } public static void processUserOutput(inpData data) { int choiceForOutput; String pathToOut = ""; int[] ansArr = new int[data.numberOfPlayers]; System.out.println("Вы желаете получить результат в консоли(0) или в файле(1)?"); choiceForOutput = getVerificationOfChoice(); if (choiceForOutput == 1) pathToOut = inputPathToFile(); outputNumberOfPlayers(choiceForOutput, data.numberOfPlayers, pathToOut); outputNumberOut(choiceForOutput, data.numberOut, pathToOut); outputStartPlayerList(pathToOut, choiceForOutput, data.playerList); ansArr = processGame(data); outputAnsArr (choiceForOutput, pathToOut, ansArr, data.numberOfPlayers); } public static void main (String[] args) { outputTaskInfo(); inpData data = processUserInput(); processUserOutput(data); scan.close(); } } //CircularLinkedList public class CircularLinkedList { public Node head = null; public Node tail = null; public void addNode(int value) { Node newNode = new Node(value); if (head == null) { head = newNode; } else { tail.nextNode = newNode; } tail = newNode; tail.nextNode = head; } public void deleteNode(int valueToDelete) { Node currentNode = head; if (head == null) { return; } do { Node nextNode = currentNode.nextNode; if (nextNode.value == valueToDelete) { if (tail == head) { head = null; tail = null; } else { currentNode.nextNode = nextNode.nextNode; if (head == nextNode) { head = head.nextNode; } if (tail == nextNode) { tail = currentNode; } } break; } currentNode = nextNode; } while (currentNode != head); } } //Node class Node { int value; Node nextNode; public Node(int value) { this.value = value; } }