Le pendu pour irc (socket)

Description

Voici une version du jeu du Pendu pour IRC. Le jeu se joue a 2 joueurs, un joueur propose un mot et l'autre tente de le trouver ^^

Source / Exemple :


alias pendu_start {
  if $hget(pendu) { hfree pendu }
  hmake pendu
  if $sock(pendu) { echo -a 2*/pendu_start : Jeu déjà activé ! }
  else {
    if $2 { sockopen pendu $1 6667 | hadd pendu chan $2 }
    else { echo -a 2*/pendu_start : Paramètres incomplets. }
  }
}

on *:SOCKOPEN:pendu:{
  if ($sockerr) { echo -a 2[Pendu] : Erreur de connection. | hfree pendu }
  else {
    pswr USER Pendu Pendu Pendu Pendu
    pswr NICK Pendu
    pswr PRIVMSG NickServ :Identify MOT-DE-PASSE
    pswr PRIVMSG ChanServ :Identify $hget(pendu,chan) MOT-DE-PASSE
    pswr PRIVMSG ChanServ :set $pch entrymsg Bienvenue sur $pch ! Pour lancer le jeu du pendu, tapes !jouer . Bonne chance !
    pswr JOIN $pch
    pswr NAMES $pch
    pswr PRIVMSG $pch :[Jeu] Le jeu du pendu est initialisé ! Pour le lancer tapez !jouer
    pswr PRIVMSG ChanServ :set $pch topiclock off
    .timer 1 1 pswr TOPIC $pch :12,1Bienvenue sur le jeu du 8,1P4-7E4-4N4-7D4-8U4 <-->12 Etat : (3Dispo12) (4Jeu arrêté12)
    .timer 1 2 pswr PRIVMSG :ChanServ set $pch topiclock on
  }
}

