Pong irc

Contenu du snippet

Voila, suite a l idee de kerrigan de coder un demineur en mirc script, voila pong a la sauce irc ! Bon ce n est pas un code sans bug loin de la mais ca devrait ravir quelque nostalgique ;)

ps: /pg pour lancer le jeu ou passer par le menu channel
ps2: ca se joue a la souris =)

Source / Exemple :


; alias de gros flemmard ! :D ;
alias h { hadd p $1- }
alias ht { return $hget(p,$1-) }
alias pg {
  if ($hget(p)) hfree p
  hmake p 15
  h b 200 300
  h b.d 0
  h c 200 
  h s 0
  h cs 0
  h dx 0
  h dy 2
  h a +
  h fps 100
  h b.t
  if (!%ai) .set %ai 1
  window -dpf @p 0 0 410 610
  drawrect -fn @p 1 1 0 0 410 610
  dp
}

alias dp {
  ; pour les fps ;
  var %begincode = $ticks
  ; var contenant la valeur de $mouse.x au debut de la boucle pour calculer ;
  ; la vitesse de la balle suivant la difference %old_mouse.x et $mouse.x ;
  ; on fait de meme pour l ordi mais suivant son abscisse ;
  var %old_mouse.x = $mouse.x,%old_comp.x = $gettok($hget(p,c),1,32) 
  ; controle de la souris ;
  if ( $mouse.y < 500 ) %y = 500 
  elseif ( $mouse.y > 610 ) %y = 610
  elseif ( $mouse.y = $null ) %y = 500
  else %y = $mouse.y
  if ( $mouse.x = $null ) %x = 100
  else %x = $calc($mouse.x - 25)

  ; variable contenant les coords des "joueurs" et de la "balle" (x,y,h,l) ;
  var %bx = $gettok($ht(b),1,32),%by = $gettok($ht(b),2,32),%l = $calc(%x + 50),%h = $calc(%y +10)
  var %cx = $ht(c),%cy = 20,%cl = $calc(%cx + 50),%ch = $calc(%cy + 10)  

  if ( %x < 1 ) %x = 1
  if ( %x > 410 ) %x = 410 
  ; le "terrain" ;
  drawdot -n @p 1 26 $ht(b)
  drawrect -fn @p 1 1 0 0 410 40
  drawrect -fn @p 1 1 0 500 410 120
  drawline -n @p 9 1 5 300 405 300
  drawrect -n @p 9 1 5 5 400 600
  ; la "balle" ;
  drawdot -n @p 0 7 $ht(b)
  ; les "joueurs" ;
  drawrect -n @p 3 1 %x %y 50 10
  drawrect -n @p 3 1 $ht(c) 20 50 10
  drawtext -n @p 4  arial 14 10 286 $ht(cs) 
  drawtext -n @p 12 arial 14 10 300 $ht(s)
  drawpic @p

  ; ici on fait deplacer l ordi suivant les coord de la balle et les rebords du "terrain" ;
  if ( %ai != 10 ) {
    if ( $ht(c) < 1 ) h c 1
    elseif ( $ht(c) > 360) h c 360
    if ( $ht(c) < $calc(%bx - (%ai * 5)) ) h c $calc($ht(c) + %ai + $rand(1,%ai))   
    if ( $ht(c) > $calc(%bx - (%ai * 5)) ) h c $calc($ht(c) - %ai - $rand(1,%ai)) 
  }
  else h c $calc(%bx -25)

  ; si on touche la balle on calcule sa future trajectoire ;
  if ( $onpoly(4,4,%x,%y,%l,%y,%x,%h,%l,%h,%bx,%by,$calc(%bx +4),%by,%bx,$calc(%by +4),$calc(%bx +4),$calc(%by +4))  ) {
    ; trajectoire en fonction de la difference balle.x - souris.x ;    
    var %x0 = $int($calc( (%bx - $mouse.x) /5) )
    ; vitesse de la balle ;
    var %y0 = $calc( $abs( %old_mouse.x - $mouse.x ) / 22.5 ) 
    if ( %y0 <= 2 ) %y0 = 2 
    h dy %y0    
    h dx %x0    
    ; on change le sens de la balle ( 1 = monte , 0 = descend )
    h b.d 1
  }
  ; si c l ordi on calcule sa trajectoire ;
  elseif ( $onpoly(4,4,%cx,%cy,%cl,%cy,%cx,%ch,%cl,%ch,%bx,%by,$calc(%bx +4),%by,%bx,$calc(%by +4),$calc(%bx +4),$calc(%by +4))  ) {

    ; trajectoire ;    
    var %x0 = $int($calc( (%bx - %cx) /5) )
    ; vitesse de la balle ;
    var %y0 = $calc( $abs( %old_comp.x - %cx ) / (50 - %ai) )
    if ( %y0 <= 2 ) %y0 = 2 
    h dy %y0  
    h dx %x0   
    h b.d 0
  }

  ; si la balle touche un rebord on inverse %x0 ;
  if ( %bx > 400 ) $iif($hget(p,dx) < 0,h a +,h a -) 
  elseif ( %bx < 4 ) $iif($hget(p,dx) < 0,h a -,h a +)

  ; si elle descend ben elle descend :p si elle monte... elle monte ;
  if ( !$hget(p,b.d) ) h b $calc(%bx $ht(a) $ht(dx)) $calc(%by + $ht(dy) + $ht(b.t))
  elseif ( $hget(p,b.d) ) h b $calc(%bx $ht(a) $ht(dx)) $calc(%by - $ht(dy) + $ht(b.t))

  ; si la balle sort de l ecran alors on marque un point et on reset la balle ;
  if ( %by > 610 ) {
    r
    drawrect -fn @p 1 1 9 286 $width($ht(cs),arial,15) 30
    hinc p cs
    h b.d 1
  }
  elseif ( %by < 1 ) {
    r
    drawrect -fn @p 1 1 9 286 $width($ht(s),arial,15) 30 
    hinc p s
    h b.d 0 
  }

  .timerp -ho 1 $calc( ( 1000 / $ht(fps) ) - ($ticks - %begincode) ) dp
}

alias r { 
  h c 200
  h dy 2
  h b 200 300
  h dx 0
}

menu status,channel {
  -
  Pong:
  .Jouer:/pg
  .Config:
  ..facile:/set %ai 1
  ..moyen:/set %ai 2
  ..difficile:/set %ai 3
  ..tres difficile:/set %ai 5
  ..Dieu:/set %ai 10
}

on 1:close:@p: {
  .timerp off
  hfree p
}

Conclusion :


Rien de bien compliqué , tout est commenté ou presque , ca devrait aidé ceux qui débute. Si vous avez des corrections/remarques/critiques/bug n' hésitez pas ! Un mode multi sera dispo prochainement.

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.