Sudoku (le jeu japonais)

Description

Ce code a été fait à deux (ouais, on trouvait ça plus marrant de diviser la tâche en deux et vu que Wims a du mal à faire des while (;)) :D)
Donc, Wims et moi sommes tous deux créateurs de ce splendide code mélant habillement regex, picwin, variables binaires, keydown, etc ...
Ce code utilisait précédemment un site d'où il téléchargeait la grille à compléter. Désormais (depuis la version 3.0), le code génère lui-même sa grille. Vous pouvez donc y jouer même hors-line, c'est une grande nouveauté !

Le but de ce code est en vérité d'en poster un avant CoolMan002, et d'être les premiers à le faire sur ircfr en 2006 (joke :p).
Attention, ce n'est pas pour autant que ce code est nul !
Bon, trêve de bavardage, voici comment il fonctionne :
/sudoku [1-4], 1 pour facile, 2 pour normal, 3 pour difficile, 4 pour expert.
La difficulté intervient sur le nombre de chiffres masqués (sur 81 au total)
Facile : de 42 à 45 masqués, Normal : de 46 à 48, Difficile : 49 à 51, Expert : 52 à 54

Pour remplir une case, vous cliquez dessus (vous aurez alors un carré rouge), puis vous tapez sur votre pavé numérique le nombre en question.

Plusieurs options sont disponibles, dont celle qui vérifiera et vous donnera le nombre de fautes, celle qui corrigera entièrement votre jeu (auquel vous ne pourrez plus jouer), et une dernière qui vous indique simplement si votre coup est possible ou pas (du genre si vous avez mis deux fois le même chiffre dans la colonne) qui permet d'éviter les erreurs d'inattention.

Une aide est incluse (via le menu de la picwin)
Bon jeu :)

Source / Exemple :


;******************************
;Sudoku codé par Wims & ArKanis
; Créé le 01/01/06
; Version 3.0
;******************************

alias sudoku {
  if (!$1) { pre | return }
  if ($window(@sud)) { var %x = $window(@sud).x, %y = $window(@sud).y | window -c @sud }
  if ($hget(Sudoku)) hfree Sudoku
  if ($hget(SudokuTemp)) hfree SudokuTemp
  var %t = $iif($1 isnum 1-,$1,1)
  hadd -m SudokuTemp Difficulte $iif(%t isnum 1-4,%t,1)
  if ((%x) && (%y)) window -dp +bx @sud %x %y 280 298
  else window -Cdp +bx @sud -1 -1 280 298
  .timersudoctime off | drawrect -fr @sud 16777215 1 0 0 300 300
  drawline -r @sud 0 1 1 232 500 232 | drawline -r @sud 0 1 1 50 500 50
  drawline -r @sud 0 1 1 80 500 80 | drawline -r @sud 0 1 244 20 244 500
  drawline -r @sud 0 1 32 20 32 500 | drawline -r @sud 0 1 62 20 62 500
  drawline -r @sud 0 2 275 20 275 500 | drawline -r @sud 0 1 1 141 500 141
  drawline -r @sud 0 1 1 171 500 171 | drawline -r @sud 0 2 2 293 500 293
  drawline -r @sud 0 1 123 20 123 500 | drawline -r @sud 0 1 153 20 153 500
  drawline -r @sud 0 1 214 20 214 500 | drawline -r @sud 255 2 93 21 93 291
  drawline -r @sud 0 1 1 262 500 262 | drawline -r @sud 255 2 2 202 273 202
  drawline -r @sud 255 2 184 21 184 291 | drawline -r @sud 255 2 2 111 273 111
  drawrect -r @sud 0 2 1 19 291 291 | var %t = $hget(SudokuTemp,Difficulte)
  drawtext -r @sud 255 verdana 10 2 2 [Sudoku] [Level] : $replace(%t,4,Expert,3,Difficile,2,Moyen,1,Facile)
  sudogen
}

alias -l dtime {
  if (!$window(@sud)) { .timersudoctime off | return }
  drawrect -nf @sud 0 1 175 2 180 10
  hadd -m sudokutemp ctimep $calc($ctime - $$hget(SudokuTemp,Ctime))
  drawtext -nr @sud $rgb($color(7)) verdana 10 175 2 $duration($calc($ctime - $$hget(SudokuTemp,Ctime)))
  drawdot @sud
}

alias -l depsud {
  window @sud $calc($mouse.dx - $1) $calc($mouse.dy - $2) 280 298
  if ($mouse.key & 1) .timerdepsud 0 0 depsud $1-
}

