Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Atelier] Fond animé Space Invaders

Venez vous entraîner avec le langage de votre choix :)

    27 avril 2013 à 16:59:43

    Pour ma part, se sera en Axe aussi. Les Invaders ont une taille de 7*6 sans animation supplémentaire ^^ 

    .INVADERS
    Full
    ClrDrawrr
    ClrHome
    ..MONSTRES
    ..1121
    [0000000028000000]→Pic1
    [0000287C7C54FEAA]
    ..1222
    [0000000000280000]
    [0000287C547CFEAA]
    ..1122
    [0000000020080000]
    [0000287C745CFEAA]
    ..1211
    [0000000008200000]
    [0000287C5C74FEAA]
    ..CODE
    Repeat getKey(15)
    rand^88→X
    rand^56→Y
    rand^3→A
    Pt-Change(X,Y,Pic1+(A*16))
    Pt-Change(X,Y,Pic1+(A*16+8))r
    For(B,0,100)
    DispGraphrr
    End
    Pt-Change(X,Y,Pic1+(A*16))
    Pt-Change(X,Y,Pic1+(A*16+8))r
    End

    Le code est tout de même lisible :D un petit aperçu :

    Invaders

    Reste à améliorer un peu :-°

    • Partager sur Facebook
    • Partager sur Twitter
      27 avril 2013 à 19:01:08

      Ma deuxième version, sans Javascript ( sans animation des yeux aléatoires, etc... J'ai rajouté un animation de grossisement pour compenser:p), pompée sur Szczork ... mais un peu moins lourde (au moins 3ko de moins ) : http://duge.noue.chez.com/SpaceInvaders/2 

      Le code : 

      <html>
      <head>
      <title>Space Invaders</title>
      <style>
      span:nth-of-type(1), span:nth-of-type(2), span:nth-of-type(4), span:nth-of-type(6), span:nth-of-type(7), span:nth-of-type(8), span:nth-of-type(14), span:nth-of-type(15), span:nth-of-type(17), span:nth-of-type(19), span:nth-of-type(21), span:nth-of-type(22), span:nth-of-type(28), span:nth-of-type(24), span:nth-of-type(26), span:nth-of-type(37), span:nth-of-type(39), span:nth-of-type(41)
      {
      	background-color: white;
      	opacity: 1;
      }
      @keyframes enlarge
      {
      	from{height: 32px; width: 32px;}
      	50%{height: 48px; width: 48px;}
      	to{height: 32px; width: 32px;}
      }
      @-webkit-keyframes enlarge
      {
      	from{height: 32px; width: 32px;}
      	50%{height: 48px; width: 48px;}
      	to{height: 32px; width: 32px;}
      }
      @keyframes mov
      {
      0%   {background:red; left:0px; top:0px;}
      25%  {background:yellow; left:1000px; top:0px;}
      50%  {background:blue; left:1000px; top:400px;}
      75%  {background:green; left:0px; top:400px;}
      100% {background:red; left:0px; top:0px;}
      }
      
      @-webkit-keyframes mov /* Safari and Chrome */
      {
      0%   {background:red; left:0px; top:0px;}
      25%  {background:yellow; left:1000px; top:0px;}
      50%  {background:blue; left:1000px; top:400px;}
      75%  {background:green; left:0px; top:400px;}
      100% {background:red; left:0px; top:0px;}
      }
      
      span
      {
      	opacity: 0;
      	width: 32px;
      	height: 32px;
      	display: inline-block;
      	animation: enlarge 2s infinite alternate;
      	-webkit-animation: enlarge 2s infinite alternate;
      }
      div
      {
      	position: absolute;
      	-webkit-animation: mov 2s infinite alternate;
          animation: mov 2s infinite alternate;
      }
      #a
      {
      	background-color: black;
      }
      #d
      {
      	background-color: black;
      }
      </style>
      </head>
      <body>
      <div>
      	<span></span><span></span><span></span><span></span><span></span><span></span><span></span><br />
      	<span></span><span></span><span></span><span></span><span></span><span></span><span></span><br />
      	<span></span><span></span><span id = "b"></span><span></span><span id = "c"></span><span></span><span></span><br />
      	<span></span><span></span><span id = "a"></span><span></span><span id = "d"></span><span></span><span></span><br />
      	<span></span><span></span><span></span><span></span><span></span><span></span><span></span><br />
      	<span></span><span></span><span></span><span></span><span></span><span></span><span></span><br />
      </div>
      </body>
      </html>

      -
      Edité par _mrtn 27 avril 2013 à 19:15:56

      • Partager sur Facebook
      • Partager sur Twitter

      Je ne visite plus ce site, si ça vous intéresse (ce qui serait très curieux), lisez ma bio.

        27 avril 2013 à 19:34:43

        Salut tout le monde,

        Pour ma part je propose une version Javascript genre "orienté objet". Je ne suis pas hyper calé en JS ni HTML 5 donc le défi tombe est assez simple mais m'a permis découvrir des petits trucs. 

        Je tiens à préciser que je me suis un peu inspiré de ton code Thunderseb (très bien écris) car c'est un peu l'idée que j'avais en tête.

        Mon code est loin d'être le plus concis mais permet de gérer plusieurs Invaders sur la scène (canvas) [il n'y a pas de détection de collisions]

        Démo défi

        Démo hors défi

        • Partager sur Facebook
        • Partager sur Twitter
          27 avril 2013 à 22:43:20

          Salut tout le monde !

          Voici ma version en langage C :

          #include <stdlib.h>
          #include <stdio.h>
          #include <SDL/SDL.h>
          #include <time.h>
          #define HAUTEUR_FENETRE 600
          #define LARGEUR_FENETRE 1000
          #define TAILLE_BLOC 50
          #define NB_BLOCS_LARGEUR 7
          #define NB_BLOCS_HAUTEUR 6
          
          void sleep(int nombreDeSeconde);
          
          int main ( int argc, char** argv )
          {
              SDL_Surface *ecran = NULL, *carre = NULL;
              int couleur1 = 0, couleur2 = 0, couleur3 = 0, yeux = 0, continuer = 1, i = 0;
              int tableauY[28] = {0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5};
              int tableauX[28] = {2,4,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,0,1,2,3,4,5,6,0,2,4,6};
              int tableauYeuxGauche[4] = {13, 8, 8, 13};
              int tableauYeuxDroit[4] = {15, 10, 15, 10};
              SDL_Rect position, positionBloc;
          
              SDL_Init(SDL_INIT_VIDEO);
          
              srand(time(NULL));
          
              ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE);
              SDL_WM_SetCaption("Space Invaders", NULL);
              carre = SDL_CreateRGBSurface(SDL_HWSURFACE, 50, 50, 32, 0, 0, 0, 0);
              SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
          
              while(continuer)
              {
                  position.x = rand()%600;
                  position.y = rand()%250;
                  couleur1 = rand()%255;
                  couleur2 = rand()%255;
                  couleur3 = rand()%255;
                  yeux = rand()%3;
          
                  SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                  for (i = 0 ; i < 29 ; i++)
                  {
                      positionBloc.x = position.x + (tableauX[i] * 53);
                      positionBloc.y = position.y + (tableauY[i] * 53);
          
                      if (i == tableauYeuxGauche[yeux] || i == tableauYeuxDroit[yeux])
                      {
                          SDL_FillRect(carre, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                      }
                      else if (i == 8 || i == 10 || i == 13 || i == 15)
                      {
                          SDL_FillRect(carre, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                      }
                      else
                      {
                          SDL_FillRect(carre, NULL, SDL_MapRGB(ecran->format, couleur1, couleur2, couleur3));
                      }
                      SDL_BlitSurface(carre, NULL, ecran, &positionBloc);
                  }
                  SDL_Flip(ecran);
                  sleep(1);
              }
              SDL_FreeSurface(carre);
              SDL_Quit();
              return EXIT_SUCCESS;
          }
          void sleep(int nombreDeSeconde)
          {
              clock_t goal;
          
              goal = (nombreDeSeconde * CLOCKS_PER_SEC) + clock();
          
          	while(goal > clock())
          	{
          		;
          	}
          }
          

          D'une taille de 2 422 octets.

          A+ tout le monde !

          Dobby

          • Partager sur Facebook
          • Partager sur Twitter
            28 avril 2013 à 9:27:59

            Je ne suis pas une bête en Haskell, je me débrouille ...
            C'est juste pour m'entrainer ...

            import System.Cmd
            import System.Posix.Unistd
            
            r = [x*121`mod`100|x<-[1..]]
            e = replicate
            sp 0 = "\n"
            sp x = " #"!!(mod x 2):sp(div x 2)
            m x = do
             system("clear")
             putStr(e(x!!0)'\n'++concatMap(\y->e(x!!1)' '++sp y)[20,62,42,42,127,85])
             sleep 1
             m(drop 2 x)
            main=m r

            C'est la première fois que je manipule une fonction à effet de bord ...

            -
            Edité par @che 28 avril 2013 à 14:17:04

            • Partager sur Facebook
            • Partager sur Twitter
            🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
              28 avril 2013 à 9:59:41

              Une participation full JS avec les canvas. Supporte les redimensions de l'écran. Le tout sur : http://thegeeex.free.fr/alien.html

              Edit : v2

              Enjoy ! :D

              -
              Edité par GauBen 29 avril 2013 à 14:33:40

              • Partager sur Facebook
              • Partager sur Twitter
                28 avril 2013 à 12:46:39

                Bon, finalement, j'ai décidé de ne pas obfusquer mon code.

                J'ai préféré perdre mon temps à faire quelque chose de plus utile : en browsant un peu le web, je me suis rendu compte qu'il n'existait aucune bibliothèque en pur python permettant d'interagir proprement avec des fichiers GIF. La seule solution pour cela consiste à installer PIL qui est mine de rien assez lourde quand on veut juste écrire une image.

                Du coup, j'ai publié un module python-libgif sous licence WTFPL. Ma contribution à cet atelier devient tout de suite beaucoup plus simple :

                #!/usr/bin/env python3
                
                from itertools import product
                from random import choice, randrange as rand
                from libgif import *
                
                PATTERN = (0,0,2,0,2,0,0,           ##  ##
                           0,2,2,2,2,2,0,         ##########
                           0,2,0,2,0,2,0,         ##  ##  ##
                           0,2,0,2,0,2,0,         ##  ##  ##
                           2,2,2,2,2,2,2,       ##############
                           2,0,2,0,2,0,2)       ##  ##  ##  ##
                
                EYES = ((16, 23), (18, 25))
                
                COLORS = [(255, 255, 255), (0, 0, 0)]
                
                def mk_pattern():
                    pat = list(PATTERN)
                    for eye in EYES:
                        pat[choice(eye)] = 1
                    return pat
                
                def inflate(data, w, h, ss):
                    new = [0] * w * h * (ss**2)
                    it = product(range(ss-1), range(ss-1), range(w), range(h))
                    for x, y, i, j in it:
                        new[w * ss * (y + j*ss) + i*ss + x] = data[w*j + i]
                    return new
                
                gif = Gif(800, 600, loop = GIF_INFINITE_LOOP)
                
                # Draw invaders
                for _ in range(15):
                    ss = rand(10, 51, 5)
                    data = inflate(mk_pattern(), 7, 6, ss)
                    gif.add_frame(data, 
                                  width=7*ss, height=6*ss, 
                                  x_offset = rand(800-7*ss), y_offset=rand(600-6*ss),
                                  transparency = True, duration = 60, disposal = GIF_OVERWRITE_BG,
                                  colortable = COLORS + [(rand(256), rand(256), rand(256))])
                
                gif.dump('invaders.gif')
                

                Et le résultat (un GIF 800x600 de 24Ko pour 15 frames) :

                -
                Edité par nohar 28 avril 2013 à 17:14:23

                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                  28 avril 2013 à 17:44:41

                  C'est parti pour moi aussi : version full JavaScript, j'utilise la balise canvas.

                  Merci Thunderseb pour l'idée du tableau à double dimension ;) (c'est la seule idée que j'ai "copiée", le reste je l'ai fait maison)
                  Je ne participe dans aucune catégorie j'ai l'impression, peut être inutilement compliqué ?

                  Donc ça s'utilise sur n'importe quelle page, comme un lien en favori. Un invader apparait et si vous voulez en ajouter d'autres il y a un bouton en bas à droite (ou un peu plus haut si vous l'avez exécuter en console, flemme de l'ajuster au redimensionnement :p )

                  Donc le code minifié (vous pouvez le lancer dans la console):

                  (function(){function h(a){setTimeout(function(){b[a].clearRect(0,0,275,225);e[a].style.left=d(window.innerWidth-270)+"px";e[a].style.top=d(window.innerHeight-230)+"px";b[a].fillStyle="rgb("+d(255)+","+d(255)+","+d(255)+")";for(f=0;6>f;f++)for(g=0;7>g;g++)1===j[f][g]&&b[a].fillRect(g*c,37.5*f,c,37.5);b[a].fillStyle="#000000";var k=1+d(2);2===1+d(2)?b[a].fillRect(2*c,75,c,37.5):b[a].fillRect(2*c,112.5,c,37.5);2===k?b[a].fillRect(4*c,75,c,37.5):b[a].fillRect(4*c,112.5,c,37.5);h(a)},1E3+d(1E3))}function d(a){return Math.floor(Math.random()*
                  a)}var e=[],b=[],f,g,c=275/7,j=[[0,0,1,0,1,0,0],[0,1,1,1,1,1,0],[0,1,2,1,2,1,0],[0,1,2,1,2,1,0],[1,1,1,1,1,1,1],[1,0,1,0,1,0,1]];this.a=function(){e.push(function(){var a=document.createElement("canvas");a.width=275;a.height=225;a.style.position="fixed";a.style.backgroundColor="rgba(0, 0, 0, 0)";return document.body.appendChild(a)}());b.push(e[e.length-1].getContext("2d"));h(b.length-1)};document.body.appendChild(function(a){var b=document.createElement("input");b.style.position="fixed";b.style.left=
                  window.innerWidth-172+"px";b.style.top=window.innerHeight-24+"px";b.type="button";b.value="Ajoutez un Space Invader !";b.onclick=a.a;return b}(this));this.a()})();

                  Il fait 1,18 Ko dans un fichier (gzippé par le minifieur)

                  Ou alors le résultat ici : http://jsfiddle.net/gFr23/embedded/result/

                  Et le code grandeur nature, 75 lignes (faudrait prévoir une balise secret, ça manque beaucoup :p ) :

                  var SI = (function () {
                  	var canvas = [], ctx = [],
                  	i, j,
                  	wsize = 275/7, hsize = 225/6;
                  
                  	function rand (xtimes) {
                  		return Math.floor(Math.random() * xtimes);
                  	}
                  	var invader = [
                  			[0, 0, 1, 0, 1, 0, 0],
                  			[0, 1, 1, 1, 1, 1, 0],
                  			[0, 1, 2, 1, 2, 1, 0],
                  			[0, 1, 2, 1, 2, 1, 0],
                  			[1, 1, 1, 1, 1, 1, 1],
                  			[1, 0, 1, 0, 1, 0, 1]
                  		],
                  		changeColor = function (numctx) {
                  			ctx[numctx].fillStyle = "rgb(" + rand(255) + "," + rand(255) + "," + rand(255) + ")";
                  		},
                  		drawEyes = function (numctx) {
                  			ctx[numctx].fillStyle = "#000000";
                  			(function (rand1, rand2) {
                  				rand1 === 2 ? ctx[numctx].fillRect(2*wsize, 2*hsize, wsize, hsize) : ctx[numctx].fillRect(2*wsize, 3*hsize, wsize, hsize);
                  				rand2 === 2 ? ctx[numctx].fillRect(4*wsize, 2*hsize, wsize, hsize) : ctx[numctx].fillRect(4*wsize, 3*hsize, wsize, hsize);
                  			})(1 + rand(2), 1 + rand(2));
                  		},
                  		drawSquares = function (numctx) {
                  			changeColor(numctx);
                  			for (i = 0; i < 6; i++) {
                  				for (j = 0; j < 7; j++) {
                  					if (invader[i][j] === 1) {
                  						ctx[numctx].fillRect(j*wsize, i*hsize, wsize, hsize);
                  					}
                  				}
                  			}
                  			drawEyes(numctx);
                  		},
                  		draw = function (numctx) {
                  			ctx[numctx].clearRect(0, 0, 275, 225);
                  			canvas[numctx].style.left = rand(window.innerWidth - 270) + "px";
                  			canvas[numctx].style.top = rand(window.innerHeight - 230) + "px";
                  			drawSquares(numctx);
                  		},
                  		loop = function (numctx) {
                  			setTimeout(function () {
                  				draw(numctx);
                  				loop(numctx);
                  			}, 1000 + rand(1000));
                  		};
                  
                  	this.addInvader = function () {
                  		canvas.push((function () {
                  			var _canvas = document.createElement("canvas");
                  			_canvas.width = 275;
                  			_canvas.height = 225;
                  			_canvas.style.position = "fixed";
                  			_canvas.style.backgroundColor = "rgba(0, 0, 0, 0)";
                  			return (document.body.appendChild(_canvas));
                  		})());
                  		ctx.push(canvas[canvas.length - 1].getContext("2d"));
                  		loop(ctx.length - 1);
                  	};
                  	
                  	document.body.appendChild((function (SI) {
                  		var button = document.createElement("input");
                  		button.style.position = "fixed";
                  		button.style.left = (window.innerWidth - 172) + "px";
                  		button.style.top = (window.innerHeight - 24) + "px";
                  		button.type = "button";
                  		button.value = "Ajoutez un Space Invader !";
                  		button.onclick = SI.addInvader;
                  		return button;
                  	})(this));
                  	
                  	this.addInvader();
                  })();

                   Si vous avez des conseils ou remarques je prends volontier ...

                  -
                  Edité par CappaFlow 14 mai 2013 à 20:29:59

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut !  (en bas à gauche de mon message)

                    28 avril 2013 à 18:06:25

                    Pour ceux qui ne le sauraient pas, vous pouvez mettre les scripts js dans la barre d'adresse en mettant 'javascript:' en tête de ligne.
                    Un moyen rapide de tester ;)

                    -
                    Edité par Varamox 28 avril 2013 à 18:06:59

                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 avril 2013 à 18:22:19

                      @che a écrit:

                      Bon ...

                      J'ai fais ce code vite fait

                      #include <unistd.h>
                      #define l(_,k)'!'-!(_&k)
                      #define H(x)printf("%*s\n",a,(char[]){l(x,64),l(x,32),l(x,16),l(x,8),l(x,4),l(x,2),l(x,1),0});
                      main(){int a=rand()%100,t=a*3%20;system("clear");while(t--)puts("");H(20)H(62)H(42)H(42)H(255)H(85)sleep(1),main();}


                      Exactement 256 octets ... Dont 116 qui ne sont pas du code préprocesseur et 236o sans l’include ... J'ai pas réussit à faire un code entier de moins de 214, à 42octets près j'étais trop loin pour chercher encore à faire plus court ... Je peux encore gagné 1 ou 2 octets mais pas plus ...


                      PS: Un code de 256 octets, qui contient 2 fois 42, et qui est à 42octets de la limite que je cherche à atteindre ... :soleil:
                      C'est du C hein ;) Pas du tout portable (Linux et peut-être mac). Aucune norme n'est respecté  ...
                      Il y a peut-être moyen de faire plus court au niveau de la fonction d'affichage ...

                      -
                      Edité par @che hier à 12:51


                      Tu peux le rendre plus court en passant des options -D au compilateur. Ca te permettra de remplacer les "longs" mot-clés et noms de fonctions par des versions plus courtes.

                      Eskimon a écrit:

                      Idem, un deuxième pour moi... en BrainFuck :D

                      +++++[>+++++++>++++++>+++<<<-]>>++>--<..<.>.....<.>..>.<...<.>...<.>...>.<..<.......>..>.<.<..>.<...>.<..>.>.<<...........>>.<<.>.<.......>.<.>>.<<.>.<.>.....<.>.<.>>.<...<..>.<..>...

                      Bon je reconnais, c'est pas vraiment une animation (je crée juste un invader) mais il y a pas moyen de faire un sleep en BF...

                      Tu peux appeler des fonctions systèmes tel que rand ou sleep. Il faut juste le faire "à la main".

                      -
                      Edité par Nanoc 28 avril 2013 à 18:23:10

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                        28 avril 2013 à 18:58:58

                        LawlMan a écrit:

                        Pour ceux qui ne le sauraient pas, vous pouvez mettre les scripts js dans la barre d'adresse en mettant 'javascript:' en tête de ligne.
                        Un moyen rapide de tester ;)


                        ça dépend. Sur certains navigateurs oui (et encore je ne sais même plus si on peut sur Opera, apparemment sur la dernière version non).

                        Mais si on met le "javascript:..." dans un lien cliquable ça peut marcher (sur le SdZ, comme le site est fait, on ne peut pas)

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Je vous ai aidé ? Appuyez sur le bouton "Ce message est utile", avec le pouce levé vers le haut !  (en bas à gauche de mon message)

                          28 avril 2013 à 19:21:32

                          <style>
                          
                          	#invaders{
                          		height : 350px;
                          		width : 400px;
                          	}
                          	.carre{
                          		height : 50px;
                          		width: 50px;
                          		display: inline-block;
                          	}
                          
                          	.color{
                          		background-color : red;
                          	}
                          
                          	.eyeleft, .eyeright{
                          		background-color : none;
                          	}
                          	.active{
                          		background-color : white;
                          	}
                          </style>
                          
                          <div id="invaders">
                          	<?php 
                          	$array_case = array(
                          		0,0,1,0,1,0,0,
                          		0,1,1,1,1,1,0,
                          		0,1,2,1,3,1,0,
                          		0,1,4,1,5,1,0,
                          		1,1,1,1,1,1,1,
                          		1,0,1,0,1,0,1
                          	);
                          
                          	foreach($array_case as $value){
                          		$classes = 'carre';
                          		if($value == 1){
                          			$classes .= ' color';
                          		}
                          		elseif(($value == 2) OR ($value == 4)){
                          			$classes .= ' eyeleft';
                          			if($value == 2){
                          				$classes .= ' active';
                          			}
                          		}elseif(($value == 3) OR ($value == 5)){
                          			$classes .= ' eyeright';
                          			if($value == 3){
                          				$classes .= ' active';
                          			}
                          		}
                          		?><div class="<?php echo $classes; ?>" ></div> <?php
                          
                          	}
                          
                          	?>
                          </div>
                          <script src="js/jquery.js" language="javascript" type="text/javascript" ></script>
                          <script>
                          	$(document).ready(function (){
                          		setInterval("couleur()", 1000);
                          	})
                          
                          	var width = $(document).width();
                          	var height = $(document).height();
                          
                          	function couleur(){
                          		var hue = 'rgb(' + (Math.floor(256*Math.random())) + ','
                          	                 + (Math.floor(256*Math.random())) + ','
                          	                 + (Math.floor(256*Math.random())) + ')';
                          		$('.color').css('backgroundColor' ,hue);
                          		eyes();
                          		deplacer();
                          	}
                          
                          	function eyes(){
                          		$('.active').removeClass('active');
                          		$('.eyeleft:eq('+Math.round(Math.random())+')').addClass('active');
                          		$('.eyeright:eq('+Math.round(Math.random())+')').addClass('active');
                          	}
                          
                          	function deplacer(){
                          		var vitesse = 3000*Math.random()+1000;
                          		$('#invaders').animate({marginTop : ((height-350)*Math.random()),marginLeft : ((width-400)*Math.random()) }, vitesse);
                          	}
                          </script>



                           Disponible ici : http://guillaume-argiles.fr/concours/invaders.php

                          -
                          Edité par Guillaume ARGILES 5 août 2013 à 22:16:12

                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 avril 2013 à 19:23:13

                            @nanoc: Merci de l’astuce ^^ Je ne connaissais pas.
                            Du coup je passe sous la barre des 100 caractères ^^"  

                            #include U
                            #define l(_,k)33-!(_&k)
                            M{Z a=R,t=a*3%20;S;W(t--)P;H(20)H(62)H(42)H(42)H(255)H(85)L,M;}

                            98octets ...  Limite on peut faire encore plus court et je suis sûr qu'il doit y avoir un moyen d'échapper la deuxième ligne (le '!' me bloque, \! ne marche pas comme je veux).
                            En C, ça devient l'un de mes programmes les plus courts jamais conçu ^^"

                            Compile avec :
                            gcc main2.c -std=c99 -D'H(x)=printf("%*s\n",a,(char[]){l(x,64),l(x,32),l(x,16),l(x,8),l(x,4),l(x,2),l(x,1),0});' -D"R=rand()%100" -D'S=system("clear")' -D"M=main()" -D'P=puts("")' -D"L=sleep(1)" -D"W=while" -D"Z=int" -D"U=<unistd.h>" && ./a.out
                            Si le fichier se nomme main2.c ...
                            Que plus jamais je on ne me dise que les codes C sont  longs et qu'on peut faire plus court dans les autres langages ...



                            PS: Avec ça, même la version BrainFuck est  longue ^^" ... C'est limite de la triche .... Surtout que la ligne de compilation est plus longue que le CS ...

                            -
                            Edité par @che 28 avril 2013 à 19:36:06

                            • Partager sur Facebook
                            • Partager sur Twitter
                            🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles  - ♡ Copying is an act of love.
                              28 avril 2013 à 19:47:10

                              Je l'ai fait en Java. Mais comme Java a réputation de lourdeur, complexité et verbosité, je vous prouve le contraire en vous fournissant un code java simple, débarrassé de toutes les fonctionnalités compliquées suivantes :

                              • La notion d'objets, difficile à appréhender.
                              • L'énorme et beaucoup trop complexe API standard, à l'exception de System
                              • Toute autre instruction conditionnelle autre que for - une seule instruction conditionnelle, c'est bien suffisant.
                              • Les packages, qui empêchent de retrouver facilement une classe en obligeant à la ranger n'importe où.
                              • Les noms de variables de plusieurs caractères (trop longs à lire) et utilisées dans l'ordre alphabétique, pour pouvoir s'y retrouver facilement.
                              • La notation hexadécimale, peu naturelle à utiliser.
                              • Les variables inutiles, qui ne sont que des parasites.
                              • La notion de portée des variables, spécialement compliquée en Java.

                              Mon programme affiche un Space Invader d'une "couleur" (en fait l'un des 4 motifs de rectangle disponible sous Windows) dans une console, à un endroit aléatoire. Les positions des yeux sont aussi aléatoires.

                              Preuve de la concision et de l'efficacité du langage Java, il tient en 23 lignes sans compactage invraisemblable du code (910 octets au total).

                              Ce programme fonctionne en mode console pour Windows. Si vous voulez le faire tourner sous Linux, il faudra sans doute changer les valeurs de la ligne 8 pour utiliser les rectangles Unicode.

                              public class SpaceInvaders {
                              	static long a = System.nanoTime() & 4294967295L;
                              	static int b() {
                              		a = (4294957665L * (a & 4294967295L)) + (a >>> 32);
                              		return (int) a & 2147483647;
                              	}
                              	public static void main(String[] a) {
                              		char c = new char[] { 176, 177, 178, 219 }[b() % 4];
                              		int d = b() % 19, e = b() % 73, f = b() % 2, g = b() % 2;
                              		for (int y = 0; y < d; y++) {
                              			System.out.println();
                              		}
                              		for (char[] h : new char[][] { { ' ', ' ', c, ' ', c, ' ', ' ' }, { ' ', c, c, c, c, c, ' ' }, { ' ', c, new char[] { ' ', 'o' }[f], c, new char[] { ' ', 'o' }[g], c, ' ' }, { ' ', c, new char[] { ' ', 'o' }[(f + 1) % 2], c, new char[] { ' ', 'o' }[(g + 1) % 2], c, ' ' }, { c, c, c, c, c, c, c }, { c, ' ', c, ' ', c, ' ', c }, }) {
                              			for (int x = 0; x < e; x++) {
                              				System.out.print(' ');
                              			}
                              			for (char i : h) {
                              				System.out.print(i);
                              			}
                              			System.out.println();
                              		}
                              	}
                              }
                              

                              En cadeau, une version qui utilise des concepts plus avancés, mais paraît-il plus compréhensible...

                              package info.kisai.spaceinvaders;
                              

                              public class SpaceInvadersClean {

                              private static final long a = 0xff_ff_da_61L;
                              private static long r = System.nanoTime() & 0xff_ff_ff_ffL;
                              
                              private static int random() {
                              	r = (a * (r & 0xff_ff_ff_ffL)) + (r >>> 32);
                              	return (int) r & 0x7f_ff_ff_ff;
                              }
                              
                              private static final int POS_X = random() % 73;
                              private static final int POS_Y = random() % 19;
                              
                              private static final char COLOR = new char[]{'\u00b0', '\u00b1', '\u00b2', '\u00db'}[random() % 4];
                              private static final char VOID = ' ';
                              
                              private static final char[] EYES = {VOID, 'o'};
                              private static final int L_EYE = random() % 2;
                              private static final int R_EYE = random() % 2;
                              
                              private static char[][] PATTERN = {
                              	{VOID,	VOID,	COLOR,					VOID,	COLOR,					VOID,	VOID},
                              	{VOID,	COLOR,	COLOR,					COLOR,	COLOR,					COLOR,	VOID},
                              	{VOID,	COLOR,	EYES[L_EYE],			COLOR,	EYES[R_EYE],			COLOR,	VOID},
                              	{VOID,	COLOR,	EYES[(L_EYE + 1) % 2],	COLOR,	EYES[(R_EYE + 1) % 2],	COLOR,	VOID},
                              	{COLOR,	COLOR,	COLOR,					COLOR,	COLOR,					COLOR,	COLOR},
                              	{COLOR,	VOID,	COLOR,					VOID,	COLOR,					VOID,	COLOR},
                              };
                              
                              public static void main(String[] args) {
                              	for (int y = 0; y < POS_Y; y++) {
                              		System.out.println();
                              	}
                              	for (char[] line : PATTERN) {
                              		for (int x = 0; x < POS_X; x++) {
                              			System.out.print(VOID);
                              		}
                              		for (char pixel : line) {
                              			System.out.print(pixel);
                              		}
                              		System.out.println();
                              	}
                              }
                              

                              }

                              </pre>

                              -
                              Edité par SpaceFox 28 avril 2013 à 19:50:37

                              • Partager sur Facebook
                              • Partager sur Twitter
                                28 avril 2013 à 20:19:25

                                @ache: Bon, là, c'est carrément abusé... :) Je proposais juste de remplacer le nom des fonctions, pas tout le code.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                  28 avril 2013 à 20:23:30

                                  @che a écrit:

                                  Du coup je passe sous la barre des 100 caractères ^^"   

                                  #include U
                                  #define l(_,k)33-!(_&k)
                                  M{Z a=R,t=a*3%20;S;W(t--)P;H(20)H(62)H(42)H(42)H(255)H(85)L,M;}


                                  98octets ...

                                  Moi je suis fan :p

                                  même si c'est vrai que c'est un peu de la triche haha

                                  -
                                  Edité par sylv1pdt 28 avril 2013 à 20:33:17

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    28 avril 2013 à 20:56:19

                                    @che a écrit:

                                    @nanoc: Merci de l’astuce ^^ Je ne connaissais pas.
                                    Du coup je passe sous la barre des 100 caractères ^^"  

                                    #include U
                                    #define l(_,k)33-!(_&k)
                                    M{Z a=R,t=a*3%20;S;W(t--)P;H(20)H(62)H(42)H(42)H(255)H(85)L,M;}


                                    98octets ...  Limite on peut faire encore plus court et je suis sûr qu'il doit y avoir un moyen d'échapper la deuxième ligne (le '!' me bloque, \! ne marche pas comme je veux).
                                    En C, ça devient l'un de mes programmes les plus courts jamais conçu ^^"

                                    Compile avec :

                                    gcc main2.c -std=c99 -D'H(x)=printf("%*s\n",a,(char[]){l(x,64),l(x,32),l(x,16),l(x,8),l(x,4),l(x,2),l(x,1),0});' -D"R=rand()%100" -D'S=system("clear")' -D"M=main()" -D'P=puts("")' -D"L=sleep(1)" -D"W=while" -D"Z=int" -D"U=<unistd.h>" && ./a.out

                                    Si le fichier se nomme main2.c ...
                                    Que plus jamais je on ne me dise que les codes C sont  longs et qu'on peut faire plus court dans les autres langages ...



                                    PS: Avec ça, même la version BrainFuck est  longue ^^" ... C'est limite de la triche .... Surtout que la ligne de compilation est plus longue que le CS ...

                                    -
                                    Edité par @che il y a environ 1 heure


                                    Tricheur :p ahah
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      28 avril 2013 à 21:01:09

                                      Quitte à la jouer "ultra-courte" comme @che, je vous propose ce code en shell, qui écrit un HTML sur le disque qu'il suffit d'ouvrir dans un navigateur après :

                                      #!/bin/sh
                                      wget bit.ly/10lJTZV
                                      

                                      29 octets, qui dit mieux ? :D

                                      Edit : v2 puis v3.

                                      -
                                      Edité par SpaceFox 28 avril 2013 à 21:07:12

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        28 avril 2013 à 21:04:32

                                        tu dois pouvoir économiser un octet minimum : vire le dernier /

                                        edit : forcément si tu édite le contenu... tu me déçois SpaceFox, je ne pensais pas que c'etait ton genre d'etier ainsi !

                                        -
                                        Edité par Dr. kristofjé 28 avril 2013 à 21:05:36

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          28 avril 2013 à 21:06:15

                                          kristofjé a écrit:

                                          tu dois pouvoir économiser un octet minimum : vire le dernier /

                                          En fait, wget gère les raccourcisseur d'URL (d'où la v2). On pourrait peut-être faire encore plus court en en prenant un qui me génère un haschcode encore plus petit, mais là j'ai la flemme de chercher.

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            28 avril 2013 à 21:06:16

                                            #!/bin/sh
                                            wget space-bitton.com

                                            Les http://www. et / ne servent à rien ;)

                                            31o :p

                                            EDIT : Cheater --' (on peut aussi faire un alias :D )

                                            -
                                            Edité par v4vx 28 avril 2013 à 21:09:07

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              28 avril 2013 à 21:10:59

                                              Utilise un DNS local pour avoir une adresse plus courte...
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                                28 avril 2013 à 21:12:00

                                                Ouais fin, après, y a pas moyen de limiter son code à S et utiliser un -D pour que S corresponde au code source, non ? x)

                                                Btw, pourquoi s'embêter avec #!/bin/sh, un appel avec bash devrait raccourcir encore 8).

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Small is Beautiful — E.F. Schumacher | Blog (fr)
                                                  28 avril 2013 à 21:15:58

                                                  Nanoc a écrit:

                                                  Utilise un DNS local pour avoir une adresse plus courte...

                                                  Ouais mais ça n'est plus portable.

                                                  lethom a écrit:

                                                  Btw, pourquoi s'embêter avec #!/bin/sh, un appel avec bash devrait raccourcir encore 8).

                                                  Certes, mais du coup ça n'est plus "un programme". Ici le programme est trivial, mais ça reste un script standard.

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    28 avril 2013 à 21:49:26

                                                    salut

                                                    sympa cette atelier

                                                    voici ma petite participation en Jquery (code certainement à optimiser :) )

                                                    <!DOCTYPE html>
                                                    <head>
                                                    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                                                    
                                                    <style type="text/css">
                                                    
                                                    #maxi
                                                    {
                                                    width:378px;
                                                    height:324px;
                                                    }
                                                    
                                                    div
                                                    {
                                                    display:inline-block;
                                                    width: 50px;
                                                    height: 50px;
                                                    margin:0px 2px ;
                                                    }
                                                    
                                                    .couleur
                                                    {
                                                    background: #a18cd8;
                                                    }
                                                    
                                                    </style>
                                                    
                                                    </head>
                                                    
                                                    <body>
                                                    <div id="maxi">
                                                    <?php
                                                    
                                                    $carre= array(
                                                    			0,0,1,0,1,0,0,
                                                    			0,1,1,1,1,1,0,
                                                    			0,1,2,1,3,1,0,
                                                    			0,1,2,1,3,1,0,
                                                    			1,1,1,1,1,1,1,
                                                    			1,0,1,0,1,0,1
                                                    			); 
                                                    			
                                                    	foreach ($carre as $class)
                                                    	{
                                                    		if ($class==0) { echo "<div></div>";}
                                                    		if ($class==1) { echo "<div class=\"couleur\"></div>";}
                                                    		if ($class==2) { echo "<div class=\"ogauche\"></div>";}
                                                    		if ($class==3) { echo "<div class=\"odroit\"></div>";}
                                                    	}
                                                    ?>
                                                    
                                                    </div>
                                                    
                                                    <script src="http://code.jquery.com/jquery.js"></script> 
                                                    	<script>    
                                                    	$(function() { 
                                                    		 
                                                    		 var largeur = ($(window).width()) - 378;   
                                                    		 var hauteur = ($(window).height()) - 378;
                                                    		 
                                                    		 $('.ogauche:eq(0)').css('background','black');
                                                    		 $('.odroit:eq(0)').css('background','black');
                                                    		 
                                                    		 function anime()
                                                    		 {     
                                                    		 	var coul="#"+((1<<24)*Math.random()|0).toString(16);
                                                    			$('.couleur').css('background',coul);
                                                    			
                                                    			$('.ogauche').css('background','white');
                                                            	$('.odroit').css('background','white');
                                                    						
                                                    			$('.ogauche:eq('+Math.round(Math.random())+')').css('background','black');
                                                            	$('.odroit:eq('+Math.round(Math.random())+')').css('background','black');
                                                    			
                                                    			var x = Math.floor(Math.random()*largeur);     
                                                    		 	var y = Math.floor(Math.random()*hauteur);     
                                                    			$('#maxi').offset({top:y,left:x});
                                                    		 }
                                                    		setInterval(anime,3000);
                                                    						 
                                                    	});
                                                    	</script>
                                                    </body>
                                                    </html>



                                                    -
                                                    Edité par hippopotas 30 avril 2013 à 11:21:27

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      28 avril 2013 à 22:58:03

                                                      Salut,

                                                      voici ma création: http://www.j-joue.com/space-invaders.html

                                                      En comptant tout, ça ne fait même pas 50 lignes.

                                                      Qu'en pensez-vous?

                                                      -
                                                      Edité par pfdp 28 avril 2013 à 23:09:01

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        28 avril 2013 à 23:38:32

                                                        en virant jQuery, par exemple :) (troll inside)

                                                        hippopotas a écrit:

                                                        voici ma petite participation en Jquery (code certainement à optimiser :) )

                                                        -
                                                        Edité par STuFF 28 avril 2013 à 23:40:52

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        N'utilisez JAMAIS alert() pour debugger. Utilisez console.log()

                                                          29 avril 2013 à 0:06:59

                                                          Je suis déçu, personne ne propose d'ASM ?
                                                          La flemme de le faire... Mais on est dans un atelier de prog, il faudrait honorer ce langage qui est la base de tous les autres n'est-ce pas :p

                                                          Avis aux amateurs ;)

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            29 avril 2013 à 1:14:32

                                                            mogolecho a écrit:

                                                            Je suis déçu, personne ne propose d'ASM ?

                                                            Et pourquoi pas en aussi malbolge tant qu'on y est ? :p
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              29 avril 2013 à 9:48:36

                                                              mogolecho a écrit:

                                                              Je suis déçu, personne ne propose d'ASM ?
                                                              La flemme de le faire... Mais on est dans un atelier de prog, il faudrait honorer ce langage qui est la base de tous les autres n'est-ce pas :p

                                                              Avis aux amateurs ;)

                                                              Si ça te fait plaisir, je peux prendre un des codes en C proposé et demander à gcc de me sortir le code ASM correspondant...

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              [Atelier] Fond animé Space Invaders

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown