Nim游戏回溯并不适用于所有行序列 - Java

时间:2016-05-01 12:16:38

标签: java backtracking

我有一个问题。作为一项任务,我们必须使用回溯来制作Nim游戏解析器,以根据玩家首先开始的输入来预测哪个玩家将获胜(假设两个玩家都有完美的决策率)。

以下是NimGame的代码:

package Nim;

import java.util.ArrayList;

public class NimGame {

private int[] elements;

public NimGame(int[] elements) {
    this.elements = new int[elements.length];
    this.elements = elements;
}

public int NimSolver(boolean player) {
    if (player == true && NimHelp(elements) == true) {
        return 1;
    } else if (player == false && NimHelp(elements) == true) {
        return -1;
    } else {
        int score = 0;
        int tmp = 0;

        if (player == true) {
            score = -1;
        } else {
            score = 1;
        }

        for (int i = 0; i < elements.length; i++) {

            for (int j = 1; j <= elements[i]; j++) {
                // Decrement element (Do thing)
                elements[i] -= j;

                // Backtrack
                tmp = NimSolver(!player);

                // SetScore
                if (player == true && tmp > score) {
                    score = tmp;
                } else if (player == false && tmp < score) {
                    score = tmp;
                }

                // Increment element (Undo thing)
                elements[i] += j;
            }
        }
        return score;
    }
}

private boolean NimHelp(int[] elements) {
    boolean[] isEmpty = new boolean[elements.length];

    for (int i = 0; i < elements.length; i++) {
        if (elements[i] == 0) {
            isEmpty[i] = true;
        } else {
            isEmpty[i] = false;
        }
    }

    for (boolean value : isEmpty) {
        // If not all value is empty return false
        if (!value)
            return false;
    }
    return true;
}

public void NimResult(int player,int result)
{
    if (player == 1) {
        result = NimSolver(true);
    } else if (player == 2) {
        result = NimSolver(false);
    }

    if (result == 1) {
        System.out.println("");
        System.out.println("PLAYER 1 WON");
    } else {
        System.out.println("");
        System.out.println("PLAYER 2 WON");
    }
}

public void NimPrint(ArrayList<Integer> element)
{   
    System.out.println("");
    System.out.print("MATCHES--------------------------------------");
    for(int i = 0; i < element.size() ;i++)
    { 
        System.out.println("");
        for (int j = 0; j < element.get(i) ; j++) {
        System.out.print("|");
        }
    }

} 
}

以下是Test Main class的代码:

package Main;

import java.util.ArrayList;
import java.util.Scanner;
import Nim.NimGame;

public class Main {

public static void main(String[] args) {
    int rows;
    int elementTmp;

    ArrayList<Integer> rowTmp = new ArrayList<Integer>();

    int playerNo;
    int result = 0;
    int[] elements;

    @SuppressWarnings("resource")
    Scanner sc = new Scanner(System.in);

    System.out.print("Input number of rows: ");
    rows = sc.nextInt();

    elements = new int[rows];
    System.out.println("");
    System.out.println("Input number of elements in each row");

    for (int i = 0; i < rows; i++) {
        System.out.print("Row number " + (i + 1) + " : ");
        elementTmp = sc.nextInt();

        elements[i] = elementTmp;
        rowTmp.add(elementTmp);
    }

    NimGame nim = new NimGame(elements);


    nim.NimPrint(rowTmp);

    System.out.println("");
    System.out.println("---------------------------------------------");
    System.out.println("");
    System.out.println("First player to move");
    System.out.println("1) Player 1");
    System.out.println("2) Player 2");
    System.out.print("Input: ");
    playerNo = sc.nextInt();

    nim.NimResult(playerNo, result);
}

}

适用于序列:3行,Row1 = 1,Row2 = 2,Row3 = 3,例如:

Input number of rows: 3

Input number of elements in each row
Row number 1 : 1
Row number 2 : 2
Row number 3 : 3

MATCHES--------------------------------------
|
||
|||
---------------------------------------------

First player to move
1) Player 1
2) Player 2
Input: 1

PLAYER 2 WON

但它并不适用于所有序列。我不明白为什么。

0 个答案:

没有答案