ON *:KEYDOWN:@sud:*:{
  if ($keychar isin 0P) { pausesud | return }
  elseif ($hget(sudokutemp,coord) != $null) && (nonfixe isin $hget(sudoku,$hget(sudokutemp,coord))) && ($hget(sudoku,$hget(sudokutemp,coord))) && ($keychar isin +-) {
    var %h = $hget(sudokutemp,$hget(sudokutemp,coord)) ,%r = $iif(!%h,1,$replace(%h,sur,2,incertain,3))
    $iif($keychar == +,inc,dec) %r | if (%r == $iif($keychar == +,4,0)) var %r = $iif($keychar == +,1,3)
    modifétat $replace(%r,1,0,2,sur,3,incertain)
    return
  }
  var %c = $hget(SudokuTemp,coord) $iif($istok(37.38,$keyval,46),-,+) $iif($istok(37.39,$keyval,46),10,1) ,%a = $iif($len(%c) == 1,$+(0,%c),%c)
  if ($keychar isnum 1-9) sudonum $$hget(SudokuTemp,Case) $keychar
  elseif ($istok(8-46,$keyval,45)) sudonum $$hget(SudokuTemp,Case)
  elseif ($keyval == 13) && ($hget(SudokuTemp,coord) != $null) readyd $hget(SudokuTemp,coord)
  elseif ($istok(37.38.39.40,$keyval,46)) && ($left(%a,1) isnum 0-8) && ($right(%a,1) isnum 0-8) {
    var %old = $hget(sudokutemp,coord)
    hadd -m SudokuTemp Coord %a
    if ($hget(SudokuTemp,case) != %old) coorf %old 16777215
    if ($hget(SudokuTemp,case) == %a) return
    coorf %a $iif(nonfixe isin $hget(Sudoku,%a) || $hget(Sudoku,%a) == $null,65280,37632) 
  }
}

menu @sud {
  dclick : depsud $calc($mouse.dx - $window(@sud).x)) $calc($mouse.dy - $window(@sud).y)
  mouse : dessc $mouse.x $mouse.y
  sclick : readyd $mouse.x $mouse.y
  uclick : .timerdepsud off
  $iif(((nonfixe isin $hget(Sudoku,$checkpos($mouse.x,$mouse.y))) && ($checkpos($mouse.x,$mouse.y) != $null)),$mo($ifmatch))  
  .$iif($hget(SudokuTemp,$hget(SudokuTemp,Pos)) == sur,$style(1)) Case sûre:modifétat sur
  .$iif($hget(SudokuTemp,$hget(SudokuTemp,Pos)) == incertain,$style(1)) Case incertaine:modifétat incertain
  .$iif(!$hget(SudokuTemp,$hget(SudokuTemp,Pos)),$style(1)) Case normale:modifétat 0
  Changer la difficulté
  .$iif(((!$hget(SudokuTemp,Difficulte)) || ($hget(SudokuTemp,Difficulte) == 1)),$style(1)) Facile:sudoku 1
  .$iif($hget(SudokuTemp,Difficulte) == 2,$style(1)) Moyen:sudoku 2
  .$iif($hget(SudokuTemp,Difficulte) == 3,$style(1)) Difficile:sudoku 3
  .$iif($hget(SudokuTemp,Difficulte) == 4,$style(1)) Expert:sudoku 4
  $iif($hget(SudokuTemp,Aide),$style(1)) Faciliter le remplissage de la grille:hadd -m SudokuTemp Aide $iif($hget(SudokuTemp,Aide),0,1)
  Nouvelle grille:{
    if ((($hget(sudoku)) && ($?!="Etes-vous sûr(e) de vouloir commencer $crlf $+ une nouvelle grille et ainsi quitter cette partie ?")) || (!$hget(sudoku))) {
      sudogen | .timersudoctime off | drawrect -f @sud 0 1 160 2 100 10
      if ($hget(SudokuTemp,Soluce)) hdel SudokuTemp Soluce
    }
  }
  $iif($hget(SudokuTemp,Soluce) || !$hget(sudoku),$style(2)) Donner la solution:if ($?!="Etes-vous sûr(e) de vouloir avoir la solution ?") sudocorrect
  -
  Menu principal { window -c @sud | .hfree -w Sudoku* | .timersudoctime off | sudoku }
  Meilleurs scores:msud
  Règles du jeu:sudaide
  Comment jouer ?:htp?
  -
  Fermer:window -c @sud | hfree -w Sudoku* | .timersudoctime off
  -
  Unload
  .Supprimer:{
    if (!$?!="Voulez-vous vraiment supprimer le jeu ? Non pour annuler") {
      window -c @sud | window -c @menu | window -c @aidesud | window -c @tuto | window -c @msud
      hfree -w Sud*
      .timersudoctime off
      .remove $shortfn($script)
      .remove $shortfn($$findfile($scriptdir,SudoTuto.jpg,1))
      noop $findfile($scriptdir,sudosco?.sud,0,.remove $shortfn($1-))
      noop $input(Le sudoku a bien été supprimé et déchargé)
      .unload -rs $qt($script)
    }
  }
  .Unload:{
    if (!$?!="Confirmer le déchargement ? Non pour annuler") return
    window -c @sud | window -c @menu | window -c @aidesud | window -c @tuto | window -c @msud
    hfree -w Sudoku* | .timersudoctime off | noop $input(Le sudoku a bien été déchargé)
    .unload -rs $shortfn($script)
  }
}

