Salut tout le monde, pour ma part, c'est PHP, HTML et AJAX
Et je n'ai pas fait dans le plus simple, loin de là ! Il y a de l'inutile. Beaucoup même Au départ je souhaitais lefaire carrément avec Symfony (je vous ai dit que je faisait dans l'inutile !) mais finalement ça m'aurait gonflé
<?php
class Invader{
private $cells;
private $color;
private $template;
private $title;
private $css;
private $content;
private $refresh;
private $x;
private $y;
private $scale;
public function __construct($seed, $scale, $refresh){
$this->scale = $scale;
$this->refresh = $refresh;
$this->color = new Color($seed);
$this->color = $this->color->generate();
$this->cells = array(array());
for($i=0;$i<7;$i++){
for($j=0;$j<6;$j++){
$this->cells[$i][$j] = new Cell($this->color, $this->scale);
$this->cells[$i][$j]->setPosition($i,$j);
}
}
$this->addFirstEye(new Eye($this->scale));
$this->addSecndEye(new Eye($this->scale));
$this->template = new Template("index");
}
public function addFirstEye($e){
$fe = $this->getFirstEye();
$fe[0]->setColor($e->getTopCell()->getColor());
$fe[1]->setColor($e->getBottomCell()->getColor());
//$fe[1] = $e->getBottomCell();
}
public function addSecndEye($e){
$fe = $this->getSecndEye();
$fe[0]->setColor($e->getTopCell()->getColor());
$fe[1]->setColor($e->getBottomCell()->getColor());
}
public function getFirstEye(){
return array($this->cells[2][2],$this->cells[2][3]);
}
public function getSecndEye(){
return array($this->cells[4][2],$this->cells[4][3]);
}
public function colorCells($c){
foreach($cells as $cell){
$cell->color($c);
}
}
private function setTemplate($t){
$this->template = $t;
}
private function setTitle($t){
$this->title = $t;
}
public function getCss(){
$css = "";
$css .= $this->getBaseCss();
foreach($this->cells as $cell){
foreach($cell as $cel){
$css .= $cel->getCss()."
";
}
}
return $css;
}
public function getContent(){
$content = "";
foreach($this->cells as $cell){
foreach($cell as $cel){
$content .= $cel->getHTML();
}
}
return $content;
}
private function setRefresh($r){
$this->refresh = $r;
}
public function getHTML(){
return $this->template->render(array( "css" => $this->getCss(),
"title" => "Space Invader",
"content" => $this->getContent(),
"invader.pos.top" => $this->x,
"invader.pos.bottom" => $this->y,
"scale" => $this->scale,
"invader.pos.left" => $this->x,
"invader.pos.top" => $this->y));
}
}
?>
Cell.class.php
<?php
class Cell{
private $x;
private $y;
private $scale;
private $color;
public function __construct($color, $scale){
$this->color = $color;
$this->scale = $scale;
}
public function setPosition($x, $y){
$this->x = $x;
$this->y = $y;
$this->checkColorByZone();
}
public function checkColorByZone(){
$whiteSpots = array( "00", "01", "03", "05", "06",
"10", "16",
"20", "22", "24", "26",
"30", "32", "34", "36",
"51", "53", "55");
$loc = $this->y.$this->x;
if(in_array($loc, $whiteSpots)){
$this->color = new Color(0);
$this->color->setRGB(255, 255, 255);
}
}
public function getHtml(){
return '<div id="block'.$this->x.$this->y.'" class="pixel"></div>
';
}
public function getCss(){
return
'#block'.$this->x.$this->y.'{
width: '.$this->getW().'px;
height: '.$this->getH().'px;
background-color: '.$this->color->getRGB().';
color: '.$this->color->getRGB().';
position: absolute;
top:'.$this->getTop().'px;
left:'.$this->getLeft().'px;
border-color: white;
border-size: 2px;
display: none;
}';
}
public function getH(){
return 100*$this->scale;
}
public function getW(){
return 100*$this->scale;
}
public function getLeft(){
return $this->x*100*$this->scale;
}
public function getTop(){ // left et top du positionnement absolute côté CSS
return $this->y*100*$this->scale;
}
public function getColor(){
return $this->color;
}
public function setColor($c){
$this->color = $c;
return $this;
}
}
?>
Color.Class.php
<?php
class Color{
private $r;
private $g;
private $b;
private $seed;
public function __construct($seed){
$this->seed = $seed;
}
public function generate(){
$seed = $this->seed->getSeed();
$this->r = floor(255*$seed);
$s2 = new Seed();
$this->g = floor(255*$s2->getSeed());
$s3 = new Seed();
$this->b = floor(255*$s3->getSeed());
return $this;
}
public function getRGB(){
return "rgb(".$this->r.", ".$this->g.", ".$this->b.")";
}
public function getR(){
return $this->r;
}
public function getG(){
return $this->g;
}
public function getB(){
return $this->b;
}
public function setR($r){
$this->r = $r;
return $this;
}
public function setG($r){
$this->g = $g;
return $this;
}
public function setB($r){
$this->b = $b;
return $this;
}
public function setRGB($r, $g, $b){
$this->r = $r;
$this->g = $g;
$this->b = $b;
return $this;
}
}
?>
Eye.class.php
<?php
class Eye{
private $cellTop;
private $cellBottom;
public function __construct($scale){
$seed = new Seed();
$black = new Color($seed);
$black->setRGB(0, 0, 0);
$white = new Color($seed);
$white->setRGB(255, 255, 255);
if(floor(100*$seed->getSeed())%2 == 0){
$this->cellTop = new Cell($black, $scale);
$this->cellBottom = new Cell($white, $scale);
}else{
$this->cellTop = new Cell($white, $scale);
$this->cellBottom = new Cell($black, $scale);
}
}
public function getTopCell(){
return $this->cellTop;
}
public function getBottomCell(){
return $this->cellBottom;
}
}
?>
Seed.class.php (le comble de l'inutile !)
<?php
class Seed{
public function __construct(){
}
public function getMe(){
return $this;
}
public function getSeed(){
return mt_rand()/mt_getrandmax();
}
}
?>
Template.class.php
<?php
class Template{
private $tpl;
public function __construct($name){
$this->tpl = file_get_contents("tpl/".$name.".tpl");
}
public function render($tplVars){
foreach($tplVars as $varName => $value){
$this->tpl = preg_replace("$\{\{".$varName."\}\}$", $value, $this->tpl);
}
return $this->tpl;
}
}
?>
#define N rand()
#define Z SDL_MapRGB
int main(void){SDL_Surface*v=SDL_SetVideoMode(800,600,32,0);char s[6]={20,62,42,42,127,85};while(1){SDL_Rect r={N%688,N%504,15,15};int c=Z(v->format,N%256,N%256,N%256);s[3]=(s[2]^=(N&20))^20;SDL_FillRect(v,NULL,Z(v->format,255,255,255));for(size_t i=0;i<6;++i){for(char j=0;j<7;++j){char a=s[i]&1<<j;if(a)SDL_FillRect(v,&r,c*(!(i&2)||a&42));r.x+=16;}r.x-=112;r.y+=16;}SDL_Flip(v);SDL_Delay(1024);}return 0;}
L'aléatoire de position, de couleur, de quoi que ce soit est impossible en CSS. (en html aussi d'ailleurs)
D'ailleurs, si on va par là, l'aléatoire est impossible à obtenir avec une machine.
Quoi qu'il en soit, si tu veux du pseudo aléatoire, ma première version ira très bien. Je suis aller sur cette version ci dans le sens de mathéo21 : tableless et plus court. La rotation servant à rien, mais m'a fais travailler les keyframes en css.
L'aléatoire de position, de couleur, de quoi que ce soit est impossible en CSS. (en html aussi d'ailleurs)
D'ailleurs, si on va par là, l'aléatoire est impossible à obtenir avec une machine.
Quoi qu'il en soit, si tu veux du pseudo aléatoire, ma première version ira très bien. Je suis aller sur cette version ci dans le sens de mathéo21 : tableless et plus court. La rotation servant à rien, mais m'a fais travailler les keyframes en css.
mais animé est possible en css, ainsi que donne une impression d'aléatoire (d'où le fait que j'ai mis entre guillemets).
Pour corser le tout, sans même utiliser rand() de php
Voilà mon code, VB.NET, code assez propre, rendu assez dégueulasse quand le nouveau space invader arrive, mais sur les pc rapides ça ne se voit pas.
(ET FAIT AVEC LES WINDOWS FORMS, S'IL VOUS PLAIT :D)
Imports System.Windows.Forms
Public Class Main
Inherits Form
WithEvents MainForm As New Form
WithEvents Timer As New Timer
Dim Positions As New List(Of List(Of Drawing.Point))
Dim Generator As New Random
Dim SI As Drawing.Bitmap
Sub New()
Form.CheckForIllegalCrossThreadCalls = False
MainForm.Size = My.Computer.Screen.Bounds.Size
MainForm.Opacity = 0
MainForm.ShowInTaskbar = False
MainForm.ShowIcon = False
MainForm.FormBorderStyle = FormBorderStyle.None
MainForm.Location = New Drawing.Point(0, 0)
MainForm.BackColor = Drawing.Color.White
For y = 0 To 5
Positions.Add(New List(Of Drawing.Point))
For x = 0 To 6
Positions(y).Add(New Drawing.Point((x * 54), (y * 54)))
Next
Next
SI = RefreshSpaceInvader(Drawing.Color.Black)
MainForm.Show()
ShowInTaskbar = False
ShowIcon = 0
Me.Hide()
For i = 0 To 1.01 Step 0.01
MainForm.Opacity = i
Threading.Thread.Sleep(15)
Next
Timer.Interval = Generator.Next(2000, 5000)
Timer.Start()
End Sub
Function RefreshSpaceInvader(ByVal EyesColor As Drawing.Color) As Drawing.Bitmap
Dim SpaceInvader As New Drawing.Bitmap(428, 374)
Dim EyesPositions() As Drawing.Point = {If(Generator.Next(0, 10000) < 5000, Positions(2)(2), Positions(3)(2)), If(Generator.Next(0, 10000) < 5000, Positions(2)(4), Positions(3)(4))}
Dim BodyColor As Drawing.Color = Drawing.Color.FromArgb(Generator.Next(0, 256), Generator.Next(0, 256), Generator.Next(0, 256))
Dim BodyPositions() As Drawing.Point = {Positions(0)(2), Positions(0)(4), _
Positions(1)(1), Positions(1)(2), Positions(1)(3), Positions(1)(4), Positions(1)(5), _
Positions(2)(1), Positions(2)(3), Positions(2)(5), _
Positions(3)(1), Positions(3)(3), Positions(3)(5), _
Positions(4)(0), Positions(4)(1), Positions(4)(2), Positions(4)(3), Positions(4)(4), Positions(4)(5), Positions(4)(6), _
Positions(5)(0), Positions(5)(2), Positions(5)(4), Positions(5)(6)}
For Each Position As Drawing.Point In BodyPositions
For x = 0 To 50 - 1
For y = 0 To 50 - 1
SpaceInvader.SetPixel(Position.X + x, Position.Y + y, BodyColor)
Next
Next
Next
For Each EyePosition As Drawing.Point In EyesPositions
For x = 0 To 50 - 1
For y = 0 To 50 - 1
SpaceInvader.SetPixel(EyePosition.X + x, EyePosition.Y + y, Drawing.Color.Black)
Next
Next
Next
SpaceInvader.MakeTransparent(Drawing.Color.White)
Return SpaceInvader
End Function
Private Sub MainForm_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MainForm.KeyPress
If Asc(e.KeyChar) = Keys.Escape Then
Application.Exit()
End If
End Sub
Private Sub MainForm_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MainForm.Paint
Me.Hide()
e.Graphics.DrawImage(SI, New Drawing.Point(Generator.Next(0, My.Computer.Screen.Bounds.Size.Width - 428), Generator.Next(0, My.Computer.Screen.Bounds.Size.Height - 324)))
End Sub
Private Sub Timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer.Tick
Timer.Interval = Generator.Next(2000, 5000)
SI = RefreshSpaceInvader(Drawing.Color.Black)
MainForm.Hide()
MainForm.Show()
End Sub
End Class
Si vous voulez l'utiliser, mettez vous en Windows Forms, supprimer la votre et ajoutez une classe, vous copiez le code, et voilà
Bonjour, voici ma version de la chose en camllight en essayant au mieux de faire le plus court possible. Par contre l'actualisation du graph necessite la fonction "unix__spleep" disponible comme son nom l'indique uniquement sur linux.
Voilà les environs 490 caractères sans les commentaires évidemment:
#open "graphics";;
open_graph "";; (*on affiche un graphique de taille standard*)
while 0=0 do (*boucle infinie et true comporte une lettre de plus que 0=0*)
let f a = a mod 256 and g a = random__int a (*définition de fonctions pour gagner des caractères*)
and t=[|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|] in (*le tableau comportant l'invader*)
let x,y,z = (g 480),(g 310),g 256 in (*3 entiers aléatoires pour la couleur et les coordonéées*)
t.(16+(x mod 2)*7)<-1;t.(18+(z mod 2)*7)<-1; (*on place les yeux aléatoirement suivant la parité de x et z*)
for k=0 to 41 do
if k=16 or k=18 or k=23 or k=25 then set_color black (*la couleur noire pour les yeux*)
else set_color(rgb (f z) (f x) (f y)); (*pour le reste la couleur aléatoire*)
if t.(k)=1 then fill_rect (x+20*(k mod 7)) (y+120-20*(k/7)) 18 18 (*on place un carré là où j'ai dit grâce à t*)
done;
unix__sleep 2;clear_graph(); (*puis on admire 2 sec et on efface pour recommencer*)
done;;
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 27 avril 2013 à 12:51:39
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles- ♡ Copying is an act of love.
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 ...
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...
Par contre au niveau taille du code, je m'en sors honorablement avec 183 octets
v4vx a écrit:
Totalisant en tout 214 octets ! (Hé oui, les fonction en Ti-BASIC sont du Byte-Code ) (Si quelqu'un arrive à faire moins lourd, je dis chapeau )
Tu pourras dire chapeau à Eskimon .
Lui je lui tire mon chapeau plus pour le BF, mais malheureusement (limite du BF), par de random :x
Merci mais oui pour mon code BF je suis hors sujet, c'était juste pour la performance , mais comme dit plus haut, les limites du BF m’empêche de faire une vrai animation (et du coup si c'était possible je n'aurais jamais fait si peu d'octets).
Après mon Invader en Java, nouvelle contribution plus originale de ma part, en Axe.
C'est un langage compilé pour Ti-83+/84+ (et SE) (il faut avoir une mémoire Flash pour exécuter le compilateur Axe). Le langage est donc beaucoup plus rapide que le Ti-Basic, tout en restant plus lisible que l'ASM. Cependant, il est assez bas niveau, il est fréquent de gérer soi-même la mémoire, et travailler avec de l'hexadécimal et du binaire.
J'affiche donc un Invader en 14*12. A chaque changement de position, je fais une rapide animation de 20 frames qui le fait apparaître n'importe où sur l'écran (voir photo et GIF en bas du code). Les yeux sont affichés en nuance de gris.
Bref, voilà le code (qui serait encore moins lisible que ça si j'avais cherché à optimiser) :
× 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 !
Je ne visite plus ce site, si ça vous intéresse (ce qui serait très curieux), lisez ma bio.
Retrouvez moi sur mon blog et ma chaine Youtube !