import java.util.ArrayList;

class PlateauHanoi {

    private final double EP_DISC = 0.2;
    private final double INC_DISC = 1.5*EP_DISC;
	private int nbDisques ;
    private double xInc ;
    private ArrayList<ArrayList<Integer>> piquet ;
	private double L_PLATEAU;
	private double H_PLATEAU;


    public PlateauHanoi(int n){
		nbDisques = n ;
        xInc = n ;
        L_PLATEAU = 3.0*nbDisques;
        H_PLATEAU = 1.5*INC_DISC*nbDisques;

        piquet = new ArrayList<ArrayList<Integer>>();
		for(int i=0; i<3; i++)
            piquet.add(new ArrayList<Integer>());

		for(int i=0 ; i<n ; i++){
	    	piquet.get(0).add(n-i) ;
		}
        StdDraw.enableDoubleBuffering();
        StdDraw.setCanvasSize(512, 256);
        StdDraw.setXscale(-1.1*L_PLATEAU/6, L_PLATEAU);
        StdDraw.setYscale(-EP_DISC, H_PLATEAU);
        draw();
    }

    public void draw(){
        StdDraw.clear();
        StdDraw.setPenColor(StdDraw.BLACK);
        StdDraw.setPenRadius(0.02);
        StdDraw.line(-L_PLATEAU/6, -EP_DISC, 5.0*L_PLATEAU/6, -EP_DISC);
        StdDraw.line(0, -0.1, 0, 0.9*H_PLATEAU);
        StdDraw.line(xInc, -0.1, xInc, 0.9*H_PLATEAU);
        StdDraw.line(2*xInc, -0.1, 2*xInc, 0.9*H_PLATEAU);
        StdDraw.setPenColor(StdDraw.BOOK_RED);
        for(int i=0; i<piquet.size(); i++){
            for(int d=0; d<piquet.get(i).size(); d++){
                StdDraw.filledRectangle(i*xInc, d*INC_DISC, piquet.get(i).get(d)/2.0, EP_DISC/2);
                StdDraw.filledCircle(i*xInc+piquet.get(i).get(d)/2.0, d*INC_DISC, EP_DISC/2);
                StdDraw.filledCircle(i*xInc-piquet.get(i).get(d)/2.0, d*INC_DISC, EP_DISC/2);
            }
        }
        StdDraw.show();
        StdDraw.pause(500);
    }

    public void move(char cSrc, char cDst){
        int src = c2i(cSrc);
        int dst = c2i(cDst);
        int nSrc = piquet.get(src).remove(piquet.get(src).size()-1);
        piquet.get(dst).add(nSrc);
        draw();
    }

    public static int c2i(char cin) {
        int retour = 0;
        switch (cin) {
            case 'B':
                retour = 1;
                break;
            case 'C':
                retour = 2;
                break;
        }
        return retour;
    }
}
