Ma deuxième version, sans Javascript ( sans animation des yeux aléatoires, etc... J'ai rajouté un animation de grossisement pour compenser), pompée sur Szczork ... mais un peu moins lourde (au moins 3ko de moins ) : http://duge.noue.chez.com/SpaceInvaders/2
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]
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
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles- ♡ Copying is an act of love.
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) :
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 )
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 ) :
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
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 ... 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.
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)
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)
@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 ^^"
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
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles- ♡ Copying is an act of love.
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();
}
}
@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 ^^"
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 ...
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 :
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.
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
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
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...
× 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.
Je ne visite plus ce site, si ça vous intéresse (ce qui serait très curieux), lisez ma bio.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
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)
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)
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
N'utilisez JAMAIS alert() pour debugger. Utilisez console.log()