快捷导航

青蛙过河问题!注释写的不咋地,有错误。希望大神解释这个程序的rollback()

package com.demo.hwj.javademo.kotlin;


import java.util.Arrays;//要使用工具类;


public class Testing {
        static int[] mInput = {1, 2, 3, 0, 9, 10, 11};//这是之前的顺序;这里静态的作用便是方便之后复制;
    static int[] mStep = new int[100];//步数
    static int[] mResult = {9, 10, 11, 0, 1, 2, 3};//这是之后的顺序
    static int mBridgeIndex = 0;//中间的坐标
    static int[] mLeft = null;//左边操作的数组
    static int[] mRight = null;//右边操作的数组
    static int stepPosition = 0;//当前步的坐标


    public static void main(String[] args) {
        init();//初始化
        start();//开始
    }


    private static void start() {
        do {
            switch (mStep[stepPosition]) {
                case 1:
                    if (move(1, 1)) {
                        break;
                    }
                case 2:
                    if (move(1, 2)) {
                        break;
                    }
                case 3:
                    if (move(2, 1)) {
                        break;
                    }
                case 4:
                    if (!move(2, 2)) {
                        //reset mInput ,rollback mStep
                        rollback();
                        continue;
                    }
            }
            stepPosition++;
        } while (!Arrays.equals(mResult, mInput));
        outputStep();
    }
   
//这个方法就是输出运动的实况吧;
   
    private static void outputStep() {
        int[] finallyStep = Arrays.copyOf(mStep, stepPosition);
        reset();//
        for (int i = 0; i < finallyStep.length; i++) {
            switch (finallyStep) {
                case 1:
                    moveLeft(1);
                    System.out.printf(i + ":  Left walking =>" + Arrays.toString(mInput) + "\n");
                    break;
                case 2:
                    moveLeft(2);
                    System.out.printf(i + ":  Left jumping =>" + Arrays.toString(mInput) + "\n");
                    break;
                case 3:
                    moveRight(1);
                    System.out.printf(i + ":  Right walking =>" + Arrays.toString(mInput) + "\n");
                    break;
                case 4:
                    moveRight(2);
                    System.out.printf(i + ":  Right jumping =>" + Arrays.toString(mInput) + "\n");
                    break;
            }
        }
    }
//这是初始化,初始化游戏的;
    private static void init() {
        mBridgeIndex = mInput.length / 2;// get middle bridge's position,用来获取中间的坐标;
        mLeft = Arrays.copyOfRange(mInput, 0, mBridgeIndex);//将左边的数组用Arrays工具类的copy of range()方法将从0到中间复制到新数组中;
        mRight = Arrays.copyOfRange(mInput, mBridgeIndex + 1, mInput.length);//同左;
        Arrays.fill(mStep, 1);//将Setp数组用1填充;
    }


    /**
     * move input child element .include all the way for move
     *
     * @param direction    the direction for move.  1 means left,2 means right
     * @param stepInterval the way for move. 1 means walking,2 means jumping
     */
    //这是运动的总类,包含了所有的移动方式;
    private static boolean move(final int direction, final int stepInterval) {
            //这里主要是发现是否有异常;
        if (stepInterval != 1 && stepInterval != 2)
            new IllegalArgumentException(" stepInterval must equal 1 or 2.  -----> line 65");
        if (direction != 1 && direction != 2)
            new IllegalArgumentException(" direction must equal 1 or 2.-----> line 65");
        boolean isWalking;
        //这里要判断移动的方式,有跳和走,有左有右
        if (direction == 1) {
            isWalking = moveLeft(stepInterval);
        } else {
            isWalking = moveRight(stepInterval);
        }
        //当被指向时候进行判断;
        if (isWalking) {
            //record down step
            record(direction, stepInterval);
        }
        return isWalking;
    }


    private static void record(int direction, int step) {
          
        switch (direction) {
            case 1:
                mStep[stepPosition] = direction * step;
                break;
            case 2:
                mStep[stepPosition] = direction + step;
                break;
        }
    }


    private static void rollback() {
        if (mStep[stepPosition] >= 4) {
            mStep[stepPosition] = 1;
            stepPosition--;
        }
        if (stepPosition < 0)
                stepPosition = 0;
        if (mStep[stepPosition] < 4) {
            mStep[stepPosition]++;
            reset();
        }




    }


    /**
     * move input child element .include  the way for move is Left
     *
     * @param stepInterval the way for move. 1 means walking,2 means jumping
     * @return if return false that means cannot moving
     */
    //左向的方法
    private static boolean moveLeft(final int stepInterval) {
        for (int i = 0; i < mInput.length; i++) {
            if (containOf(mLeft, mInput)) {// search item whether inside for mInput
                if (i < mInput.length - stepInterval && mInput[i + stepInterval] == 0) {
                    //change item
                    int a = mInput;
                    mInput[i + stepInterval] = a;
                    mInput = 0;
                    return true;
                }
            }
        }
        return false;
    }
    //右向的方法
    private static boolean moveRight(final int stepInterval) {
        for (int i = mInput.length - 1; i >= 0; i--) {
            if (containOf(mRight, mInput)) {// search item whether inside for mInput
                if (i >= 0 + stepInterval && mInput[i - stepInterval] == 0) {
                    //change item
                    mInput[i - stepInterval] = mInput;
                    mInput = 0;
                    return true;
                }
            }
        }
        return false;
    }


    private static boolean containOf(int[] arr, int child) {
        for (int i : arr) {
            if (i == child)
                    return true;
        }
        return false;
    }


    private static void reset() {


        mInput[0] = 1;
        mInput[1] = 2;
        mInput[2] = 3;
        mInput[3] = 0;
        mInput[4] = 4;
        mInput[5] = 5;
        mInput[6] = 6;
        stepPosition = 0;
    }
}

免责声明:本内容仅代表回答者见解不代表本站观点,请谨慎对待。

版权声明:作者保留权利,不代表本站立场。

回复

使用道具 举报

参与会员1

太长不阅
回复

使用道具 举报

可能感兴趣的问答

发新帖
  • 微信访问
  • 手机APP