on *:SOCKREAD:pendu:{
  sockread %varpendu
  tokenize 58 %varpendu
  if ($gettok(%varpendu,1,32) == PING) { pswr PING $gettok(%varpendu,2,32) }
  if ($gettok(%varpendu,2,32) == PRIVMSG) {
    if ($gettok(%varpendu,3,32) == $pch) { 
      if ($2 == !jouer) {
        if ($gettok($hget(pendu,etat),1,32) == on) { pswr PRIVMSG $pch :[Erreur] Un jeu est déjà en cours ! }
        else {
          pswr PRIVMSG ChanServ :set $pch topiclock off
          pendu_delmodes
          .timer 1 1 pswr TOPIC $pch :12,1Bienvenue sur le jeu du 8,1P4-7E4-4N4-7D4-8U4 <-->12 Etat : (3Dispo12) (3Jeu en cours12)
          .timer 1 2 pswr PRIVMSG ChanServ :set $pch topiclock on
          pswr PRIVMSG $pch :[Jeu] Le jeu vient d'être lancé par $+(,$mid($gettok(%varpendu,1,33),2,$calc($len($gettok(%varpendu,1,33)) - 1)))
          hadd $sockname etat on choix
          hadd $sockname joueur1 $mid($gettok(%varpendu,1,33),2,$calc($len($gettok(%varpendu,1,33)) - 1))
          pswr PRIVMSG $pch :[Joueur] $hget(pendu,joueur1) : Vous devez choisir votre joueur. Pour celà, tapez !choix joueur . Vous avez une minute.
          .timerchoix 1 60 pendu_arreter_jeu
        }
      }
      if ($gettok($2,1,32) == !choix && $hget(pendu,etat) == on choix) {
        if ($istok($hget(pendu,names),$gettok($2,2,32),32) && $gettok($2,2,32) != $hget(pendu,joueur1) && $gettok($2,2,32) != Pendu) {
          pswr PRIVMSG $pch :[Joueur] Vous avez choisi $+(,$gettok($2,2,32))
          hadd $sockname joueur2 $gettok($2,2,32)
          hadd $sockname etat on choixmot
          pswr PRIVMSG $pch :[Mot] $hget(pendu,joueur1) : Vous devez maintenant choisir votre mot. Pour cela, tapez /msg Pendu !mot mot . Vous avez 2 minutes.
          .timermot 1 120 pendu_arreter_jeu
          .timerchoix off
        }
        else { pswr PRIVMSG $pch :[Joueur] Ce joueur ne peut pas participer au jeu. }
      }
      if ($gettok($2,1,32) == !rep && $hget(pendu,etat) == on jeu && $mid($gettok(%varpendu,1,33),2,$calc($len($gettok(%varpendu,1,33)) - 1)) == $hget(pendu,joueur2)) {
        if ($gettok($2,2,32) == $hget(pendu,mot)) { pswr PRIVMSG $pch :[Réponse] Bravo $hget(pendu,joueur2) vous avez gagné ! | pendu_arreter_jeu }
        else { 
          pswr PRIVMSG $pch :[Proposition] Ce n'est pas la bonne réponse !
          hdec pendu essais
          if ($hget(pendu,essais) == 0) { pswr PRIVMSG $pch :[Résultat] $hget(pendu,joueur2) vous avez perdu ! Le mot était $hget(pendu,mot) | pendu_arreter_jeu }
          pswr PRIVMSG $pch :[Essais] Il vous reste $hget(pendu,essais) essais.
          pswr PRIVMSG $pch :[Etat] Etat actuel : $hget(pendu,decouvert)    
        }
      }
      if ($gettok($2,1,32) == !lettre && $hget(pendu,etat) == on jeu && $mid($gettok(%varpendu,1,33),2,$calc($len($gettok(%varpendu,1,33)) - 1)) == $hget(pendu,joueur2)) {
        if ($len($gettok($2,2,32)) == 1) {
          if ($gettok($2,2,32) isin $hget(pendu,dejadit)) {
            pswr PRIVMSG $pch :[Lettre] Vous avez déjà proposé cette lettre.
            hdec pendu essais
            if ($hget(pendu,essais) == 0) { pswr PRIVMSG $pch :[Résultat] $hget(pendu,joueur2) vous avez perdu ! | pendu_arreter_jeu }
            pswr PRIVMSG $pch :[Essais] Il vous reste $hget(pendu,essais) essais.
            pswr PRIVMSG $pch :[Etat] Etat actuel : $hget(pendu,decouvert)    
          }
          else {
            if ($gettok($2,2,32) isin $hget(pendu,mot)) {
              pswr PRIVMSG $pch :[Lettre] Bien joué $hget(penu,joueur2) la lettre $+(,$gettok($2,2,32),) est bien dans le mot.
              var %a 1
              while (%a <= $len($hget(pendu,mot))) {
                if ($mid($hget(pendu,mot),%a,1) == $gettok($2,2,32)) { hadd pendu decouvert2 $+($hget(pendu,decouvert2),$gettok($2,2,32)) }
                else { hadd pendu decouvert2 $+($hget(pendu,decouvert2),$mid($hget(pendu,decouvert),%a,1)) }
                inc %a
              }
              hadd pendu decouvert $hget(pendu,decouvert2)
              hdel pendu decouvert2
              if ($hget(pendu,decouvert) == $hget(pendu,mot)) {
                pswr PRIVMSG $pch :[Résultat] Félicitations $hget(pendu,joueur2) vous avez gagné !
                pendu_arreter_jeu
              }
              else {
                pswr PRIVMSG $pch :[Essais] Il vous reste $hget(pendu,essais) essais.
                pswr PRIVMSG $pch :[Etat] Etat actuel : $hget(pendu,decouvert)    
              }
            }
            else { 
              pswr PRIVMSG $pch :[Lettre] La lettre $+(,$gettok($2,2,32),) n'est pas dans le mot.
              hdec pendu essais
              if ($hget(pendu,essais) == 0) { pswr PRIVMSG $pch :[Résultat] $hget(pendu,joueur2) vous avez perdu ! | pendu_arreter_jeu }
              pswr PRIVMSG $pch :[Essais] Il vous reste $hget(pendu,essais) essais.
              pswr PRIVMSG $pch :[Etat] Etat actuel : $hget(pendu,decouvert)
            }
            hadd pendu dejadit $+($hget(pendu,dejadit),$gettok($2,2,32))
          }
        }
        else { pswr PRIVMSG $pch :[Lettre] Vous devez proposer une lettre. }
      }
    }
    elseif ($gettok(%varpendu,3,32) == Pendu) {
      if ($gettok($2,1,32) == !mot && $hget(pendu,etat) == on choixmot && $mid($gettok(%varpendu,1,33),2,$calc($len($gettok(%varpendu,1,33)) - 1)) == $hget(pendu,joueur1)) {
        if ($verifymot($gettok($2,2,32))) {
          pswr NOTICE $hget(pendu,joueur1) :Le mot $gettok($2,2,32) a été choisi.
          hadd pendu mot $gettok($2,2,32)
          hadd pendu etat on jeu
          .timermot off
          pswr MODE $pch +vv $hget(pendu,joueur1) $hget(pendu,joueur2)
          pswr MODE $pch +mT
          hadd pendu essais 8
          hadd pendu decouvert $str(*,$len($hget(pendu,mot)))
          hadd pendu dejadit
          pswr PRIVMSG $pch :[Jeu] Le jeu commence ! Il vous reste $hget(pendu,essais) essais.
          pswr PRIVMSG $pch :[Règles] Pour proposer un mot, tapez !rep mot et pour proposer une lettre tapez !lettre lettre
          pswr PRIVMSG $pch :[Etat] Etat actuel : $hget(pendu,decouvert)
        }
        else { pswr NOTICE $hget(pendu,joueur1) :Le mot $gettok($2,2,32) n'existe pas, veuillez changer de mot. (attention aux accents) } 
      }
    }
  }
  if ($istok(JOIN|PART|QUIT|KICK|NICK,$gettok(%varpendu,2,32),124)) { pswr NAMES $pch } 
  if ($gettok(%varpendu,2,32) == 353) { hadd $sockname names $remove($remove($remove($remove($remove($gettok(%varpendu,2,58),+),$chr(37)),@),&),~) }
}

on *:INPUT:#:{
  if ($1 == !pendu) { 
    if ($2- == start) { pendu_start $server $chan }
    elseif ($2- == stop) { pendu_arreter_jeu }
    elseif ($2- == quit) { 
      pswr PRIVMSG ChanServ :set $pch entrymsg Bienvenue sur $pch ! Le jeu n'est pas dispo en ce moment...
      pswr PRIVMSG ChanServ :set $pch topiclock off
      .timer 1 1 pswr TOPIC $pch :12,1Bienvenue sur le jeu du 8,1P4-7E4-4N4-7D4-8U4 <-->12 Etat : (4Non - Dispo12)
      .timer 1 2 pswr PRIVMSG ChanServ :set $pch topiclock on
      .timer 1 3 sockclose pendu
      .timer 1 3 hfree pendu 
    }
  }
}

