Dart

[2014/02/28] Voici le code de la version Command Line de YphiPuzzle.

import 'dart:math';
import 'dart:io';

class Puzzle {
  List boxes = new List(16);
  int empty_position;
}

void main() {
  //Fonctions
  void init_puzzle(Puzzle puzzle_in) {
    print('Init puzzle...');
    
    //Initialisation des cases
    puzzle_in.boxes[0]='[01]';  
    puzzle_in.boxes[1]='[02]';  
    puzzle_in.boxes[2]='[03]';  
    puzzle_in.boxes[3]='[04]';  
    puzzle_in.boxes[4]='[05]';  
    puzzle_in.boxes[5]='[06]';  
    puzzle_in.boxes[6]='[07]';  
    puzzle_in.boxes[7]='[08]';  
    puzzle_in.boxes[8]='[09]';  
    puzzle_in.boxes[9]='[10]';  
    puzzle_in.boxes[10]='[11]';  
    puzzle_in.boxes[11]='[12]';  
    puzzle_in.boxes[12]='[13]';  
    puzzle_in.boxes[13]='[14]';
    puzzle_in.boxes[14]='[15]';
    puzzle_in.boxes[15]='[EV]';
    
    //Initialisation de la position vide
    puzzle_in.empty_position = 15;
    
    print('Done');
  }
  
  void print_puzzle(Puzzle puzzle_in) {
    print('Print puzzle...');
    print(puzzle_in.boxes[0]+puzzle_in.boxes[1]+puzzle_in.boxes[2]+puzzle_in.boxes[3]);
    print(puzzle_in.boxes[4]+puzzle_in.boxes[5]+puzzle_in.boxes[6]+puzzle_in.boxes[7]);
    print(puzzle_in.boxes[8]+puzzle_in.boxes[9]+puzzle_in.boxes[10]+puzzle_in.boxes[11]);
    print(puzzle_in.boxes[12]+puzzle_in.boxes[13]+puzzle_in.boxes[14]+puzzle_in.boxes[15]);
    print('Empty position = ');
    print(puzzle_in.empty_position);
    print('...Done');
  }

  void mix_puzzle(Puzzle puzzle_in_1, Puzzle puzzle_in_2) {
    print('Mix puzzle...');
    
    List random_list = new List(puzzle_in_1.boxes.length);
    List check_list = new List(puzzle_in_1.boxes.length);
    
    //Initialiser la check_list
    for (int i = 0; i < random_list.length; i++) {
      check_list[i]=false;
    }
    
    //Initialiser la random_list
    int i = 0;
    int j = 0;
    var rgn = new Random();
    while(j < 16) {
      i = rgn.nextInt(16);
      if (check_list[i]==false) {
        random_list[j]=i;
        j = j + 1;
        check_list[i]=true;
      } 
    }
        
    //Mélanger le puzzle
    for (int i = 0; i < puzzle_in_1.boxes.length ; i++) {
      puzzle_in_1.boxes[random_list[i]]=puzzle_in_2.boxes[i];
    }
    
    //Mettre à jour la position vide
    puzzle_in_1.empty_position = random_list[puzzle_in_1.boxes.length-1];
    
    print('Done');
  }
  
  bool compare_puzzle(Puzzle puzzle_in_1, Puzzle puzzle_in_2) {
    print('Check puzzle...');
    
    bool compare = true;
    
    if (puzzle_in_1.boxes.length!=puzzle_in_2.boxes.length) {
      return false;
    } else {
      int i = 0;
      while(i < puzzle_in_1.boxes.length) {
        if (puzzle_in_1.boxes[i]!=puzzle_in_2.boxes[i]) {
          compare = false;
          break;
        } 
        i = i + 1;
      }
      return compare;
    }
    
    
    return true;
  }

  void move_down (Puzzle puzzle_in) {
    if (puzzle_in.empty_position < 4) {
      print('move down: impossible');
    } else {
      String box_to_move = puzzle_in.boxes[puzzle_in.empty_position-4];
      puzzle_in.boxes[puzzle_in.empty_position-4]='[EV]';
      puzzle_in.boxes[puzzle_in.empty_position]=box_to_move;
      puzzle_in.empty_position=puzzle_in.empty_position-4;      
    }
  }

  void move_up (Puzzle puzzle_in) {
    if (puzzle_in.empty_position > 11) {
      print('move up: impossible');
    } else {
      String box_to_move = puzzle_in.boxes[puzzle_in.empty_position+4];
      puzzle_in.boxes[puzzle_in.empty_position+4]='[EV]';
      puzzle_in.boxes[puzzle_in.empty_position]=box_to_move;
      puzzle_in.empty_position=puzzle_in.empty_position+4;      
    }
  }
  

  void move_right (Puzzle puzzle_in) {
    if (puzzle_in.empty_position % 4 == 0) {
      print('move right: impossible');
    } else {
      String box_to_move = puzzle_in.boxes[puzzle_in.empty_position-1];
      puzzle_in.boxes[puzzle_in.empty_position-1]='[EV]';
      puzzle_in.boxes[puzzle_in.empty_position]=box_to_move;
      puzzle_in.empty_position=puzzle_in.empty_position-1;      
    }
  }

  void move_left (Puzzle puzzle_in) {
    if (puzzle_in.empty_position % 4 == 3) {
      print('move left: impossible');
    } else {
      String box_to_move = puzzle_in.boxes[puzzle_in.empty_position+1];
      puzzle_in.boxes[puzzle_in.empty_position+1]='[EV]';
      puzzle_in.boxes[puzzle_in.empty_position]=box_to_move;
      puzzle_in.empty_position=puzzle_in.empty_position+1;      
    }
  }
  
  //Message d'accueil
  print("Hello, YphiPuzzle!");
  
  //Initialisation du puzzle témoin
  Puzzle good_puzzle = new Puzzle();
  init_puzzle(good_puzzle);

  //Initialisation du puzzle
  Puzzle yphi_puzzle = new Puzzle();
  init_puzzle(yphi_puzzle);

  //Mélange du puzzle
  mix_puzzle(yphi_puzzle,good_puzzle);
  
  //Affichage du puzzle
  print_puzzle(yphi_puzzle);
  
  int move_count = 0;
  while (!(compare_puzzle(yphi_puzzle,good_puzzle))) {
    
    //Invite de commande
    print('Type a command (z = up, s = down, q = left, d = right, e = exit): ');
    
    //Lecture de la commande
    String input = stdin.readLineSync();
    
    //Interprétation de la commande
    if (input == 'z') {
      print('You typed: $input ==> Moving up');
      move_up(yphi_puzzle);
    } else if (input == 's') {
      print('You typed: $input ==> Moving down');
      move_down(yphi_puzzle);
    } else if (input == 'q') {
      print('You typed: $input ==> Moving left');
      move_left(yphi_puzzle); 
    } else if (input == 'd') {
      print('You typed: $input ==> Moving right');
      move_right(yphi_puzzle);  
    } else if (input == 'e') {
      print('You typed: $input ==> Exiting');
      //A modifier
      move_right(yphi_puzzle);  
    } else {
      print('Unknown command');
    }
    
    move_count = move_count + 1;
    //Affichage du puzzle
    print_puzzle(yphi_puzzle);
    print('Move count = $move_count');

  }
  
}