Evidemment ! Le but de cet atelier est de se faire plaisir et de partager nos codes. Il n'y a rien a gagner, chacun fait comme il le veut. Tu remarquera que certains ont déjà prit quelques libertés en changeant la forme des Space Invader. Ou même moi qui ne génère meme pas des images mais utilise des fenetre de programmes.
D'ailleurs pour ceux qui utilisent des trucs un peu exotiques, une capture d'écran / gif animée / vidéo est bienvenu (afin d'éviter que l'on s'amuse à installer des nouveaux softs jute pour une animation )
Je sur-kiffe la version de BlackFart On as le droit à une screen aussi ? Parce que j'ai un peu la flemme de tester...
En tout cas, depuis que j'ai mon serveur lancé, j'ai eu ~140 visiteurs uniques... Ca fait plaisir ! (Eh ouais, j'ai tracé toutes les IP, localisé, et je vais les vendre à des hackers... Mouahahahah )
En tout cas, depuis que j'ai mon serveur lancé, j'ai eu ~140 visiteurs uniques... Ca fait plaisir ! (Eh ouais, j'ai tracé toutes les IP, localisé, et je vais les vendre à des hackers... Mouahahahah )
Bonjour à tous!
J'aime bien ce petit atelier, assez rigolo. Je me suis un petit moment tâté à trouver la plateforme que j'utiliserais ainsi que la méthode de programmation pour utiliser le moins de ressources possible et obtenir un fichier souple, éditable et léger. Alors, je suis parti sur une plateforme web simple : HTML 5 et CSS 3. Le système n'est pas très différent de celui de Szczork. J'ai essayé de minimiser un maximum le code.
Un gros souci de réflexion s'est posé. Sur la version « originale », le space invader se déplace image par image, et non pas par une animation linéaire. En CSS 3, c'est pas très simple d'obtenir ce résultat. J'ai trouvé une solution mais le nombre d'images par seconde est encore trop élevé pour qu'il paraisse saccadé à l’œil humain. Bref. Mon fichier pèse 2,27ko (je n'ai pas encore réussi à faire en dessous pour le moment). Ce système a été spécialement étudié pour Google Chrome (oui, le fichier est un peu plus lourd sinon... Quoi qu'il le serait peut-être moins pour Firefox compte-tenu des normes ?).
et comme c'est jamais parfait , je travais sur des tailles de monstre avec un carrée de 3*3 pixel , séparer avec des liges ( peut eter avec des sprites qui sais ...)
c=0;setInterval(function(){var A=document,l=window,k=A.getElementById("b"),t=Math.random,x=Math.round,s=function(d){return A.getElementById(d)},n=function(i,d,j){if(j){this.id=j}this.id.style[i]=d;return n},B=function(d){return t()*d},z=[[0,0,1,0,1,0,0],[0,1,1,1,1,1,0],[0,1,0,1,0,1,0],[0,1,0,1,0,1,0],[1,1,1,1,1,1,1],[1,0,1,0,1,0,1]],e="width",g="height",m="background",p="top",o="left",f="position",a="#000",h=["108108","108162","216108","216162"],u="#"+Math.floor(t()*16777215).toString(16),r,b,q,y,v;k.innterHTML="";n(e,"374px",k)(g,"324px")(f,"relative")(p,(54*5)*B(x(l.innerHeight/(54*5))-1))(o,(54*6)*B(x(l.innerWidth/(54*6))-1));for(y in z){for(v in z[y]){b=54*v;q=54*y;r=A.createElement("div");r.id=""+b+""+q+""+c;k.appendChild(r);n(e,"50px",r)(g,"50px")(f,"absolute")(o,b)(p,q)(m,z[y][v]?u:"#fff")}}n(m,a,s((x(B(2))?h[0]:h[1])+c));n(m,a,s((x(B(2))?h[2]:h[3])+c));c++},2000);
Une version en C en peu plus longue que celle de @che mais qui gère la position aléatoire des yeux. La taille de la console ce passe en paramètre (./prog $LINES $COLUMNS)
J'ai rusé, chaque pixel est en fait une fenetre (tkinter) sans bordure qui va se déplacer aléatoirement. Donc si vous le lancé chez vous, ça va créer un certain nombre de fenetre qui vont se déplacer et changer de couleurs. J'utilise un tableau 2D, tout comme Thunderseb mais legerement plus "souple" (au vu de son code que j'ai lu rapidement). En particulier, à chaque mise à jour, les yeux se "déplacent" (eventuellement, ils peuvent rester fixe) dans l'une des cases libres autour. Il peut y en avoir autant qu'on veut.
[...]
Bon par contre le code est crade et vite fait, je pense que je le modifierai plus tard, c'est qu'une première ebauche. Mais si vous vous voulez vous en servir comme base, allez y
J'ai bien aimé le concept de fenêtres qui servent de pixels. Au départ, j'ai juste voulu jouer avec ton code. Au final, je me suis amusé à le nettoyer à ma façon. Ensuite, j'ai eu une idée sympa, mais je ne m'en sortais pas avec tkinter, j'ai donc passé le code sous PySide.
Voici l'idée (j'ai quitté le style de l'exo pour faire un peu plus original) : un fantôme récursif. En théorie, on peut aller à n'importe quelle profondeur, mais je me suis contenté de 2 (après, on voit plus rien de toute façon). Tous les petits fantômes sont indépendants.
screen :
Au niveau du code, j'ai juste fait un petit hack bien affreux parce que j'avais la flemme de trouver une solution. Je mets mes objets dans une liste que je fais semblant d'utiliser après le exit, pour éviter que le GC ne me supprime brutalement mes objets... [edit : ah oui, il y a aussi un tout petit hack ligne 39, pas trouvé comment faire plus propre sans ajouter de la lourdeur]
Voici le code :
from PySide.QtCore import *
from PySide.QtGui import *
import sys
import random
patt1 = (
(0,0,1,0,1,0,0),
(0,1,1,1,1,1,0),
(0,1,0,1,0,1,0),
(0,1,8,1,8,1,0),
(1,1,1,1,1,1,1),
(1,0,1,0,1,0,1) )
patt2 = (
(0,0,1,0,0,0,0,0,1,0,0),
(0,0,0,1,0,0,0,1,0,0,0),
(0,0,1,1,1,1,1,1,1,0,0),
(0,1,1,8,0,1,0,8,1,1,0),
(1,1,1,0,0,1,0,0,1,1,1),
(1,0,1,1,1,1,1,1,1,0,1),
(1,0,1,0,0,0,0,0,1,0,1),
(0,0,0,1,1,0,1,1,0,0,0) )
class SpaceInvader(QObject):
def __init__(self, parent, patern, size, margin, inter):
self.width = len(patern[0])
self.height = len(patern)
self.interval = int(1000 * inter)
color = [random.randrange(0, 255) for i in range(3)]
self.fw = { (l, c) : FloatingPixel(parent, c, l, size, color, patern[l][c] is 8, margin)
for c in range(self.width)
for l in range(self.height)
if patern[l][c] is not 0 }
if parent is None: parent = _desktop_geometry
self.DepPosX = parent.width() - (self.width * size + (self.height + 1) * margin)
self.DepPosY = parent.height() - (self.height * size + (self.height + 1) * margin)
self.update_app()
def update_app(self):
depX = random.randint(0, self.DepPosX)
depY = random.randint(0, self.DepPosY)
for fwt in [fw for fw in self.fw.values() if fw.dep]:
ol, oc = fwt.yy, fwt.xx
lposPoss = [(ii,jj) for ii in range(max(0,ol-1), min(self.height, ol+2))
for jj in range(max(0,oc-1), min(self.width, oc+2))
if (ii, jj) not in self.fw or self.fw[ii,jj] is fwt]
nl, nc = random.choice(lposPoss)
del self.fw[ol,oc]
fwt.yy, fwt.xx = nl, nc
self.fw[nl,nc] = fwt
for w in self.fw.values():
w.update_conf(depX, depY)
QTimer.singleShot(self.interval, self.update_app)
class FloatingPixel(QLabel):
def __init__(self, parent, xx, yy, sz, color, dep, margin):
super().__init__(parent)
self.xx, self.yy = xx, yy
self.dep, self.margin, self.sz = dep, margin, sz
self.setGeometry(self.xx, self.yy, sz, sz)
palette = QPalette()
if not dep:
palette.setColor(QPalette.Window, QColor(*color))
else:
palette.setColor(QPalette.Window, QColor(0,0,0))
self.setPalette(palette)
self.setAutoFillBackground(True)
self.setWindowFlags(Qt.FramelessWindowHint)
self.show()
def update_conf(self, depX, depY):
self.move(self.xx * (self.sz + self.margin) + depX, self.yy * (self.sz + self.margin) + depY)
app = QApplication(sys.argv)
_desktop = QApplication.desktop()
_desktop_geometry = _desktop.availableGeometry()
objs = [] # hack...
si = SpaceInvader(None, patt2, 65, 5, 3.5)
objs.append(si) # hack...
for w in si.fw.values():
if not w.dep and random.choice([1,2,3]) == 1:
ssi = SpaceInvader(w, patt1, 5, 1, random.uniform(0.3, 1.2))
objs.append(ssi) # hack...
app.exec_()
sys.exit()
print(objs) # hack...
EDIT :
On peut bien entendu avoir plusieurs êtres principaux. Quelques screens supplémentaires :
@@che: chapeau
Tu peux encore gagner 2 octets avec une ternaire au lieu de &&/||. Et 2 autres en mettant une multiplication par 4 à la place du décalage binaire par 2.
Je t'enterai peut-être une nouvelle approche en C en fin de semaine. Pour le moment je suis sûr une version java-script un peu spéciale.
J'ai tenté moi aussi de faire le programme en basique, mais sur casio (35+)
J'ai un peut suivi l'exemple de v4vx
While 1
15Rand#+1->A
2Rand#+1->B
Locate A+2,B,"O O
Locate A,B+1," OOOOO
Locate A,B+2," O O O
Locate A,B+3," O O O
Locate A,B+4,"OOOOOOO
Locate A,B+5,"O O O O
Locate A+2,B+2+Rand#,0
Locate A+4,B+2+Rand#,0
For 1->A To 200:Next
ClrText
WhileEnd
Pour un code total de 178 octes (+20 pour les variables) En final les codes sont plus gros sur casio ....
Edit : J'ai trouvé comment faire plus court, mais avec a cause des limites de taille des nombres de la machine, j'ai du couper la ligne du haut de la bestiole
While 1
26299852280->C
15Rand#->A
3Rand#->B
For 1->G To 7
For 1->H To 5
if Frac(C/2)!=0
Then Locate A+G,B+H,8
Dsz C
IfEnd
C/2->C
Next:Next
Locate A+3,B+2+Rand#,0
Locate A+5,B+2+Rand#,0
For 1->A To 500:Next
ClrText
WhileEnd
Le programme fait 154 octes (+50 de variables)
En théorie, sans la limite de taille, le prog fait 155 octes (la valeur de C change)
- Edité par n!co69 1 mai 2013 à 2:51:43
"Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
Puisque la guerre est déclarée en terme de poids, voici une nouvelle proposition en Axe (pour calculatrices 83+/84+ et SE) :
.I
[0000287C5454FEAA→Pic1
While 1
ClrDraw
Pt-On(rand^56,→P,Pic1
rand^2→R
For(256)
If T
0→T
Pxl-Change(P+2,+2+R
Pxl-Change(P+4,+R
DispGraph
Else
1→T
End
End
End
101 octets sur la calculatrice, le système d'encodage étant un peu particulier (une fonction est un caractère, pas un ensemble de lettres).
Les yeux sont affichés en simili nuances de gris par alternance très rapide de pixel allumé/éteint. Contrairement à mon dernier code en Axe où le système utilisé était plus joli et plus complexe.
× 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.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
#geek
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.