public class ManupilationTableauDeCarte {

  static class Carte {
    int valeur;
    int couleur; };
  
  static Carte [] creerJeuDeCarte() {
    Carte [] jeu = new Carte[52];
    int i = 0;
    for ( int c = 1 ; c <= 4 ; c++ ) {
      for ( int v = 14 ; v >= 2 ; v-- ) {
        jeu[i] = new Carte();
        jeu[i].valeur = v;
        jeu[i].couleur = c;
        i++; } }
    return jeu;
  }
  
  static void couper(Carte [] tc) {
    int t = tc.length;
    int n =(int) (Math.random()*(t-1))+1;
    Carte [] tc1 = new Carte[n];
    Carte [] tc2 = new Carte[t-n];
    for ( int i = 0 ; i <= n-1 ; i++ ) {
      tc1[i] = tc[i]; }
    for ( int i = n ; i <= t-1 ; i++ ) {
      tc2[i-n] = tc[i]; }
    for ( int i = 0 ; i <= t-1-n ; i++ ) {
      tc[i] = tc2[i]; }
    for ( int i = t-n ; i <= t-1 ; i++ ) {
      tc[i] = tc1[i-t+n]; }
  }

  static void melanger(Carte [] tc) {
    int t = tc.length;
    if ( t > 1 ) {
      for ( int i = 1 ; i <= t ; i++ ) {
        couper(tc); } }
  }

  static boolean sontCartesConsecutives(Carte c1,Carte c2) {
    return ( c1.couleur == c2.couleur ) &&
           ( ( c1.valeur == c2.valeur+1 ) || ( c1.valeur == c2.valeur-1 ) );
  }
  
  static boolean estBienMelange(Carte [] jeu) {
    boolean res = true;
    int t = jeu.length;
    int i = 0;
    while ( ( i < t-1 ) && res ) {
      if ( sontCartesConsecutives(jeu[i],jeu[i+1]) ) {
        res = false; }
        else {
        i = i+1; } }
    return res;
  }

  static void mieuxMelanger(Carte [] tc) {
    int t = tc.length;
    Carte [] tcAux = new Carte[t];
    for ( int i = 0 ; i < t ; i++ ) {
      tcAux[i] = tc[i]; }
    int nb = t;
    for ( int i = 0 ; i < t ; i++ ) {
      int p =(int) (Math.random()*nb);
      tc[i] = tcAux[p];
      nb--;
      tcAux[p] = tcAux[nb]; }
  }
  
  static void afficher(Carte [] jeu) {
    for ( int i = 0 ; i < jeu.length ; i++ ) {
      Ecran.afficherln(jeu[i].couleur," ",jeu[i].valeur); }
  }    
  
  static boolean sontPresentesToutesCartes(Carte [] jeu) {
    boolean [][] t = new boolean[4][13];
    for ( int i = 0 ; i < 52 ; i++ ) {
      if ( t[jeu[i].couleur-1][jeu[i].valeur-2] ) {
        return false; }
        else {
        t[jeu[i].couleur-1][jeu[i].valeur-2] = true; } }
    return true;
  }
  
  public static void main(String [] args) {
    Carte [] jeu = creerJeuDeCarte();
    mieuxMelanger(jeu);
    afficher(jeu);
    Ecran.afficherln(sontPresentesToutesCartes(jeu));
    for ( int i = 0 ; i < jeu.length-1 ; i++ ) {
      Ecran.formater("%2d : %2d %2d : %2d %2d : %s\n",i,jeu[i].couleur,jeu[i].valeur,
                                                        jeu[i+1].couleur,jeu[i+1].valeur,
                                                        sontCartesConsecutives(jeu[i],jeu[i+1])); }
    Ecran.afficherln(estBienMelange(jeu));
  }
}