So, im trying to make a snake and ladders game. The way im trying to do it is by creating a board which has nodes, the first node (head) will have a node next to it, and this one will have this one as a previous node. This repeats until it gets to the total number of nodes (tha last node doesnt have a next node). The way im trying to make the snakes and ladders is by creating a relation of snakeHead and snakeTail or ladderTop and ladderBottom. I then generate a random number which will represent a specific node on the board but for some reason when i try to create the relation i get a nullPointerException on the method createSnakes, i dont get why this is happening so if someone has an idea of why it happens please tell me. Thanks in advance
public class Board {
    private int numRows;
    private int numColumns;
    private int dimension;
    private int numSnakes;
    private int numLadders;
    private Node head;
    private Node tail;
    /**
     * This is the constructor
     * @param numRows
     * @param numColumns
     */
    public Board(int numRows, int numColumns, int numSnakes, int numLadders) {
        this.dimension = numColumns * numRows;
        this.numLadders = numLadders;
        this.numSnakes = numSnakes;
        this.numRows = numRows;
        this.numColumns = numColumns;
        head = new Node(1);
        createBoard(head, 2);
        createSnakes(0);
        createLadders(0);
    }
    /**
     * This method create board
     * @param prev this is the prev node
     * @param i this is the counter
     */
    private void createBoard(Node prev, int i){
        if(i <= dimension){
            if(i != dimension) {
                Node current = new Node(i);
                prev.setNext(current);
                current.setPrev(prev);
                createBoard(current, i + 1);
            } else {
                tail = new Node(i);
                prev.setNext(tail);
                tail.setPrev(prev);
            }
        }
    }
    private void createSnakes(int i){
        if(i<numSnakes){
            int initPosition = getInitPosition();
            Node init = get(initPosition,1, head);
            int endPosition = (int) (Math.random() * initPosition);
            Node end = get(endPosition, 1, head);
            if(init.getSnakeTail() == null && init.getSnakeHead() == null && end.getSnakeHead() == null && end.getSnakeTail() == null
            && verifyIntervals(initPosition, endPosition, 1, 0, false, false, false) == false){
                init.setSnakeTail(end);
                end.setSnakeHead(init);
                init.setSnake((char)(i+65));
                end.setSnake((char)(i+65));
                createSnakes(i + 1);
            } else {
                createSnakes(i);
            }
        }
    }
    private void createLadders(int i){
        if(i<numLadders){
            int initPosition = getInitPosition();
            if(initPosition==0){
                createLadders(i);
            }
            Node init = get(initPosition,1, head);
            int rank = dimension-initPosition;
            int endPosition = (int) (Math.random()*rank);
            if(endPosition==0 || endPosition==dimension){
                createLadders(i);
            }
            Node end = get(endPosition+initPosition, 1, head);
            if(i==numLadders){
                return;
            }
            if(init.getSnakeTail() == null && end.getSnakeHead() == null && init.getSnakeHead() == null && end.getSnakeTail() == null 
                    && init.getLadderTop() == null && end.getLadderBottom() == null && init.getLadderBottom() == null && end.getLadderTop() == null
               && verifyIntervals(initPosition, endPosition, 1, 0, false, false, false) == false) {
                init.setLadderTop(end);
                end.setLadderBottom(init);
                init.setLadder((char) (i + 48));
                end.setLadder((char) (i + 48));
                createLadders(i + 1);
            }
            else {
                createLadders(i);
            }
        }
    }
    public boolean verifyIntervals(int init, int end, int varInitPos, int initPos, boolean initFound, boolean endFound,boolean inInterval){
        if(inInterval==true){
            return true;
        }
        if(varInitPos==dimension){
            return false;
        }
        else if(varInitPos<initPos+numRows){
            if(init==varInitPos){
                initFound=true;
            }
            if(end==varInitPos){
                endFound=true;
            }
            if(initFound==true && endFound==true){
                inInterval=true;
            }
            return verifyIntervals(init,end,varInitPos+1,initPos,initFound,endFound,inInterval);
        }
        else{
            return verifyIntervals(init,end,varInitPos,initPos+numRows,false,false, false);
        }
    }
    public Node getTail() {
        return tail;
    }
    public Node get(int position, int i, Node current){
        if(i == position){
            return current;
        } else if(i==dimension) {
            return null;
        } else {
            current = current.getNext();
            return get(position, i+1, current);
        }
    }
    public Node getHead() {
        return head;
    }
    private int getInitPosition(){
        return (int) (Math.random()*dimension);
    }
    public int getNumRows() {
        return numRows;
    }
    public int getNumColumns() {
        return numColumns;
    }
    public int getDimension() {
        return dimension;
    }
    public int getNumSnakes() {
        return numSnakes;
    }
    public int getNumLadders() {
        return numLadders;
    }
}
 
    