/**					 
 * Temps de sortie d'un carr� pour un point partant de son centre et se d�pla�ant al�atoirement
 @author Jean-Franc.Kentzel@ac-toulouse.fr
*/
 import javax.swing. *;

void main() {
   // Param�tres :
	double p = 0.25;
   // P(part � droite)
	double q = 0.25;
   // P(part � gauche)
	double s = 0.25;
   // P(part enhaut)
	double w = 0.25;
   //P(part en bas)
	// on remet tout en blanc :
	for (int u = 0; u < 32; u ++) {
	  for (int v = 0; v < 32; v ++)setPixel(u, v, 15);
   }
   //
	JFrame cadre1 = new JFrame();
   JTextPane texte1 = new JTextPane();
   String str1 = "Un point part du centre d'un carr� et se d�place al�atoirement (par d�faut : uniform�ment dans les quatre directions).";
   texte1.setText(str1);
   cadre1.add(texte1);
   cadre1.setSize(200150);
   cadre1.setLocation(100200);
   cadre1.setVisible(true);
   sleep(4000);
   //  
	int t = readInteger("Donnez svp la taille du carr� : un nombre impair entre 1 et 29");
   while (t % == || t > 29 || t < 1t = readInteger("On vous a dit ''IMPAIR'', ''SUPERIEUR A 0 ET INFERIEUR STRICT A 31'' !! Vous �tes sourd (e)?");
   //
	cadre1.setVisible(true);
   //
	JFrame cadre11 = new JFrame();
   JTextPane texte11 = new JTextPane();
   String str11 = " On simule (15 fois) le ''temps'' qu'il met pour sortir du carr�. A partir de la cinqui�me simulation on acc�l�re.";
   texte11.setText(str11);
   cadre11.add(texte11);
   cadre11.setSize(200200);
   cadre11.setLocation(100350);
   cadre11.setVisible(true);
   sleep(1000);
   //
	int nnn = 0;
   //c'est le temps de la simulation 1.
	int rand;
   int x;
   int y;
   // on fait le cadre (en noir):
	for (int u = 0; u < 32; u ++) {
	  for (int v = 0; v < 32; v ++) {
		 if (u < 15 (t - 1|| v < 15 (t - 1|| u > 15 (t - 1|| v > 15 (t - 12setPixel(u, v, 0);
	  }
   }
   for (int c = 0; c < 15; c ++)// on essaie chacune des 15 couleurs
	{
	  x = 15;
	  y = 15;
	  setPixel(x, y, c);
	  sleep(300);
	  for (int i = 1; i < 5000; i ++// on fait 5000 pas au maximum
	   {
		 setPixel(x, y, 15);
		 // cette ligne peut �tre enlev�e, on a alors des "surfaces"
		  //  (il suffit de mettre // au d�but de la ligne)
		  //
		  rand = random(1101);
		 if (rand >= && rand <= 100 * p)x = x + 1;
		 if (rand > 100 * p && rand <= 100 (p + q))x = x - 1;
		 if (rand > 100 (p + q&& rand <= 100 (p + q + s))y = y + 1;
		 if (rand > 100 (p + q + s))y = y - 1;
		 setPixel(x, y, c);
		 if (c < 2)sleep(6);
		 if (c < 4)sleep(6);
		 else sleep(1);
		 if (x == 15 (t - 1|| x == 15 (t - 1|| y == 15 (t - 1|| y == 15 (t - 11) {
			if (c == 0) {
			   setPixel(x, y, 3);
			   // sinon c'est noir sur noir et on ne voit pas le point arriv�.
				sleep(100);
			}
			JFrame f = new JFrame("''temps'' = " + i);
			f.setVisible(true);
			f.setSize(20060);
			f.setLocation(50020 30 * c);
			nnn = nnn + i;
			// on fait le total des coups
			 break;
			// }
		  }
	  }
	  sleep(10);
   }
   double moy = (double)nnn / 15;
   //
	JFrame cadre2 = new JFrame();
   JTextPane texte2 = new JTextPane();
   String str2 = "   Avec ces 15 essais, pour un carr� de c�t� " + t + ", en moyenne il a fallu " + moy + " coups pour sortir du carr�. On refait 150 essais � donf pour v�rifier.";
   texte2.setText(str2);
   cadre2.add(texte2);
   cadre2.setSize(200150);
   cadre2.setLocation(300100);
   cadre2.setVisible(true);
   //  
	sleep(1000);
   //
	//
	// on remet tout en blanc :
	for (int u = 0; u < 32; u ++) {
	  for (int v = 0; v < 32; v ++)setPixel(u, v, 15);
   }
   // on refait le cadre :
	for (int u = 0; u < 32; u ++) {
	  for (int v = 0; v < 32; v ++) {
		 if (u < 15 (t - 1|| v < 15 (t - 1|| u > 15 (t - 1|| v > 15 (t - 12setPixel(u, v, 0);
	  }
   }
   int min = 500;
   int max = 0;
   //initialisation des min et max des 200 essais � venir
	nnn = 0;
   int[]tab_x = new int[200];
   int[]tab_y = new int[200];
   for (int z = 0; z < 200; z ++) {
	  tab_x[z15;
	  tab_y[z15;
   }
   for (int i = 1; i < 5000; i ++)// on fait 5000 pas au maximum
	{
	  // on d�marre d = chacun des 150 nouveaux trajets
	   for (int d = 0; d < 150; d ++) {
		 if (tab_x[d15 (t - 1&& tab_x[d15 (t - 1&& tab_y[d15 (t - 1&& tab_y[d15 (t - 11) {
			 setPixel(tab_x[d], tab_y[d]15);
			 //
			 rand = random(1101);
			if (rand >= && rand <= 100 * ptab_x[d= tab_x[d1;
			if (rand > 100 * p && rand <= 100 (p + q)) tab_x[d= tab_x[d1;
			if (rand > 100 (p + q&& rand <= 100 (p + q + s)) tab_y[d= tab_y[d1;
			if (rand > 100 (p + q + s)) tab_y[d= tab_y[d1;
			setPixel(tab_x[d], tab_y[d], d % 16);
			sleep(1);
			if (tab_x[d== 15 (t - 1|| tab_x[d== 15 (t - 1|| tab_y[d== 15 (t - 1|| tab_y[d== 15 (t - 11) {
			   if (d % 16 == 0)setPixel(tab_x[d], tab_y[d]3);
			   if (i > max)max = i;
			   if (i < min)min = i;
			   nnn = nnn + i;
			   // on refait le total des coups 
			 }
		 }
	  }
	  for (int d = 0; d < 150; d ++) {
		 if (tab_x[d== 15 (t - 1|| tab_x[d== 15 (t - 1|| tab_y[d== 15 (t - 1|| tab_y[d== 15 (t - 11break;
	  }
   }
   moy = (double)nnn / 150;
   sleep(1000);
   //
	JFrame cadre3 = new JFrame();
   JTextPane texte3 = new JTextPane();
   String str3 = "Avec ces 150 nouveaux essais, en moyenne il a fallu " + moy + " coups pour sortir du carr�, avec un min de " + min + " et un max de " + max + ".";
   texte3.setText(str3);
   cadre3.add(texte3);
   cadre3.setSize(200150);
   cadre3.setLocation(300250);
   cadre3.setVisible(true);
   //
	//  
	//							  Calculs de probas
	//
	double lim = 0.005;
   if (t < 10lim = 0.02;
   if (t > 20)lim = 0.001;
   // lim est la limite inf de probas pour l'affichage de la fen�tre 4
	JFrame cadre4 = new JFrame();
   JTextPane texte4 = new JTextPane();
   String str4 = "   On donne sur la console la loi du temps de sortie pour ce carr� de c�t� " + t + " (probas > " + lim + ") et, tout en bas si le carr� est grand, l'esp�rance de ce temps de sortie pour les autres tailles de carr�s. Cette esp�rance n�glige les ''temps'' de sortie > 5000, c'est � dire une probabilit� < 10^(-10).";
   texte4.setText(str4);
   cadre4.add(texte4);
   cadre4.setSize(200200);
   cadre4.setLocation(300400);
   cadre4.setVisible(true);
   double [][][] val = new double[5000][61][61];
   // val [n][k][m]=P(X_n = k-r && Y_n = m-r)
	double [] proba = new double [5000];
   // proba[n] est la proba de sortie du carr� au (n+1)_�me coup
	for (int nn = 0; nn < 5000; nn ++proba [nn0;
   double[]Esperance = new double [15];
   // Esperance[r] est le temps moyen de sortie si t=2*r+1.
	//
	//initialisations :
	double S = 0;
   //somme sur kk et mm, pour n donn� des P(X_n=kk && Y_n = mm)
	double Somme = 0;
   //somme sur n<5000 des P(sortie au temps n), utile pour des v�rifications
	for (int r = 1; r < 15; r ++) {
	  val[0][r][r1;
	  val[0][r - 1][r - 10;
	  Somme = 0;
	  S = 0;
	  Esperance[r0;
	  //
	   for (int dd = - r; dd < r + 1; dd ++) {
		 for (int ee = - r; ee < r + 1; ee ++) {
			int d = dd + r;
			int e = ee + r;
			for (int nn = 1; nn < 5000; nn ++val[nn][d][e0;
		 }
	  }
	  //
	   // d�but de la r�currence en n :
	   for (int n = 1; n < 5000; n ++) {
		 proba[n0;
		 S = 0;
		 for (int kk = - r; kk < r + 1; kk ++) {
			int k = kk + r;
			//k est entre 0 et 2r. C'est un index de tableau donc il doit �tre positif .
			 for (int mm =- r; mm < r + 1; mm ++) {
			   int m = mm + r;
			   //m est entre 0 et 2r. C'est un index (positif ) de tableau.
				//
				// P(X_n=kk && Y_n = mm)=val [n][kk+r][mm+r]=val [n][k][m]
				//
				if (kk >- r && kk < r && mm >- r && mm < rval[n][k][m= val[n - 1][k - 1][m* p + val[n - 1][k + 1][m* q + val[n - 1][k][m - 1* s + val[n - 1][k][m + 1* w;
			   //
				if (kk == r) {
				  if (m > 0)val[n][k][m= val[n - 1][k - 1][m* p + val[n - 1][k][m + 1* w + val[n - 1][k][m - 1* s;
				  else val[n][k][m= val[n - 1][k - 1][m* p + val[n - 1][k][m + 1* w;
				  proba[n= proba[n+ val[n][k][m* p;
			   }
			   //
				if (kk ==- r) {
				  if (m > 0val[n][k][m= val[n - 1][k + 1][m* q + val[n - 1][k][m + 1* w + val[n - 1][k][m - 1* s;
				  else val[n][k][m= val[n - 1][k + 1][m* q + val[n - 1][k][m + 1* w;
				  proba[n= proba[n+ val[n][k][m* q;
			   }
			   //
				if (mm == r) {
				  if (k > 0val[n][k][m= val[n - 1][k - 1][m* p + val[n - 1][k + 1][m* q + val[n - 1][k][m - 1* s;
				  else val[n][k][m= val[n - 1][k + 1][m* q + val[n - 1][k][m - 1* s;
				  proba[n= proba[n+ val[n][k][m* s;
			   }
			   //
				if (mm ==- r) {
				  if (k > 0val[n][k][m= val[n - 1][k - 1][m* p + val[n - 1][k + 1][m* q + val[n - 1][k][m + 1* w;
				  else val[n][k][m= val[n - 1][k + 1][m* q + val[n - 1][k][m + 1* w;
				  proba[n= proba[n+ val[n][k][m* w;
			   }
			   if (val[n][k][m!= 0) {
				  S = S + val[n][k][m];
				  // Bon, on comprend que certains pr�f�rent les matrices !
				}
			}
		 }
		 Somme = Somme + proba[n];
		 Esperance[r= Esperance[r(n + 1* proba[n];
		 for (int a = 1; a < 1000; a ++) {
			if (a == && n == && t == * r + 1) {
			   println("Les probas d�passant " + lim + ": (le r�glage de ce seuil pourrait �tre am�lior�...!)");
			   println("(quand le carr� grandit, il y a une assez grande plage sur laquelle on a une loi presque uniforme)");
			}
			if (t == * r + && n == a && proba[a> lim) {
			   println("La probabilit� de sortie au temps " (a + 1" est " + proba[a".");
			}
		 }
	  }
   }
   println("");
   println(" Pour les autres valeurs de r :");
   println("Si le c�t� vaut 1, l'esp�rance du temps de sortie est...1.");
   for (int b = 1; b < 15; b ++println("  Si le c�t� vaut " (* b + 1", l'esp�rance du temps de sortie est " + Esperance[b".");
   println("");
   println("   Il semble que c'est avec une loi uniforme(4 fois 1/4} que");
   println("l'esp�rance (= la moyenne) du temps de sortie est la plus �lev�e.");
}