alias -l sudogen {
  if (!$window(@sud)) return
  if ($hget(Sudoku)) hfree $ifmatch
  var %ligne = 0
  while %ligne <= 8 {
    var %colonne = 0
    while %colonne <= 8 {
      coorf $+(%colonne,%ligne) eff
      inc %colonne
    }
    inc %ligne
  }
  if ($hget(Sudoku,0).item) coorf 00 $iif(nonfixe isin $hget(sudoku,00) || $hget(sudoku,00) == $null,65280,37632)
  hadd -m SudokuTemp Ctime $ctime
  hadd -m SudokuTemp coord 00
  if ($isalias(dtime)) {
    .timersudoctime 0 1 dtime
    dtime
  }
  var %ticks = $ticks, %r = $r(100,120), %s = 0, %l, %t = 1, %a = 123456789, %sol = $+(%a,;,$seq(0,X,2,9))
  while (%t < 9) var %a = $+($right(%a,-1),$left(%a,1)), %sol = $puttok(%sol,%a,$calc($iif($calc($calc(%t *3) % 8),$v1,8) +1),59), %t = %t + 1
  while (%s <= %r) var %n = $r(8,16), %l = $instok(%l,%n,-1,32), %s = %s + %n
  var %i = 1, %m = $numtok(%l,32)
  while (%i <= %m) {
    var %t = 1, %n = $gettok(%l,%i,32)
    while (%t <= %n) var %sol = $echange.sud(%sol), %t = %t + 1
    if ($r(0,10) <= 6) var %sol = $permut.sud(%sol)
    var %sol = $transp.sud(%sol), %i = %i + 1
  }
  var %t = 1, %sol = $remove(%sol,;), %l = $hget(SudokuTemp,Difficulte)
  hadd -m SudokuTemp Cheat %sol
  if (%l == 2) var %n = $r(46,48)
  elseif (%l == 3) var %n = $r(49,51)
  elseif (%l == 4) var %n = $r(52,54)
  else var %n = $r(42,45)
  if (%n > 81) return
  while (%t <= %n) {
    var %r = $r(1,81), %s = $+(^,$chr(40),.,$chr(123),$calc(%r - 1),$chr(125),$chr(41))
    if ($mid(%sol,%r,1)) var %sol = $regsubex(%sol,$+(%s,(.)),\t0), %t = %t + 1
  }
  var %t = 0
  while (%t <= 80) {
    var %c = $int($calc(%t / 9) % 9), %l = $calc(%t % 9)
    if ($mid(%sol,$calc(%t +1),1)) s.a $+(%l,%c) $ifmatch
    inc %t
  }
}

alias -l s.a {
  hadd -m Sudoku $$1-2
  coorf $1 0 $$2
}
alias -l seq {
  ;texte subtext from(num) to(num)
  ;ex $seq(varX,X,1,10) = var1;var2;var3;var4;var5;var6;var7;var8;var9;var10
  if (($3 !isnum) || ($4 !isnum) || (; isin $2) || ($2 == $null)) return
  return $left($regsubex($str($+($1,;),$calc($4 - $3 +1)),$+(/,$2,/g),$calc($3 + \n)),-1)
}
alias -l transp.sud {
  var %t = 1, %sol
  while (%t <= 9) {
    var %i = 0
    while (%i < 9) var %sol = $+(%sol,$mid($1,$calc(%t + %i * 10),1)), %i = %i + 1
    var %sol = $+(%sol,;)
    inc %t
  }
  return $left(%sol,-1)
}
alias -l echange.sud {
  var %t = 1, %r = $r(0,2), %m = $calc(%r *3+1), %n = $calc(%r *3+3), %r = $r(%m,%n), %r2 = %r
  while (%r == %r2) var %r2 = $r(%m,%n)
  return $puttok($puttok($1,$gettok($1,%r2,59),%r,59),$gettok($1,%r,59),%r2,59)
}
alias -l permut.sud {
  var %r = $r(1,9), %r2 = %r
  while (%r == %r2) var %r2 = $r(1,9)
  return $replacex($1,%r,%r2,%r2,%r)
}

