Jeu de morpion

Description

Jeu de morpion fait en picwin, le mode solo est gérer parfaitement, cependant, le mode multijoueurs contient encore quelques bugs

Source / Exemple :


; Jeu de morpion

alias morpion {
  if (!$m(info)) {
    if (!$1) {
      var %n = $?="Niveau de 1 à 3 :" + 9
      if (%n isnum 10-12) {
        hadd -m morpion info computer
        h niv %n
        morpion.open
      }
    }
    elseif ($1 != $me) {
      var %p = $$?="Entrer un port"
      socklisten morpion.listen %p
      .ctcp $1 morpion $ip %p
      hadd -m morpion info $1
      .timermorpion 1 30 annule.morpion
    }
  }
}

menu nicklist {
  $iif($$1 != $me,Morpion):morpion $1
}

alias -l ia {
  var %a = $m(possible)
  while ($regsub(%a,/([0-9])([A-Z])/ig,\2\1,%a)) noop
  if ($regex(%a,OO([0-9]))) var %case = $regml(1)
  elseif ($regex(%a,XX([0-9]))) var %case = $regml(1)
  elseif ($1 == 10) {
    if ($numtok($m(case),32) isin 8,9) {
      while (%case !isin $m(case)) var %c = $r(1,5), %case = $gettok(1 3 5 7 9,%c,32)
    }
    else var %case = $gettok($m(case),$r(1,$numtok($m(case),32)),32)
  }
  elseif ($1 == 11) {
    if ($numtok($m(case),32) isin 8,9) {
      while (%case !isin $m(case)) var %c = $r(1,4), %case = $gettok(2 4 6 8,%c,32)
    }
    else var %case = $gettok($m(case),$r(1,$numtok($m(case),32)),32)
  }
  else {
    var %n = $numtok($m(case),32)
    if (%n = 9) {
      while (%case !isin $m(case)) var %case = $r(1,9)
    }
    elseif (%n = 8) {
      var %c = 1 3 7 9, %n = 4
      while (%n) {
        if (!$istok($gettok(%c,%n,32),$m(case),32)) {
          var %y = oui
          dec %n
        }
      }
      if (%y) var %c = $r(1,5), %case $gettok(2 4 6 8 5,%c,32)
      else var %c = $r(1,4), %case $gettok(1 3 7 9,%c,32)
    }
    elseif (%n = 7) {
      while (%case !isin $m(case)) var %c = $r(1,5), %case = $gettok(2 4 6 8 5,%c,32)
    }
    else var %case = $gettok($m(case),$r(1,$numtok($m(case),32)),32)
  }
  var %d = 1
  while (!$regex($hfind(morpion,%case,%d).data,\.)) inc %d
  var %x.y = $hfind(morpion,%case,%d).data
  tokenize 46 %x.y
  .timer -m 1 800 play.morpion O %case $1-
}

ctcp *:morpion:*:{
  if (!$m(info)) {
    hadd -m morpion info $cid $nick $2-
    .timermorpion 1 30 hdel morpion info
    echo 4 -a Morpion: $nick vous propose un morpion, faites Ctrl+F6 pour jouer
    halt
  }
}

on *:socklisten:morpion.listen:{
  if ($timer(morpion)) sockaccept morpion
}

alias -l annule.morpion {
  echo 4 -a Morpion: $m(info) n'a pas accepté votre invitation, la partie est annulée
  sockclose morpion*
  hdel morpion info
}

alias cF6 {
  if ($m(info)) {
    .timermorpion off
    tokenize 32 $m(info)
    scid $1 .ctcpreply $2 morpion
    sockopen morpion $3-
    h me $scid($1).me
    h info $2
    h debut oui
    morpion.open
  }
}

on *:ctcpreply:morpion:{ 
  .timermorpion off
  echo 4 -a Morpion: $nick a accepté votre invitation
  morpion.open
  halt
}

alias -l morpion.open {
  window -Cdekp @morpion -1 -1 500 500
  drawfill -r @morpion 16777215 0 0 0 0
  h lignes 10
  if ($m(niv)) h me $me
  h $m(me) 10
  h $m(info) 10
  h copie 123 456 789 159 357 147 258 369
  var %c = 1, %x = 100, %y = 30
  while (%c <= 9) {
    h $+(%x,.,%y) %c
    if (%c isin 3,6) {
      var %x = 0
      inc %y 100
    }
    inc %x 100
    inc %c
  }
  morpion.jeu
}

alias -l morpion.jeu {
  if ($window(@morpion)) {
    drawrect -fr @morpion 16777215 1 100 30 300 300
    dl 0 5 100 130 400 130
    dl 0 5 100 230 400 230
    dl 0 5 200 30 200 330
    dl 0 5 300 30 300 330
    dl 13816530 3 204 30 204 330
    dl 13816530 3 304 30 304 330
    dl 8355711 3 100 134 400 134
    dl 8355711 3 100 234 400 234
    h possible $m(copie)
    h case 1 2 3 4 5 6 7 8 9
    if ($m(debut)) {
      hdel morpion debut
      hdel morpion tour
    }
    else {
      h debut oui
      h tour oui
    }
    tableau
    if ($m(niv)) && (!$m(tour)) ia $m(niv)
  }
}

