## T-Puzzle
## Autori: Dini Lapo, Miranceli Elia
## versione: 0.3
##
##
function tpuzzle()
	% Inizializza i pezzi e poi lascia il lavoro alle sottofunzioni.
	global tpezzo1 tpezzo2 tpezzo3 tpezzo4;
	global tselez tconta;
	disp("\nProva a risolvere il T-puzzle!\nUsa i pezzi visualizzati per comporre la T maiuscola.\n\nAiuto: E' possibile farlo usando solo traslazioni per interi\ne rotazioni per multipli di 45 gradi.\nMemo: Rotazioni positive sono in senso antiorario\n")
	tpezzo1=[-1 -3 -3+4i -1+6i -1];	
	tpezzo2=[0 0+2i (2-2*sqrt(2))+2i (4-2*sqrt(2))+4i 4+4i 0];
		centro=mean(tpezzo2(1:end-1));
		tpezzo2=exp(i*pi/4)*(tpezzo2-centro)+centro;
	tpezzo3=[(1-2*sqrt(2))-4i (3-2*sqrt(2))-2i -3-2i -3-4i (1-2*sqrt(2))-4i];
		centro=mean(tpezzo3(1:end-1));
		tpezzo3=exp(i*pi/2)*(tpezzo3-centro)+centro;
	tpezzo4=[2-2i 2-4i 0-4i 2-2i];
		centro=mean(tpezzo4(1:end-1));
		tpezzo4=exp(i*3*pi/4)*(tpezzo4-centro)+centro;
	tconta=0;
	tselez=0;
	axis('equal')
	tdisegna()
	input("Premi Invio per iniziare");
	tscelta()
endfunction

function tscelta()
	% Menu per scegliere quale pezzo muovere.
	global tselez
	a=menu("Quale pezzo vuoi muovere?", "Rosso", "Verde", "Blu", "Giallo", "Esci");
	switch a
		case {1, 2, 3, 4}
			tselez=a;
			tmuovi()
		case 5
		otherwise
			tscelta()
	endswitch
endfunction

function tmuovi()
	% Scelta di come muovere il pezzo di cui sopra.
	b=menu("Vuoi ruotarlo o traslarlo?", "Ruotarlo", "Traslarlo", "Indietro");
	switch b
		case 1
			truota()
		case 2
			ttrasla()
		case 3
			tscelta()
		otherwise
			tmuovi()
	endswitch
endfunction

function truota()
	% Funzione che ruota un pezzo.
	global tpezzo1 tpezzo2 tpezzo3 tpezzo4 tselez
	theta=input("Di quanti gradi lo vuoi ruotare?");
	theta=(theta/45)*(pi/4);
	switch (tselez)
		case 1
			centro=mean(tpezzo1(1:end-1));
			tpezzo1=exp(i*theta)*(tpezzo1-centro)+centro;
		case 2
			centro=mean(tpezzo2(1:end-1));
			tpezzo2=exp(i*theta)*(tpezzo2-centro)+centro;
		case 3
			centro=mean(tpezzo3(1:end-1));
			tpezzo3=exp(i*theta)*(tpezzo3-centro)+centro;
		case 4
			centro=mean(tpezzo4(1:end-1));
			tpezzo4=exp(i*theta)*(tpezzo4-centro)+centro;
		otherwise
	endswitch
	tdisegna()
	ttest()
endfunction

function ttrasla()
	% Funzione che trasla un pezzo.
	global tpezzo1 tpezzo2 tpezzo3 tpezzo4 tselez
	reale=input("Di quanto lo vuoi muovere lungo le ascisse?");
	immag=input("Di quanto lo vuoi muovere lungo le ordinate?");
	switch (tselez)
		case 1
			tpezzo1=tpezzo1+reale+i*immag;
		case 2
			tpezzo2=tpezzo2+reale+i*immag;
		case 3
			tpezzo3=tpezzo3+reale+i*immag;
		case 4
			tpezzo4=tpezzo4+reale+i*immag;
		otherwise
	endswitch	
	tdisegna()
	ttest()
endfunction

function ttest()
	% Controlla se sia raggiunta la soluzione, sottraendo ad ogni pezzo
	% la posizione che dovrebbe avere alla fine.
	global tpezzo1 tpezzo2 tpezzo3 tpezzo4 tconta
	try1=tpezzo1-[8-4i 6-4i 6 8+2i 8-4i];
	try1=[try1 0];
	try2=tpezzo2-[6 6+2i (8-2*sqrt(2))+2i (10-2*sqrt(2))+4i 10+4i 6];
	try3=tpezzo3-[(8-2*sqrt(2))+2i (10-2*sqrt(2))+4i 4+4i 4+2i (8-2*sqrt(2))+2i];
	try3=[try3 0];
	try4=tpezzo4-[10+4i 10+2i 8+2i 10+4i];
	try4=[try4 0 0];
	% Il mostro seguente si assicura che i pezzi siano abbastanza vicini alla soluzione.
	% Mettendo 0 il pezzo 3 dava problemi dopo la rotazione.
	% Per sicurezza sono tutti a meno di un errore, fissato a 10 alla -10.
	% L'espressione pare funzionare e per scaramanzia non la toccherei.
	check=((abs(try1) <= (zeros(1,6)+(10^(-10)))) & (try1 >= (zeros(1,6)-(10^(-10)))) & (try2 <= (zeros(1,6)+(10^(-10)))) & (try2 >= (zeros(1,6)-(10^(-10)))) & (try3 <= (zeros(1,6)+(10^(-10)))) & (try3 >= (zeros(1,6)-(10^(-10)))) & (try4 <= (zeros(1,6)+(10^(-10)))) & (try4 >= (zeros(1,6)-(10^(-10)))));
	if (check)
		vittoria=["", "", "\n"; "Complimenti! Hai risolto il T-puzzle in ", num2str(tconta), " mosse."];
		disp(vittoria)
	else
		a=menu("Vuoi muovere ancora questo pezzo?", "Si'", "No");
		if (a == 1)
			tmuovi()
		else
			tscelta()
		endif
	endif
endfunction

function tdisegna()
	% Disegna i pezzi, la T d'arrivo, un po' di titoli e tiene il conto delle mosse.
	global tpezzo1 tpezzo2 tpezzo3 tpezzo4 tconta
	traccia=[4+2i 6+2i 6-4i 8-4i 8+2i 10+2i 10+4i 4+4i 4+2i];
	plot(traccia,'k-')
	hold on
	title("T-Puzzle","fontsize",16)
	%title("T-Puzzle") %Nel caso si abbiano problemi con la versione di octave, usare al posto del precedente
	testo=["Mosse effettuate: ",  num2str(tconta), "  Soluzione ottimale: 7"];
	xlabel(testo,"fontsize",12)
	%xlabel(testo) %Nel caso si abbiano problemi con la versione di octave, usare al posto del precedente
	plot(tpezzo1,'r-')
	plot(tpezzo2,'g-')
	plot(tpezzo3,'b-')
	plot(tpezzo4,'m-') % E' giallo perch? trovo stia bene con rosso, blu e verde.
			   % Se ritenuto di difficile visione, sostituire la y con una m per un magenta.
	hold off
	tconta=tconta+1;
endfunction
	