alias -l sudonum {
  if (!$regex($1,^[0-8]{2}$)) return
  var %old = $hget(SudokuTemp,Coord)
  if (!$regex($2,^[1-9]{1}$)) {
    if ($regex($hget(Sudoku,$1),nonfixe)) {
      hdel Sudoku $1
      coorf $1 eff
      if ($hget(SudokuTemp,Case)) hdel SudokuTemp Case
      coorf $hget(sudokutemp,coord) 64512
    }
    return
  }
  var %ligne = $right($1,1), %colonne = $left($1,1), %case = $1
  if ($hget(SudokuTemp,Aide)) {
    var %t = 0
    while %t <= 8 {
      if (%t != %ligne) {
        if ($gettok($hget(Sudoku,$+(%colonne,%t)),1,32) == $2) {
          tokenize 32 $colign($+(%colonne,%t))
          var %t = $input(La case de la $1 colonne sur la $3 ligne qui est sur la même colonne porte le même numéro !,o)
          return
        }
      }
      if (%t != %colonne) {
        if ($gettok($hget(Sudoku,$+(%t,%ligne)),1,32) == $2) {
          tokenize 32 $colign($+(%t,%ligne))
          var %t = $input(La case de la $1 colonne sur la $3 ligne qui est sur la même ligne porte le même numéro !,o)
          return
        }
      }
      inc %t
    }
    var %debligne = %ligne, %debcolonne = %colonne
    while ($round($calc(%debligne /3),0) != $calc(%debligne / 3)) dec %debligne
    while ($round($calc(%debcolonne /3),0) != $calc(%debcolonne / 3)) dec %debcolonne
    var %c.ligne = 0
    while (%c.ligne <= 2) {
      var %c.colonne = 0, %t.ligne = $calc(%c.ligne + %debligne)
      while (%c.colonne <= 2) {
        var %t.colonne = %c.colonne + %debcolonne
        if ((%case != $+(%t.colonne,%t.ligne)) && ($gettok($hget(Sudoku,$+(%t.colonne,%t.ligne)),1,32) == $2)) {
          tokenize 32 $colign($+(%t.colonne,%t.ligne))
          var %t = $input(La case de la $1 colonne sur la $3 ligne qui est dans le même carré porte le même numéro !,o)
          return
        }
        inc %c.colonne
      }
      inc %c.ligne
    }
  }
  if ($hget(SudokuTemp,%case)) hdel SudokuTemp $hget(SudokuTemp,Case) 
  hadd -m Sudoku $1-2 nonfixe
  coorf $1 15767584 $2
  if (%old) coorf $ifmatch 16777215
  hadd -m SudokuTemp Coord $1
  .timer -m 1 50 coorf $1 64512
  if ($hget(SudokuTemp,Case)) hdel SudokuTemp Case
}

alias -l sudocheck {
  if (!$hget(Sudoku)) return
  if ($hget(SudokuTemp,Soluce)) return
  var %ligne = 0, %fautes = 0
  while (%ligne <= 8) {
    var %colonne = 0
    while (%colonne <= 8) {
      var %case = $+(%colonne,%ligne)
      if ($regex($hget(Sudoku,%case),nonfixe)) {
        var %correc = $sudosoluce(%case)
        if ($gettok($hget(Sudoku,%case),1,32) != %correc) inc %fautes
      }
      inc %colonne
    }
    inc %ligne
  }
  if (%fautes) {
    var %t = $input(Il y a %fautes $+(faute,$iif(%fautes >= 2,s)))
    if ($hget(sudokutemp,case) != $null || $hget(sudokutemp,coord) != $null) { coorf $v1 16777215 | hdel sudokutemp coord | hdel sudokutemp case }
    halt
  }
  else {
    .timersudoctime off
    var %h = $+(sudsco,$iif($hget(sudokutemp,difficulte),$replacex($ifmatch,1,Facile,2,Moyen,3,Difficile,4,Expert),facile)) ,%t = $hget(sudokutemp,ctimep)
    hadd -m %h $+(%t,/,<<<¿>>>) 1
    mstri $iif($hget(sudokutemp,difficulte),$replacex($ifmatch,1,Facile,2,Moyen,3,Difficile,4,Expert),facile)
    if ($hfind(%h,$+(%t,/,<<<¿>>>))) {
      :back
      var %n = $input(Bravo !! Tu as fait un nouveau record de $+($duration(%t),$chr(44)) inscris ton pseudo ou clique sur Cancel pour ne pas ajouter le record :,et,Nouveau record !)	
      if (!%n) goto lu
      elseif ($len(%n) > 10) goto back 
      hadd -m %h $+(%t,/,%n) 1
      :lu
      if ($input(Voulez-vous passer au niveau supérieur,y)) { var %ga? on | goto sup }
      else { hadd -m SudokuTemp Soluce 1 | .timersudoctime off | hfree -w sudoku* }
    }
    elseif ($?!="Bien joué ! Vous avez fini ce sudoku en $+($duration(%t),.) Voulez-vous passer au niveau supérieur ?") { var %ga? on | goto sup }
    else { .timersudoctime off | hfree -sw sudoku* | coorf $hget(sudokutemp,coord) 16777215 }
    :sup 
    hdel -m %h $+(%t,/,<<<¿>>>)
    if (!$isdir(Sudoku)) mkdir Sudoku
    hsave %h sudoku\ $+ %h $+ .sud
    mstri $iif($hget(sudokutemp,difficulte),$replacex($ifmatch,1,Facile,2,Moyen,3,Difficile,4,Expert),facile)
    if (!%ga?) return 
    var %o = $calc($hget(SudokuTemp,Difficulte) +1) 
    if (%o == 5) var %o = 4
    elseif (%o !isnum 2-4) var %o = 2
    sudoku %o
  }
}

