Почему другой игрок никогда не получает свою очередь в моей реализации Last Stone Game (Nim)? - PullRequest
0 голосов
/ 30 мая 2020
package HomePlace;

import java.util.Random;

import java.util.Scanner;

public class LastStone {
    public static boolean isValidEntry(int left, int User) {
        if (left > 0 && User < 4 && left >= User) {
            return true;
        } else {
            System.out.print("Invalid entry!!");
            return false;
        }
    }

    public static int userMove(int left) {
        Scanner input = new Scanner(System.in);
        System.out.print("There are " + left + " stones. How many would you like? ");
        int User = input.nextInt();
        return User;
    }

    public static int computerMove(int left) {
        int cpuStones;
        cpuStones = generateStones();
        System.out.print("There are " + left + "stones. The computer takes" + cpuStones + " stones");
        return cpuStones;
    }

    public static int generateStones() {
        Random sr = new Random();
        int gstones = sr.nextInt(2) + 1;
        return gstones;
    }

    public static void playLastStone(int UserOrCpu) {
        Scanner input = new Scanner(System.in);
        if (UserOrCpu % 2 == 1) {
            System.out.println("The Computer beats the User!");
        } else {
            System.out.println("The User beats the Computer!");
        }
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Random r = new Random();
        int left = r.nextInt(16) + 15;
        int UserOrCpu = 1, User = 1, temp;
        while (true) {
            if (UserOrCpu % 2 == 1) {
                User = userMove(left);
                if (isValidEntry(left, User)) {
                    if (left == User) {
                        playLastStone(UserOrCpu);
                        break;
                    }
                    left -= User;
                } else {
                    continue;
                }
            } else {
                computerMove(left);
                temp = computerMove(left);
                if (left <= temp) {
                    playLastStone(UserOrCpu);
                    break;
                } else {
                    left -= temp;
                }
            }
        }
        UserOrCpu += 1;
    }
}

Мой компьютерный плеер cpu никогда не выполняет свою очередь в моей реализации игры Last Stone или Nim .

Я нашел похожие вопросы, но ни один из них не помог с решением моей проблемы.

Я отлаживал свой код построчно, но не мог понять, почему мой второй } else { в моем методе main никогда не выполняется?

                    left -= User;
                } else {
                    continue;
                }
            } else { // why is it never executed?

1 Ответ

2 голосов
/ 30 мая 2020

В данном коде ваш метод main фактически сводится к

    public static void main(String[] args) {
        Random r = new Random();
        int left = r.nextInt(16) + 15;
        int userOrCpu = 1, user;
        while (true) {
            user = userMove(left);
            if (isValidEntry(left, user)) {
                if (left == user) {
                    playLastStone(userOrCpu);
                    break;
                }
                left -= user;
            }
        }
    }

И поэтому теперь ясно, что ваш компьютерный плеер cpu никогда не доходит до своей очереди.

проблема в том, что ваше назначение UserOrCpu += 1; не попадает в нужную область и не имеет никакого эффекта.

«Фиксированный» метод main должен выглядеть так

    public static void main(String[] args) {
        Random r = new Random();
        int left = r.nextInt(16) + 15;
        int UserOrCpu = 1, User = 1, temp;
        while (true) {
            if (UserOrCpu % 2 == 1) {
                User = userMove(left);
                if (isValidEntry(left, User)) {
                    if (left == User) {
                        playLastStone(UserOrCpu);
                        break;

                    }
                    left -= User;
                } else {
                    continue;
                }
            } else {
                computerMove(left);
                temp = computerMove(left); // executes computer move a 2nd time?
                if (left <= temp) {
                    playLastStone(UserOrCpu);
                    break;

                } else {
                    left -= temp;
                }
            }
            UserOrCpu += 1;
        }
    }

Подсказка: Получите себе IDE (например, IntelliJ) для написание кода. Такой редактор кода сразу укажет на «очевидные» проблемы с вашим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...