alias -l tableau {
  drawrect -f @morpion 0 1 0 0 500 20
  drawtext @morpion $iif($m(tour),4,1) arial 12 5 5 $m(me) $c($m($m(me)) -10)
  var %a = $m(info) $c($m($m(info)) -10)
  drawtext @morpion $iif($m(tour),1,4) arial 12 $c(485 - $width(%a,arial,12)) 5 %a
}

menu @morpion {
  sclick:sclick.morpion $mouse.x $mouse.y
}

alias -l sclick.morpion {
  if ($inrect($1,$2,100,30,300,300) && $m(tour)) {
    var %x = $c($c($int($c($c($1 -100) /100)) *100) +100)
    var %y = $c($c($int($c($c($2 -30) /100)) *100) +30)
    var %c = $m($+(%x,.,%y))
    if (%c isin $m(case) && !$timer(wait)) {
      play.morpion X %c %x %y
      if ($m(niv)) && ($m(case)) && (!$timer(wait)) ia $m(niv)
    }
  }
}

alias -l play.morpion {
  h possible $replace($m(possible),$2,$1)
  h case $remtok($m(case),$2,1,32)
  var %a = $c($3 +50) $c($4 +50), %s = $1 | %s %a
  if (!$m(niv)) sockwrite -n morpion bouge $2 %a
  var %f = $findtok($m(possible),$str(%s,3),1,32)
  if (%f) {
    var %g = $gettok($m(copie),%f,32)
    var %x = $hfind(morpion,$left(%g,1)).data
    var %y = $hfind(morpion,$right(%g,1)).data
    tokenize 46 %x %y
    tic-tac-toe $1-
    if (!$m(niv)) sockwrite -n morpion tic-tac-toe $1-
    if (%s == O) hinc morpion computer
    else hinc morpion $m(me)
    tableau
    .timerwait 1 2 morpion.jeu
  }
  if (!$m(case)) .timerwait 1 2 morpion.jeu
  elseif (!%f) {
    if (!$m(tour)) h tour oui
    else hdel morpion tour
    tableau
  }
}

alias -l tic-tac-toe dl 8355711 5 $c($1 +50) $c($2 +50) $c($3 +50) $c($4 +50)

alias -l o {
  drawdot @morpion 5 30 $c($1 +4) $c($2 +3)
  drawdot @morpion 4 30 $1 $2
  drawdot @morpion 0 25 $1 $2
}

alias -l x {
  dl 8323072 5 $c($1 -20) $c($2 -25) $c($1 +30) $c($2 +25)
  dl 8323072 5 $c($1 -20) $c($2 +25) $c($1 +30) $c($2 -25)
  dl 16515072 5 $c($1 -25) $c($2 -25) $c($1 +25) $c($2 +25)
  dl 16515072 5 $c($1 -25) $c($2 +25) $c($1 +25) $c($2 -25)
}

on *:input:@morpion:{
  if ($1 == /clear) {
    drawrect -f @morpion 0 1 0 350 500 90
    hdel -w morpion lignes.*
    h lignes 10
    halt
  }
  elseif ($left($1,1) != /) {
    h lignes. $+ $m(lignes) $+([,$time,]) $+(<,$m(me),>) $1-
    if (!$m(niv)) sockwrite -n morpion msg $gettok($m(lignes. $+ $m(lignes)),2-,32)
    hinc morpion lignes
    dialogue
  }
}

alias -l dialogue {
  if ($window(@morpion)) {
    drawrect -f @morpion 0 1 0 350 500 90
    var %a = $m(lignes), %b = 425
    while (%a > $c($m(lignes) -5)) {
      if ($m(lignes. $+ $c(%a -1))) drawtext -p @morpion 1 arial 12 2 %b $v1
      dec %b 16
      dec %a
    }
  }
}

on *:sockread:morpion:{
  sockread %a
  tokenize 32 %a
  if ($1 == msg) {
    h lignes. $+ $m(lignes) $+([,$time,]) $2-
    hinc morpion lignes
    dialogue
  }
  elseif ($1 == bouge) {
    h case $remtok($m(case),$2,1,32) | o $3-
    h tour oui
    if (!$m(case)) .timerwait 1 2 morpion.jeu
    else tableau
  }
  elseif ($1 == tic-tac-toe) {
    tic-tac-toe $2-
    hinc morpion $m(info)
    .timerwait 1 2 morpion.jeu
  }
  elseif ($1 == nick) {
    h $2 $m($m(info))
    h info $2
    tableau
  }
}

on *:nick:{
  if ($window(@morpion) && $m(me) == $nick) {
    if (!$m(niv)) sockwrite -n morpion nick $newnick
    h $newnick $m($m(me))
    .timer1 0 0 tableau
  }
}

on *:close:@morpion:close.morpion
on *:sockclose:morpion:{ close.morpion | morpion }

alias -l close.morpion {
  window -c @morpion
  hfree morpion
  sockclose morpion*
}

alias -l c return $calc($1-)
alias -l m return $hget(morpion,$1)
alias -l h hadd morpion $1-
alias -l dl drawline -r @morpion $1-

Conclusion :


pour proposer une partie faites /morpion pseudo ou clic droit sur un pseudo dans une nicklist, l'invité doit accepter en tapant ctrl + f6

le mini-chat contient encore des petits bugs mineurs, pas de couleur et coupe le texte s'il celui-ci dépasse la fenêtre

celui qui proposera la partie sera le premier à jouer et par la suite c'est chacun votre tour (celui qui joue est affiché en rouge)

voila :)

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.

Du même auteur (Panthouffle)