alias mstri {
  var %h = $+(sudsco,$1) ,%a 1 ,%b = $hget(%h,0).item ,%c = 1
  while (%a <= %b) { var %stock = %stock $replace($hget(%h,%a).item,$chr(47),$chr(46)) | inc %a }
  var %sort = $sorttok(%stock,32,n)
  if ($window(@msud)) {
    drawrect -fn @msud 15 0 2 45 80 90
    drawrect -fn @msud 15 0 90 45 150 90
  }
  if ($hget(%h)) hfree %h
  while (%c <= $iif($numtok(%stock,32) > 6,6,$ifmatch)) {
    if ($window(@msud)) {
      drawcn @msud verdana 12 1 $calc(47 + (%c - 1) * 14) $token($token(%sort,%c,32),2,46) 
      .drawcn @msud verdana 12 1 $calc(47 + (%c - 1) * 14) $duration($token($token(%sort,%c,32),1,46))
    }
    hadd -m %h $+($token($token(%sort,%c,32),1,46),/,$token($token(%sort,%c,32),2,46))
    inc %c
  }
  if ($window(@msud)) drawdot @msud
}

alias -l sudosoluce {
  if (!$hget(SudokuTemp,Cheat)) return
  if (!$regex($1,^[0-8]{2}$)) return
  return $mid($hget(SudokuTemp,Cheat),$calc($right($1,1) * 9 + $left($1,1) +1),1)
}
alias -l sudocorrect {
  hadd -m SudokuTemp Soluce 1
  var %fautes = 0, %ligne = 0, %justes = 0, %vides = 0
  while (%ligne <= 8) {
    var %colonne = 0
    while (%colonne <= 8) {
      var %case = $+(%colonne,%ligne), %correct = $sudosoluce(%case), %r = $hget(Sudoku,%case)
      if (nonfixe isin %r) {
        if ($gettok(%r,1,32) != %correct) { inc %fautes | coorf %case 14687456 %correct | dcroix %case line }
        else { coorf %case 15767584 %correct | inc %justes | dcroix %case rect }
      }
      if (!%r) { inc %vides | coorf %case 255 %correct }
      hadd -m Sudoku %case %correct
      inc %colonne
    }
    inc %ligne
  }
  var %t = $input(Il y avait %fautes $+(faute,$iif(%fautes >= 2,s),$chr(44)) %justes $+(juste,$iif(%justes >= 2,s),$chr(44)) %vides $+(vide,$iif(%vides >= 2,s)),o)
  .timersudoctime off
  hfree -w sudoku*
}

alias -l mo {
  var %c = $left($1,1), %l = $right($1,1), %t = $int($calc(%c / 3 +1))
  if (%l isnum 3-5) inc %t 3
  elseif (%l isnum 6-8) inc %t 6
  return Carré %t - Case $calc(%c % 3+(%l % 3)*3+1)
}