alias -l pendu_arreter_jeu {
  pswr PRIVMSG ChanServ set $pch topiclock off
  pendu_delmodes
  pswr MODE $pch -mT
  .timer 1 1 pswr TOPIC $pch :12,1Bienvenue sur le jeu du 8,1P4-7E4-4N4-7D4-8U4 <-->12 Etat : (3Dispo12) (4Jeu arrêté12)
  .timer 1 2 pswr PRIVMSG ChanServ :set $pch topiclock on
  pswr PRIVMSG $pch :[Jeu] Le jeu vient d'être stoppé. Pour le relancer tapez !jouer
  .timerchoix off
  .timermot off
  hdel pendu joueur1
  hdel pendu joueur2
  hdel pendu mot
  hdel pendu essais
  hdel pendu decouvert
  hdel pendu dejadit
  hadd pendu etat off
}
alias -l verifymot return $iif($read(francais.txt,w,$+(*,$1,*)),$true,$false)
alias -l pch return $hget(pendu,chan)
alias -l pswr sockwrite -tn pendu $1-
alias -l pendu_delmodes {
  var %a 1
  while (%a <= $numtok($hget(pendu,names),32)) {
    if ($gettok($hget(pendu,names),%a,32) == Pendu) { inc %a }
    if ($remove($nick($pch,$gettok($hget(pendu,names),%a,32)).pnick,$gettok($hget(pendu,names),%a,32))) { pswr MODE $pch $+(-,$replace($ifmatch,~,q,&,a,@,o,$chr(37),h,+,v)) $str($+($gettok($hget(pendu,names),%a,32),$chr(32)),$len($ifmatch)) }
    inc %a
  }
}

Conclusion :


Le jeu fonctionne a partir d'une base de données de mots. Cette base de donnée doit etre appelée "francais.txt" J'en fournis une dans un zip mais vous pouvez en prendre une autre, c'est pas genant ^_^

J'ai inséré quelques commandes ChanServ dans le code. Vous devez indiquer le mot de passe du nick (Pendu) et eventuellement du chan. Notez que certaines commandes comme la modification du entrymsg ne pourront pas etre effectué si le bot n'as pas d'access sur le chan.

Commandes pour le propriétaire du bot :

!pendu start : amène le bot sur le channel actif
!pendu stop : arrète le jeu si un jeu est en cours
!pendu quit : déconnecte le bot
Tous les utilisateurs peuvent lancer le jeu en tapant !jouer

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.