Je vais creer un jeu Space Invaders spécial site du zéro lorsqu'on cliquera sur le Space il changera de couleur et perdra de la vie.préparez vous a être battus
Hugo Duval,18 ans,Programmateur,Admirateur de Pommes de Terres :)
J'ai fait une version rainmeter. Pour ceux qui ne connaissent pas, Rainmeter est un outil permettant de customiser son bureau Windows, ajouter des liens ou changer la barre des taches.
Dans la catégorie inutilement compliqué, je me suis amusé à le faire en ascii avec Applescript, soit un langage de contrôle pour mac os. Comme il n'y a pas de moyen de faire de sortie texte, le script simule un appui au clavier. Il faut donc ouvrir un éditeur de texte quelconque et ça se met à taper tout seul.
set pattern to {{{" ## ##"}, {" ## ##"}, {" ##############"}, {" #### o######o ####"}, {" ###### ###### ######"}, {" ## ############## ##"}, {" ## ## ## ##"}, {" #### ####"}}, {{" ## ##"}, {" ## ##"}, {" ##############"}, {" #### ###### ####"}, {" ###### o######o ######"}, {" ## ############## ##"}, {" ## ## ## ##"}, {" #### ####"}}, {{" ## ##"}, {" ## ##"}, {" ##############"}, {" #### o###### ####"}, {" ###### ######o ######"}, {" ## ############## ##"}, {" ## ## ## ##"}, {" #### ####"}}, {{" ## ##"}, {" ## ##"}, {" ##############"}, {" #### ######o ####"}, {" ###### o###### ######"}, {" ## ############## ##"}, {" ## ## ## ##"}, {" #### ####"}}}
set xmax to 15
set ymax to 15
set frame to {}
repeat
set n to random number from 1 to 3
set x to random number from 1 to xmax
set y to random number from 1 to ymax
repeat with i from 1 to length of item n of pattern
set frame to frame & {""}
repeat y times
set item i of frame to item i of frame & " "
end repeat
set item i of frame to item i of frame & item i of item n of pattern
end repeat
tell application "System Events"
keystroke "a" using command down
keystroke return
repeat x times
keystroke return
end repeat
repeat with i from 1 to length of frame
keystroke item i of frame
keystroke return
end repeat
end tell
set frame to {}
delay 3
end repeat
#include <stdlib.h>
#include <time.h>
#include <SDL/SDL.h>
#define space (
#define SPACE )
#define SPace {
#define spaCE }
#define SPaCE ,
#define SpAcE ;
#define spAce =
#define spAcE ==
#define sPace 0
#define spaCe 1
char pattern[1*2*3][(10*10/2-1)/7] spAce SPace
SPace sPace SPaCE sPace SPaCE spaCe SPaCE sPace SPaCE spaCe SPaCE sPace SPaCE sPace spaCE SPaCE
SPace sPace SPaCE spaCe SPaCE spaCe SPaCE spaCe SPaCE spaCe SPaCE spaCe SPaCE sPace spaCE SPaCE
SPace sPace SPaCE spaCe SPaCE sPace SPaCE spaCe SPaCE sPace SPaCE spaCe SPaCE sPace spaCE SPaCE
SPace sPace SPaCE spaCe SPaCE sPace SPaCE spaCe SPaCE sPace SPaCE spaCe SPaCE sPace spaCE SPaCE
SPace spaCe SPaCE spaCe SPaCE spaCe SPaCE spaCe SPaCE spaCe SPaCE spaCe SPaCE spaCe spaCE SPaCE
SPace spaCe SPaCE sPace SPaCE spaCe SPaCE sPace SPaCE spaCe SPaCE sPace SPaCE spaCe spaCE spaCE
SpAcE void draw space SDL_Surface * Space SPACE SPace SDL_FillRect space Space SPaCE NULL SPaCE
SDL_MapRGB space Space->format SPaCE 2*2*2*2*2*2*2*2-1 SPaCE 2*2*2*2*2*2*2*2-1 SPaCE 2*2*2*2*2*
2*2*2-1 SPACE SPACE SpAcE int x spAce rand space SPACE % space 10*10*10/2+10*2+2*3 SPACE SPaCE
y spAce rand space SPACE % space 10*10*10/2+10*2*2*2 SPACE SPaCE i SPaCE j SpAcE Uint32 color
spAce SDL_MapRGB space Space ->format SPaCE rand space SPACE % 2*2*2*2*2*2*2*2 SPaCE rand space
SPACE % 2*2*2*2*2*2*2*2 SPaCE rand space SPACE % 2*2*2*2*2*2*2*2 SPACE SpAcE SDL_Rect pos SpAcE
pos.w spAce 10*10/2 SpAcE pos.h spAce 10*10/2 SpAcE for space i spAce sPace SpAcE i<1*2*3 SpAcE
i ++ SPACE for space j spAce sPace SpAcE j < (10*10/2-1)/7 SpAcE j ++ SPACE SPace if space
!pattern[i][j] SPACE continue SpAcE pos.x spAce x+j * 2*3*3*3 SPaCE pos.y spAce y + i * 2*3*3*3
SpAcE SDL_FillRect space Space SPaCE &pos SPaCE color SPACE SpAcE spaCE pos.x spAce x + 10*10+2
*2*2 SpAcE pos.y spAce y + 10*10+2*2*2 + space rand space SPACE % 2 SPACE * 2 * 3 * 3 * 3 SpAcE
SDL_FillRect space Space SPaCE & pos SPaCE SDL_MapRGB space Space -> format SPaCE sPace SPaCE
sPace SPaCE sPace SPACE SPACE SpAcE pos.x spAce x + 10*10*2+2*2*2*2 SpAcE pos.y spAce y + 10*10
+2*2*2 + space rand space SPACE % 2 SPACE * 2*3*3*3 SpAcE SDL_FillRect space Space SPaCE & pos
SPaCE SDL_MapRGB space Space -> format SPaCE sPace SPaCE sPace SPaCE sPace SPACE SPACE SpAcE
SDL_Flip space Space SPACE SpAcE spaCE int main space int argc SPaCE char ** argv SPACE SPace
srand space time space NULL SPACE SPACE SpAcE SDL_Init space SDL_INIT_VIDEO SPACE SpAcE atexit
space SDL_Quit SPACE SpAcE SDL_Surface * Space spAce SDL_SetVideoMode space 3*3*10*10 SPaCE 3*3
*10*10 SPaCE 2*2*2*2*2 SPaCE SDL_HWSURFACE SPACE SpAcE SDL_Event event SpAcE int prev spAce
sPace SpAcE while space spaCe SPACE SPace SDL_PollEvent space &event SPACE SpAcE if space event
.type spAcE SDL_QUIT SPACE break SpAcE if space SDL_GetTicks space SPACE - prev > 3*10*10*10 ||
! prev SPACE SPace draw space Space SPACE SpAcE prev spAce SDL_GetTicks space SPACE SpAcE spaCE
spaCE SPace spaCE SPace spaCE SPace spaCE SPace spaCE SPace spaCE return sPace SpAcE spaCE
Hey, mais le préprocesseur, c'est l'obfuscation du pauvre. Soyez inventifs, un peu !
IOCCC, our likes and dislikes
Doing masses of #defines to obscure the source has become 'old'. We tend to 'see thru' masses of #defines due to our pre-processor tests that we apply. Simply abusing #defines or -Dfoo=bar won't go as far as a program that is more well rounded in confusion.
Allez, hop! Une petite 2eme version uniquement en HTML+CSS... Je sais que ca a déjà été fait, mais la, via des @keyframes, j'arrive à un resultat assez proche du script de base... sans, malheureusement, tout l'aspet random...
Ca se passe ici (Ma premiere participation avec un server sous NodeJS se trouve ici)
Notez aussi le fait que j'utilise aucune class, aucun ID, et que j'ai essayé de simplifier au maximum la partie HTML
Étant donné que je débute en Common Lisp, je vous propose un petit code pour cet atelier. Je voulais intialement concourir dans la catégorie « code le plus court », mais je n'arrive pas à battre les codes déjà posté. Je me suis donc rabattu sur la catégorie « code le plus tordu », où j'ai, je pense, de bonnes chances... Du moins, si on mesure en « bizarreries / ligne de code ». Bref, venons-en au fait !
(ql:quickload :lispbuilder-sdl)
(defun draw-tile (x y col)
(sdl:draw-box-* (* 20 x) (* 20 y) 18 18 :color col))
(defparameter *space-invader*
'((░ ░ █ ░ █ ░ ░)
(░ █ █ █ █ █ ░)
(░ █ ◕ █ ◉ █ ░)
(░ █ ░ █ ░ █ ░)
(█ █ █ █ █ █ █)
(█ ░ █ ░ █ ░ █)))
(defun ░ (i j) ())
(defun █ (i j) (draw-tile (+ *x* i) (+ *y* j) *col*))
(defun ◉ (i j) (draw-tile (+ *x* i) (+ *y* j *eye1*) sdl:*black*))
(defun ◕ (i j) (draw-tile (+ *x* i) (+ *y* j *eye2*) sdl:*black*))
(rand-inv (defun rand-inv (f)
(setf *x* (random 20))
(setf *y* (random 20))
(setf *eye1* (random 2))
(setf *eye2* (random 2))
(setf *col* (sdl:color :r (random 255) :g (random 255) :b (random 255)))))
(defun draw-invader ()
(loop for l in *space-invader*
for j from 0 do
(loop for e in l
for i from 0 do (funcall e i j))))
(sdl:with-init ()
(sdl:window 600 600)
(rand-inv nil)
(sdl:with-events ()
(:quit-event () T)
(:idle () (sdl:clear-display sdl:*white*)
(draw-invader)
(sdl:update-display))))
Ne vous arrêtez pas aux tonnes de parenthèses, même pour du Lisp, ce code est vraiment bizarre.
La première ligne importe la SDL en utilisant un sympathique script nommé QuickLisp — si vous l'avez, il ira télécharger, installer et charger la SDL pour vous. Les deux lignes suivantes définissent une fonction « draw-tile », qui est un wrapper pour la fonction « draw-box » (qui dessine un carré à l'écran). Jusque là, rien d'exceptionnel.
Ensuite, je définis une variable appelée « *space-invader* » (les étoiles sont une convention pour désigner les variables globales), qui contient une liste de symboles. Si vous ne connaissez ni Lisp, ni Erlang, vous pouvez penser les symboles comme des chaînes de caractères... Mais en vérité, il s'agit plutôt de noms de variables, ou de fonctions. Vous pouvez les penser un peu comme « true » et « false » dans votre langage favori : « true », est juste « true », rien de plus. Les symboles fonctionnent un peu pareil. En outre, les symboles (ou atomes, comme je devrais les appeler) contenus dans ma liste sont assez bizarres : ce sont en fait des caractères unicode prévus normalement pour dessiner dans la console.
Je définis ensuite quatre fonctions, dont les noms sont précisément ces caractères unicode bizarres. Oui, on a le droit de donner un nom pareil à une fonction en Lisp. Chacune de ces fonctions prend deux arguments (i et j), qui désignent des coordonnées, et font référence à un certain nombre de variables globales, *x*, *y*, *col*, *eye1* et *eye2* qui ne sont pas encore déclarées. Ces variables contiendront, comme leur nom l'indique, respectivement la position, la couleur, et la position des yeux du space invader à afficher.
Vient ensuite la fonction rand-inv, qui tire un invader au hasard, en assignant des valeurs aléatoires aux variables *x*, *y*, etc. La première fois que cette fonction est appelée, ces variables n'existent pas ; elles sont donc déclarées sur le coup (c'est une mauvaise pratique ; j'aurais normalement dû les déclarer en début de fichier avec (defvar *x* 0), etc.). En outre, cette fonction prend un paramètre, f, qui ne sert à rien, il n'est jamais utilisé nulle part. Toutefois, comme vous pouvez le voir en observant attentivement le code, la fonction « rand-inv » est appelée sur sa propre définition ! Le « defun » qui se charge de la déclarer est passé en paramètre à la fonction elle-même... Ainsi, on appelle une fonction qui est déclarée immédiatement après. Comme les arguments d'une fonction sont évalués avant l'appel, la déclaration de la fonction est prise en compte avant l'appel. Mais le code est surprenant au premier coup d'œil. Notez que cette astuce n'était absolument pas nécessaire pour le programme ; tout cela sert simplement à le rendre encore plus tordu. ;)
La fonction « draw-invader », pour sa part, parcourt la liste *space-invader* dont nous avons parlé plus tôt (avec les symboles), mais en considérant chaque symbole comme la fonction qu'il nomme. Ainsi, chaque fois que l'on rencontre le symbole ░ dans la liste, la fonction ░ est appelée. Les indices i et j donnent les « coordonnées » de l'élément de la liste que nous sommes en train de regarder ; le ░ en haut à gauche sera appelé avec i=0, j=0, et ainsi de suite. Chacune des fonctions ░, █, etc. se charge de dessiner un carré de couleur aux coordonnées qui lui sont passées en paramètre (auxquelles elles rajoutent *x* et *y*, les coordonnées globales de l'invader). Notez au passage l'utilisation de la curieuse instruction « loop », qui permet d'itérer sur plusieurs choses en même temps (ici, les éléments d'une liste et les nombres entiers). Ma liste étant une « liste à deux dimensions » (liste de listes, si vous préférez), j'utilise donc deux loops imbriquées.
Enfin, le bout de code final s'occupe d'initialiser la SDL (la construction « with » assure qu'elle sera bien libérée, quoi qu'il arrive à la fin du programme), d'ouvrir une fenêtre, de tirer un nouvel invader au hasard, puis de l'afficher en boucle jusqu'à ce que la fenêtre soit fermée.
Ouf ! Je n'ai pas encore fait de version animée (où l'invader change au bout de X secondes), mais ça ne saurait tarder. L'explication est déjà assez dense pour le code actuel, vous ne trouvez pas ? Une autre possibilité que j'avais envisagée, avant de l'abandonner, était de dessiner le space-invader dans la docstring d'une fonction, puis de faire en sorte que la fonction parcoure sa propre doc-string pour dessiner. Peut-être dans une future version du code, je n'ai pas fini de travailler dessus !
Pour conclure, j'aimerais insister de nouveau sur un point : même pour du lisp, ce code est franchement bizarre. Ne vous arrêtez pas au fait qu'il s'agit d'un langage inhabituel ! ;)
- Edité par GuilOooo 5 mai 2013 à 22:16:32
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
Ce langage doit être génial avec un ide qui ne colore pas les couples de parenthèses..
Je n'utilise pas d'IDE, juste Vim et une bonne vieille REPL. Il ne colore pas les parenthèses (enfin, elles sont toutes de la même couleur) ; par contre, chaque fois que j'écris un “(”, le “)” correspondant est automatiquement inséré. De même, je ne peux supprimer les parenthèses que par deux (autrement dit, si j'efface juste un “(”, il ne se passe rien, je dois effacer tout le contenu de la parenthèse). Ainsi, mon code est toujours valide en ce qui concerne les parenthèses. La version encore plus gore, avec animations et un screenshot est à venir.
J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
Content de voir un code lisp, ça va me permettre de poser quelques question
Quel est le sens de defparameter, par rapport à un setf ou autre setq ? (j'ai testé vite fait l'effet de la macro avec macroexpand, mais je comprends rien)
Pourquoi as tu séparé les fonctions pour chaque oeil, alors qu'elles semblent faire pareil toutes les deux ? Suffit de mettre le random dans la fonction direct.
J'ai pas compris l'histoire du with. Sinon, la syntaxe avec ':', c'est une histoire de packages, c'est ça ?
Sinon, perso, j'ai des sérieux problèmes avec loop, la page de l'hyperspec est carrément imbuvable, c'est sympa de voir que ça peut s'utiliser aussi simplement
J'ai bien aimé l'histoire des symboles que tu appelles comme des fonction.
Ca m'a semblé inutile de montrer le code, puisque c'est du vieux code pas spécialement réalisé pour l'occasion. Si tu considère le programme comme un compilateur spécifique d'IFS, alors ma réalisation est le code ci-dessous (contenu du fichier .ifs réalisé graphiquement avec le logiciel en question) :
Je reviens vous presentez quelque chose de totalement nouveau, pour ceux qui le savent j'ai creer un traducteur pseudo-code -> c il y a peu, et aujourd'hui j'ai decide de re-particper au concours mais en utilisant mon traducteur comme langage de programmation !
Voici le code source :
Debut
Tableau invader[6] <- " @@ @@ ", " @@@@@@@@@@ ", " @@()@@ @@ ", " @@ @@()@@ ", "@@@@@@@@@@@@@@", "@@ @@ @@ @@"
x <- 0
y <- 0
tmp <- 0
i <- 0
Init Aleatoire
Pour , ,
Effacer
x = Aleatoire % 66
y = Aleatoire % 66
tmp = y
Tant Que (x-- > 0)
Afficher "\n"
Fin Boucle
Pour i = 0, i < 6, i++
Tant Que (tmp-- > 0)
Afficher " "
Fin Boucle
Afficher chaine invader[i]
Afficher "\n"
tmp = y
Fin Boucle
Pause 3
Fin Boucle
Fin
× 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 !
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.
Retrouvez moi sur mon blog et ma chaine Youtube !