alias -l coorf {
  if (!$window(@sud)) return
  if (!$regex($1,^[0-8]{2}$)) return
  var %x $token(3.33.63.94.124.154.185.215.245,$calc($left($1,1) + 1),46)
  var %y $token(21.51.81.112.142.172.203.233.263,$calc($right($1,1) + 1),46)
  if ($2 == eff) { drawrect -f @sud 0 1 %x %y 29 29 | return }
  if (!$3) { drawrect -r @sud $2 1 %x %y 29 29 }
  else {
    drawrect -f @sud 0 1 %x %y 29 29
    drawtext -r @sud $2 verdana 20 $calc(%x + 8) $calc(%y + 1) $3
    if ($hget(SudokuTemp,%case)) hdel SudokuTemp %case
    if ($hget(SudokuTemp,Case) != $null) && ($4 != flag) {
      .timer -m 1 0 coorf $hget(sudokutemp,case) 16777214 
      hdel sudokutemp case
    }
    if ($hget(Sudoku,0).item == 81) sudocheck
  }
}
alias modifétat {
  var %case = $hget(SudokuTemp,coord)
  coorf %case $replacex($1,sur,56320,incertain,8355711,0,15767584) $iif($hget(Sudoku,%case),$ifmatch,0) flag
  hadd -m SudokuTemp %case $iif(!$1,0,$1)
  if ($hget(sudokutemp,coord) != $null) coorf $ifmatch 16777215 
  hadd -m sudokutemp coord %case
  .timer -m 1 50 coorf %case 645122
}

alias -l dessc {
  if ($hget(sudokutemp,pause)) return
  if ($1 isnum 3-275 && $2 isnum 21-293 && $hget(sudoku)) { 
    var %a = $checkpos($1,$2)
    if ($hget(SudokuTemp,Coord) == %a) return
    if ((($hget(SudokuTemp,Case) != $hget(SudokuTemp,Coord)) || ($hget(SudokuTemp,Case) == %a)) && ($hget(SudokuTemp,Coord) != $null)) {
      coorf $ifmatch 16777215
      hdel SudokuTemp Coord    
    }
    if ($hget(SudokuTemp,Case) == %a) return
    if (nonfixe isin $hget(Sudoku,%a)) || ($hget(sudoku,%a) == $null) { coorf %a 65280 | hadd -m SudokuTemp Coord %a }
    else { coorf %a 37632 | hadd -m SudokuTemp Coord %a }
  }
  elseif ($hget(SudokuTemp,Case) != $hget(SudokuTemp,Coord)) {
    if ($hget(SudokuTemp,Coord)) { coorf $ifmatch 16777215 | hdel SudokuTemp Coord }
  }
}

alias -l readyd {
  if (%limite) return
  set -u1 %limite 1
  if ($hget(sudokutemp,pause)) return 
  var %a = $iif(!$2,$1,$checkpos($1,$2))
  if (((nonfixe !isin $hget(Sudoku,%a)) && ($hget(Sudoku,%a))) || ($hget(SudokuTemp,Case) == %a)) || (!$hget(sudoku)) return
  if ($hget(SudokuTemp,Case) != $null) coorf $ifmatch 16777215
  if ($hget(sudokutemp,coord) != $null) coorf $ifmatch 16777215
  hadd -m SudokuTemp Case %a
  coorf %a 255
}

alias -l checkpos {
  var %colonne = 0, %ligne = 0, %dx = $calc($1 -4), %dy = $calc($2 - 21)
  if ((%dx < 0) || (%dy < 0)) return
  while %dx !isnum 0-30 { var %dx = $calc(%dx - 30) | inc %colonne }
  while %dy !isnum 0-30 { var %dy = $calc(%dy - 30) | inc %ligne }
  hadd -m SudokuTemp Pos $+(%colonne,%ligne)
  if ($regex($hget(SudokuTemp,Pos),^[0-8]{2}$)) return $hget(SudokuTemp,Pos)
}
on *:close:@sud:hfree -w Sudoku* | .timersudoctime off
menu @aidesud {
  sclick : window -c @aidesud
}

alias -l sudaide {
  if ($window(@aidesud)) window -c @aidesud
  window -Cdp +bx @aidesud -1 -1 293 140
  drawrect -f @aidesud 0 1 0 0 300 300
  drawtext @aidesud 4 verdana 20 70 2 Aide du Sudoku
  drawtext @aidesud 1 verdana 15 15 30 Le but est de remplir chaque case
  drawtext @aidesud 1 verdana 15 17 50 par un chiffre de 1 à 9. Attention :
  drawtext @aidesud 1 verdana 15 18 70 chaque carré de 9 cases, chaque
  drawtext @aidesud 1 verdana 15 15 90 ligne et chaque colonne ne doivent
  drawtext @aidesud 1 verdana 15 6 110 comporter deux fois le même chiffre
}

alias -l colign {
  if (!$window(@sud)) return
  if (!$1) return
  var %a = $left($1,1) ,%b = $right($1,1)
  return $calc(%a + 1) $+ $iif(!%a,ère,ème) colonne $calc(%b + 1) $+ $iif(!%b,ère,ème) ligne
} 

