Taquin Excel + Google Sheets

Bonjour à tous,

J'ai développé un nouveau jeu du taquin dans un UserForm cette fois-ci :

taquin

Avec un bouton "Abandonner la partie" qui annule tous les déplacements et reconstitue l'image sous vos yeux

Cliquez ici pour le télécharger : taquin Excel


EDIT : La version pour Google Sheets est ici : taquin Google Sheets

jeu google sheets apps script

Le code VBA du jeu est maintenant accessible

Merci, on va pouvoir se régaler ... je n'aime pas trop les jeux, mais j'aime apprendre en regardant les codes et les façons de faire. Là je ne vais pas être déçu !

Je suis en train d'essayer d'en faire une version pour Google Sheets pour m'exercer

S'il y en a qui veulent aussi s'y essayer, je vous mets à disposition les 16 images du taquin :

14images-taquin.zip (198.52 Ko)

Je suis en train d'essayer d'en faire une version pour Google Sheets pour m'exercer

Sans grande surprise, l'exécution des scripts est bien trop lente (environ 2 secondes pour déplacer une image à l'écran ) mais il fonctionne tout de même

taquin google sheets 2

Le code me semble bien plus intéressant que le jeu en lui-même, je vous le partagerai très bientôt

Je ne m'y suis pas mis, il me faudrait bien une semaine pour acquérir les "briques" de base de programmation nécessaire ... mais oui ce style de programmation est plus intéressant que le VBA. J'ai des programmes qui tournent en déclencheur sur l'agenda et les mails sans soucis, mais pour sheets, en effet, il y a de la latence (je me pose la question de l'utilité d'avoir des images base64). A contrario sheets et génial pour ce qui est de query, filter, unique, join, etc. Du reste tes tutos (notamment query) sont aussi une mine d'or.

Sébastien, est-ce que tu utilises setAnchorCell (ou setAnchorCellXOffset) pour repositionner une image ?

Tout au début, j'ai utilisé setAnchorCellXOffset et setAnchorCellYOffset pour définir précisément les "marges" des images.

Ensuite dans le code je n'utilise plus que setAnchorCell pour déplacer les images.

J'ai publié le code complet du taquin pour Google Sheets ici :
https://www.sheets-pratique.com/fr/codes/taquin

Et le fichier peut être copié à partir de cette page :
https://www.sheets-pratique.com/fr/telechargements/jeux/taquin-no522

Pas mal !

  • Ma première surprise a été de ne pas réussir à accéder à l'image lorsque celle-ci est dans la cellule.
  • Ensuite j'ai fait un test simple de déplacement d'une image ... et c'était assez instantané ! à creuser. Je vais multiplier les images pour voir.

Une nouvelle version un peu plus rapide est en ligne

https://www.sheets-pratique.com/fr/codes/taquin

Bonjour,

J'ai tenté de faire comme le patron (mais pas si bien d'un point de vue de l'écriture) ... avec quelques différences :

  • les images qui peuvent être déplacées sont celles dont la case à laquelle elles sont rattachées comporte l'adresse de la case vide voisine
  • les positions de toutes les images sont enregistrées en A1 et comparées à la cible