alias -l dcroix {
  if (!$window(@sud)) return
  if (!$2) return
  var %x $token(3.33.63.94.124.154.185.215.245,$calc($left($1,1) + 1),46)
  var %y $token(21.51.81.112.142.172.203.233.263,$calc($right($1,1) + 1),46)
  draw $+ $2 $iif($2 == rect,-er,-r) @sud $iif($2 == rect,15767584,14687456) 1 %x %y $iif($2 == rect,29,$calc(%x + 29)) $iif($2 == rect,29,$calc(%y + 29))
  if ($2 == rect) return
  drawline -r @sud 14687456 1 %x $calc(%y + 29) $calc(%x + 29) %y
}

alias pausesud {
  if ($sock(sudo)) return
  if ($hget(sudokutemp,pause)) {
    hadd -m sudokutemp ctime $calc($ctime - $hget(sudokutemp,ctimep)) 
    drawcopy @sudbf 0 0 300 300 @sud 2 19 | window -c @sudbf
    hdel sudokutemp pause | .timersudoctime 0 1 $!iif($isalias(dtime),dtime,.timersudoctime off)
  }
  else {
    hadd -m sudokutemp pause 1 | .timersudoctime off
    window -hp @sudbf 500 500 500 500 | drawcopy @sud 2 19 300 300 @sudbf 0 0
    var %a 21 ,%b 291 | while (%a <= %b) { drawline @sud 15 1 3 %a 274 %a | inc %a }
    drawtext @sud 4 verdana 50 60 120 PAUSE
  }
}

alias msud {
  if ($window(@msud)) window -c @msud
  window -Cdp +bx @msud -1 -1 247 140
  drawrect -n @msud 1 0 0 0 60 20
  drawrect -fn @msud 15 0 1 1 58 18
  drawtext -n @msud 3 verdana 14 11 1 Facile 
  drawrect -n @msud 1 0 61 0 60 20
  drawtext -n @msud 7 verdana 14 68 1 Moyen 
  drawrect -n @msud 1 0 122 0 60 20
  drawtext -n @msud 4 verdana 14 128 1 Difficile 
  drawrect -n @msud 1 0 183 0 60 20
  drawtext -n @msud 6 verdana 14 189 1 Expert
  drawrect -fn @msud 15 0 1 21 247 140
  drawtext -n @msud 1 verdana 14 25 22 Nicks
  drawtext -n @msud 1 verdana 14 135 22 Temps
  drawline -n @msud 1 1 1 42 246 42
  drawline -n @msud 1 1 85 42 85 200
  hadd -m sudokutemp msud 1
  mstri facile
  drawdot @msud
}

alias drawcn if ($window($$1)) drawtext -n $$1 $$4 $$2 $$3 $int($calc(($iif($show,85,162) - $width($strip($$6-),$2,$3)) /2 $iif(!$show,+85))) $$5 $6- 

menu @msud {
  mouse : msud.m $mouse.x $mouse.y
  sclick : window -c @msud 
}
alias msud.m {
  if ($inrect($1,$2,1,1,247,20)) {
    var %ic $int($calc($1 / 61 + 1)) | drawrect -fn @msud 15 0 $replacex(%ic,2,62,3,123,4,184) 1 58 18
    drawtext -n @msud $replacex(%ic,1,3,2,7,3,4,4,6) verdana 14 $replacex(%ic,1,11,2,68,3,128,4,189) 1 $replacex(%ic,1,Facile,2,Moyen,3,Difficile,4,Expert) 
    if ($hget(sudokutemp,msud) != %ic && $v1) {
      drawrect -fn @msud 0 0 $replacex($ifmatch,2,62,3,123,4,184) 1 58 18 
      drawtext -n @msud $replacex($ifmatch,1,3,2,7,3,4,4,6) verdana 14 $replacex($ifmatch,1,11,2,68,3,128,4,189) 1 $replacex($ifmatch,1,Facile,2,Moyen,3,Difficile,4,Expert) 
    }
    hadd -m sudokutemp msud %ic | drawdot @msud | mstri $replacex($ifmatch,1,Facile,2,Moyen,3,Difficile,4,Expert) 
  }
}

alias pre {
  if ($window(@sud)) window -a @sud
  elseif ($window(@menu)) window -a @menu
  else {
    msud.hfree
    window -Cdp +bx @menu -1 -1 150 283
    drawrect -fn @menu 15 0 1 1 150 280
    sudo.button 1 9 10 130 20 Facile
    sudo.button 2 9 40 130 20 Moyen
    sudo.button 3 9 70 130 20 Difficile
    sudo.button 4 9 100 130 20 Expert
    sudo.button 5 9 130 130 20 Meilleurs scores
    sudo.button 6 9 160 130 20 Comment jouer
    sudo.button 7 9 190 130 20 Règles du jeu
    sudo.button 8 9 220 130 20 Fermer
    sudo.button 9 9 250 130 20 Unload
    drawdot @menu
  }
}
on *:close:@menu:msud.hfree
alias -l msud.hfree {
  if ($hget(SudoButtons)) hfree $ifmatch
  if ($hget(SudoBF)) hfree $ifmatch
}
alias -l sudo.button {
  if (!$window(@menu)) return
  var %g = 1, %r = ^[0-9]+ [0-9]+ [0-9]+$
  if (!$regex($1-3,%r)) return
  if ($isid) {
    var %x = $2, %y = $3, %t = $hget(SudoButtons,0).item
    while %t {
      tokenize 32 $hget(SudoButtons,%t).data
      if ($inroundrect(%x,%y,$2,$3,$4,$5,20,20)) break
      dec %t
    }
    if (!%t) var %g = 0
    else hadd -m SudoBF $1 $1-5
  }
  if (%g) {
    if (!$regex($3-5,%r)) return
    hadd -m SudoButtons $1 $1-
    drawrect -dfnr @menu $iif($isid,11203252,16777215) 1 $2-5
    drawrect -dnr @menu $iif($isid,0,7372687) 1 $2-5
    if ($6-) drawtext -rn @menu $replacex($1,1,37632,2,32764,3,255,4,10223772,5,1,6,1,7,1,8,1)) Verdana 12 $calc($2 + ($4 - $width($6-,Verdana,12))/2) $calc($3 + 3) $6-  
    return $1
  }
}
menu @menu {
  mouse:sudomouse $mouse.x $mouse.y
  sclick:sudoclick $mouse.x $mouse.y
}

alias -l sudoclick {
  var %id = $gettok($sudo.button(1,$1,$2),1,32)
  if (%id isnum 1-4) { sudoku %id | window -c @msud | window -c @menu | window -c @aidesud | window -c @tuto }
  elseif (%id == 8) { window -c @menu | msud.hfree }
  elseif (%id == 5) msud
  elseif (%id == 6) htp?
  elseif (%id == 7) sudaide
  elseif (%id == 9) {
    var %c
    if ($?!="Voulez-vous supprimer le jeu ? Non pour annuler") {
      hfree -w sud*
      var %c = 1
      .remove $qt($script)
      .remove $qt($$findfile($scriptdir,SudoTuto.jpg,1))
      noop $findfile($scriptdir,sudosco?.sud,0,.remove $shortfn($1-))
      noop $input(Le Sudoku a bien été déchargé et supprimé)
    }
    if ((%c) || ($input(Voulez-vous décharger ce jeu ?,y))) { 
      .timersudoctime off
      hfree -w sudoku*
      window -c @sud | window -c @menu | window -c @msud | window -c @aidesud | window -c @tuto
      if (!%c) noop $input(Le sudoku a bien été déchargé)
      .unload -rs $qt($script)
    }
  }
  if ($window(@menu)) drawdot @menu
}

alias -l sudomouse {
  var %id = $gettok($sudo.button(1,$1,$2),1,32), %t = 1
  if ($hget(SudoBF,0).item) {
    while $hget(SudoBF,%t).item {
      var %o = $ifmatch
      if ($gettok(%o,1,32) != %id) {
        var %h = $hget(SudoBF,%o)
        hdel SudoBF %o
        sudo.button %h $gettok($hget(SudoButtons,$gettok(%h,1,32)),6-,32)
      }
      else inc %t
    }
  }
  drawdot @menu
}

alias htp? { 
  window -aBCdhp +dL @tuto 0 0 882 600 
  var %f = $findfile($scriptdir,SudoTuto.jpg,1)
  if (%f) drawpic @tuto 0 0 $shortfn(%f)
  else drawtext -or @tuto 0 Tahoma 20 264 290 Il manque le fichier SudoTuto.jpg !
}

menu @tuto {
  sclick:window -c @tuto
}

on *:start: { var %n = hmake $!left($nopath($1-),-4) 100 $(|) hload $!left($nopath($1-),-4) $!qt($1-) | noop $findfile(sudoku\,*.sud,0,%n) }
;End Of File

Conclusion :


Aucun bug connu :)
Merci à Wims :p (l'idée est de lui)

Il se peut qu'il y ait plusieurs solutions étant donné que la suppression de chiffres se fait aléatoirement et que le code ne vérifie pas qu'il n'existe qu'une et une seule solution. Il en existe, c'est suffisant :)
Pour qu'il n'y en ait qu'une, il faudrait coder un solveur de sudoku, et ça, c'est pas de l'ordre du jour ...

Ce qui est prévu, c'est de faire un mode multi-joueurs. Alors suivez de près !
(C'est Wims qui devrait s'y coller cette fois, pour changer quoi :p :p)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.