Cela donne un code assez court et jouable (cela ne sera jamais aussi rapide qu'un appareil physique).

const doc = SpreadsheetApp.getActiveSpreadsheet();
const f = doc.getSheets()[0];
const images = f.getImages();
const adresses = ["C2","D2","E2","B3","C3","D3","E3","B4","C4","E4","D5","B5","C5","D4","B2"];
const cible = ["C2","D2","E2","B3","C3","D3","E3","B4","C4","D4","E4","B5","C5","D5","B2"];

function imageClic(n){
  var img = images[n]; 
  var ici = img.getAnchorCell().getA1Notation();
  var la = img.getAnchorCell().getValue();
  if (la != ""){
    img.setAnchorCell(f.getRange(la));
    f.getRange(ici).offset(0, 1).setValue(ici);
    f.getRange(ici).offset(0,-1).setValue(ici);
    f.getRange(ici).offset( 1,0).setValue(ici);
    f.getRange(ici).offset(-1,0).setValue(ici);
    f.getRange(la).offset(0, 1).setValue('');
    f.getRange(la).offset(0,-1).setValue('');
    f.getRange(la).offset( 1,0).setValue('');
    f.getRange(la).offset(-1,0).setValue('');
    var seq=f.getRange('A1').getValue().replace(ici,la);
    f.getRange('A1').setValue(seq);
    if (seq == cible.join()){Browser.msgBox('Gagné !');}
  }
}

J'ai mis une situation de départ assez simple pour tester la fin de la partie

function imageLayOut(){
  var actuel = [];
  for (var n=0 ; n<15 ; n++){
    var img = images[n];
    img.setAnchorCell(f.getRange(adresses[n]));
    actuel[n] = adresses[n];
  }
  f.getRange('A1:F6').clearContent();
  f.getRange('E5').offset(0,-1).setValue('E5');
  f.getRange('E5').offset(-1,0).setValue('E5');
  f.getRange('A1').setValue(actuel.join());
}

Reste à faire la mise en place aléatoire ... et là, soucis ! interrogation !!

Je ne suis pas certain qu'une mise en place purement aléatoire n'amène pas des impossibilités de terminer la figure ! Il faudrait comme pour un matériel physique, partir de la figure et mélanger informatiquement par déplacements aléatoires.

Pour le fun, je vais faire un algorithme de déplacement aléatoire de x coups à partir de la position finale ...

Cela donne un code assez court et jouable

Pour le fun, je vais faire un algorithme de déplacement aléatoire de x coups à partir de la position finale ...

Reste à faire la mise en place aléatoire ... et là, soucis ! interrogation !!

Je ne suis pas certain qu'une mise en place purement aléatoire n'amène pas des impossibilités de terminer la figure !

C'est justement ce que j'ai fait, parce qu'il me semble aussi qu'un simple positionnement aléatoire créée des parties impossibles à terminer.

Même si quand on voit visuellement le mélange on pourrait penser le contraire ...

Pour déplacer une seule fois chaque image, les déplacements aléatoires sont d'abord enregistrés dans des arrays puis, à la fin du mélange, chaque image est positionnée à sa nouvelle place.

Reste à faire la mise en place aléatoire ... et là, soucis ! interrogation !!

Je ne suis pas certain qu'une mise en place purement aléatoire n'amène pas des impossibilités de terminer la figure !

C'est justement ce que j'ai fait, parce qu'il me semble aussi qu'un simple positionnement aléatoire créée des parties impossibles à terminer.

Même si quand on voit visuellement le mélange on pourrait penser le contraire ...

Pour déplacer une seule fois chaque image, les déplacements aléatoires sont d'abord enregistrés dans des arrays puis, à la fin du mélange, chaque image est positionnée à sa nouvelle place.

Chapeau ! je vais donc me plonger dans ta prose ...

En effet, je n'avais pas prêter attention à ton commentaire

// Mélange des images (en déplaçant aléatoirement les images adjacentes dans la case vide)

Bon alors, pour le fun, je vais tenter de montrer sur la grille le déplacement physique ... ce ne sera pas très performant (car pas 9999 coups) mais visuellement rigolo ! si j'y arrive dans quelques jours.

Bon, voici, après quelques minutes de réflexion, la façon la plus flémarde de mélanger

function melanger(){
  for (var x=1;x<=200;x++){
    imageClic(Math.floor((Math.random()*15)));
  }
}

en faisant les manip, j'ai perdu les scripts attachés à certaines images ...

Sébastien,

// Enregistrement de la grille
function setGrille(grille) {
  PropertiesService.getUserProperties().setProperties({'grille': JSON.stringify(grille)}, true);
}

// Récupération de la grille
function getGrille() {
  return JSON.parse(PropertiesService.getUserProperties().getProperty('grille'));
}

je trouve très élégant d'être passé par un json ... mais il me semble que scriptProperties.setProperty admet directement un array, sauf si je me trompe (notion nouvelle pour moi, mais qui me rappelle la sauvegarde en cookies que je faisais sur un jeu de scrabble et pour lequel il fallait purement du texte)

mais il me semble que scriptProperties.setProperty admet directement un array, sauf si je me trompe

J'avais fait un test et ça n'avait pas marché (et si je retire JSON.stringify et JSON.parse ça ne fonctionne plus).

Sur le site de Google, c'est indiqué que ça sert à stocker des "valeurs simples", donc à priori pas d'arrays.

ok, noté

j'ai regardé ceci

function makeArray(){
  var someNames = ['Fred', 1232, 'Juan', [123.33, 666], 'Kayla'];
  scriptProperties.setProperty('someNames', someNames);
}

mais pas encore essayé https://gist.githubusercontent.com/kurtkaiser/28d2f708a8bb870ab996217efab1c235/raw/f67e9bd902269a2c1...

Si on voulait vraiment faire un taquin avec des déplacements instantanés, je pense qu'il faudrait l'écrire directement en JavaScript et l'insérer dans une boîte de dialogue personnalisée grand format :

grande fenetre sheets
Rechercher des sujets similaires à "taquin google sheets"