Créer un mini-jeu de profil utilisateur


49

Hier, je suis tombé sur une chose très intelligente.

Jeu de profil tic-tac-toe de minitech

Oui, c'est une implémentation fonctionnelle de Tic-Tac-Toe sur une page de profil d'utilisateur, à partir de @minitech. Bien sûr, le moment je l' ai vu, je devais de désosser son idée et un point sur lui : P

Les tours de mellamokb du jeu de profil de hanoi

Voici mon propre exemple intégré directement dans le post. C'est un peu bogué à cause de quelques détails d'implémentation pour lesquels je n'ai pas trouvé de bonne solution. Parfois, après avoir cliqué sur une cheville, celle-ci ne se met pas correctement à jour tant que la page n'est pas rafraîchie:

Tours de Hanoi

http://hanoi.kurtbachtold.com/hanoi.php/text

http://hanoi.kurtbachtold.com/hanoi.php/1 http://hanoi.kurtbachtold.com/hanoi.php/2 http://hanoi.kurtbachtold.com/hanoi.php/3

Réinitialiser

Pouvez-vous faire mieux?

  • Créez un jeu de travail dans votre réponse (ou votre page de profil utilisateur). Cela se fait en configurant de manière appropriée un serveur Web que vous possédez (ou en écrivant un programme qui agit en tant que serveur Web), et en incorporant le contenu de celui-ci dans un message, en utilisant le référant pour déterminer les commandes que l'utilisateur donne au jeu.
  • L'idée la plus cool (le plus grand nombre de votes) remporte le concours d'ici la fête du Canada (le dimanche 1er juillet 2012 à 23h59 HNE)
  • En cas d'égalité, la réponse la plus ancienne l'emporte.

1
+1 Simple, mais brillante idée! BTW - pour la date limite, je pense que vous voulez dire le 2 juin 2012.
Cristian Lupascu

Derp, oui, merci :)
mellamokb

1
@ Boothby: Je pensais réellement à supprimer ma réponse. L'intention était de fournir un exemple concret, de ne pas gagner le concours (ou les votes, je ne me soucie pas beaucoup du représentant). Pouvez-vous fournir des suggestions constructives au concours? Que voudriez-vous que la date limite soit? Comment les spécifications devraient-elles être modifiées pour vous motiver à participer?
Mellamokb

4
Je viens de remarquer que l'IA de Minitech ne peut pas jouer un jeu parfait de tic-tac-toe. Jouez au centre, en bas à gauche, en haut au centre, au centre à droite, au centre à gauche.
PhiNotPi

1
@ Mr.Wizard: fonctionne bien sur FF 12.0 et Windows 7 ici, pourriez-vous donner plus de détails sur ce qui ne fonctionne pas?
ChristopheD

Réponses:


27

Le jeu de la vie de Conway

+1 génération - +5 générations - zoom avant - zoom arrière

Répartition de la charge: aléatoire - planeur - gunstar - escargot - lwss - lightspeedoscillator1 - tumbler

Utiliser les sorties Python et SVG. J'ai d'abord essayé d'utiliser des pixels simples (pour pouvoir basculer d'une cellule à l'autre), mais cela n'a pas fonctionné, car le navigateur ne charge pas les images dans l'ordre. En outre, des modèles beaucoup plus gros sont possibles comme ceci sans planter mon serveur Web.

Mise à jour:

Je me suis bien amusé avec Python et j'ai ajouté plusieurs fonctionnalités et améliorations:

  • HUD ajouté avec nombre de population, zoom et nom
  • Les modèles au format RLE peuvent maintenant être chargés ( liste longue , via ) à l'aide du patternparamètre (par exemple ?pattern=glider). La taille du fichier est limitée à 1.5ko
  • Peut transmettre n générations, limitées à 5 à la fois, en utilisant le nextparamètre
  • Algorithme légèrement amélioré. Ce n'est pas très rapide, je veux que ça reste simple
  • Il fonctionne aussi maintenant de manière autonome (utilise soit le référant, soit sa propre chaîne de requête): https://copy.sh/fcgi-bin/life2.py?pattern=gosperglidergun


sessions = {}

WIDTH = 130
HEIGHT = 130
RULE = (3,), (2, 3)

def read_pattern(filename, offset_x, offset_y):

    filename = PATH + filename + '.rle.gz'

    try:
        if os.stat(filename).st_size > 1500:
            return ['pattern too big', set()]
    except OSError as e:
        return ['could not find pattern', set()]

    file = gzip.open(filename)

    x, y = offset_x, offset_y
    name = ''
    pattern_string = ''
    field = []

    for line in file:
        if line[0:2] == '#N':
            name = line[2:-1]
        elif line[0] != '#' and line[0] != 'x':
            pattern_string += line[:-1]

    for count, chr in re.findall('(\d*)(b|o|\$|!)', pattern_string):
        count = int(count) if count else 1

        if chr == 'o':
            for i in range(x, x + count):
                field.append( (i, y) )
            x += count
        elif chr == 'b':
            x += count
        elif chr == '$':
            y += count
            x = offset_x
        elif chr == '!':
            break

    file.close()

    return [name, set(field)]



def next_generation(field, n):

    for _ in range(n):

        map = {}

        for (x, y) in field:
            for (i, j) in ( (x-1, y-1), (x, y-1), (x+1, y-1), (x-1, y), (x+1, y), (x-1, y+1), (x, y+1), (x+1, y+1) ):
                map[i, j] = map[i, j] + 1 if (i, j) in map else 1

        field = [
            (x, y)
            for x in range(0, WIDTH)
            for y in range(0, HEIGHT)
            if (x, y) in map
            if ( (map[x, y] in RULE[1]) if (x, y) in field else (map[x, y] in RULE[0]) )
        ]

    return field


def life(env, start):


    if 'REMOTE_ADDR' in env:
        client_ip = env['REMOTE_ADDR']
    else:
        client_ip = '0'

    if not client_ip in sessions:
        sessions[client_ip] = read_pattern('trueperiod22gun', 10, 10) + [2]

    session = sessions[client_ip]

    if 'HTTP_REFERER' in env:
        query = urlparse.parse_qs(urlparse.urlparse(env['HTTP_REFERER']).query, True)
    elif 'QUERY_STRING' in env:
        query = urlparse.parse_qs(env['QUERY_STRING'], True)
    else:
        query = None

    timing = time.time()

    if query:
        if 'next' in query:
            try:
                count = min(5, int(query['next'][0]))
            except ValueError as e:
                count = 1
            session[1] = set( next_generation(session[1], count) )
        elif 'random' in query:
            session[0:2] = 'random', set([ (random.randint(0, WIDTH), random.randint(0, HEIGHT)) for _ in range(800) ])
        elif 'pattern' in query:
            filename = query['pattern'][0]
            if filename.isalnum():
                session[0:2] = read_pattern(filename, 10, 10)
        elif 'zoomin' in query:
            session[2] += 1
        elif 'zoomout' in query and session[2] > 1:
            session[2] -= 1

    timing = time.time() - timing

    start('200 Here you go', [
        ('Content-Type', 'image/svg+xml'), 
        ('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'), 
        ('Expires', 'Tue, 01 Jan 2000 12:12:12 GMT')
    ])

    pattern_name, field, zoom = session

    yield '<?xml version="1.0" encoding="UTF-8"?>'
    yield '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'
    yield '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" baseProfile="full" width="400px" height="200px">'
    yield '<!-- finished in %f -->' % timing
    yield '<text x="0" y="10" style="font-size:10px">Population: %d</text>' % len(field)
    yield '<text x="100" y="10" style="font-size:10px">Zoom: %d</text>' % zoom
    yield '<text x="180" y="10" style="font-size:10px; font-weight:700">%s</text>' % pattern_name
    yield '<line x1="0" y1="15" x2="666" y2="15" style="stroke:#000; stroke-width:1px" />'

    for (x, y) in field:
        yield '<rect x="%d" y="%d" width="%d" height="%d"/>' % (zoom * x, zoom * y + 20, zoom, zoom)

    yield '</svg>'


from flup.server.fcgi import WSGIServer
import random
import re
import gzip
import os
import urlparse
import time

WSGIServer(life).run()

Vous pouvez utiliser mon code comme modèle pour d’autres soumissions python fastcgi.


+1 génial! Une suggestion: ajouter #5946à vos liens, et il reviendra à votre message après chaque mise à jour.
Mellamokb

hmm .. au moins cela a fonctionné quand je l'ai essayé .. ah. parce que dans Tours de Hanoi, vous cliquez toujours sur des piquets différents. hmm
mellamokb

@mellamokb ça marche, mais vous ne pouvez pas cliquer deux fois sur le même lien
copiez

Oui, je viens de me rendre compte que lol. Je suppose que vous pouvez indiquer que, lors de la génération suivante, il suffit d'appuyer sur F5 pour les itérations futures au lieu de cliquer sur le nextlien encore et encore après la première fois.
Mellamokb

1
@ melamokb merci. À mon avis, vous n'avez pas vraiment besoin d'accepter les réponses sur cette plate-forme, car il semble que le défi soit clos
copie

35

C # - Pendu Exchange Stack

Devinez les noms des sites Web Stack Exchange dans ce jeu Hangman:



A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
New game


Cela a été fait en utilisant ASP.NET MVC 3.0 . Voici le code de la Controllerqui fait le tour:

public class HangmanController : Controller
{
    public ActionResult Index()
    {
        var game = Session["hangman"] as HangmanGame ?? HangmanGame.New();

        game = ExecuteGameCommand(game);

        Session["hangman"] = game;

        var imageRenderer = new HangmanImageRenderer(game);
        return new ImageResult(imageRenderer.Render());
    }

    private HangmanGame ExecuteGameCommand(HangmanGame game)
    {
        var referrerQuery = Request.UrlReferrer != null ? Request.UrlReferrer.Query : string.Empty;

        if (referrerQuery.Contains("_new_hangman_"))
            return HangmanGame.New();

        if(game.IsOver())
            return game;

        var chosenLetter = HangmanGame.ValidLetters
            .FirstOrDefault(letter => referrerQuery.Contains(String.Format("_hangman_{0}_", letter)));

        if (chosenLetter != default(char))
            game.RegisterGuess(chosenLetter);

        return game;
    }
}

Outre ce code, il y a trois autres classes que je n'ai pas incluses car elles sont assez longues et simples:

  • HangmanGame - voici où les règles commerciales du jeu sont mises en œuvre
  • HangmanImageRenderer - la classe qui englobe toute la laideur de GDI
  • ImageResult- une coutume ActionResultutilisée pour renvoyer une image générée dynamiquement

La liste complète du code est disponible à l' adresse http://pastebin.com/ccwZLknX


+1 Wow, vous êtes géniaux :). J'aime les idées jusqu'à présent!
Mellamokb

Cool, jamais entendu parler de appharbor.com. Payez-vous vraiment pour héberger votre réponse?
mellamokb

@mellamokb non, j'utilise le plan d'hébergement gratuit d'Appharbor. Si cela clique beaucoup, je suppose que je devrai payer cependant ... :)
Cristian Lupascu

2
J'allais mentionner que si nécessaire, je peux fournir un hébergement de sous-domaine personnalisé et un accès FTP à mon site d'hébergement.
mellamokb

@mellamokb merci, mais je pense que cet hébergement fera l'affaire. Je plaisantais à propos de nombreux clics. :)
Cristian Lupascu

19

Clojoban! [WIP]

Je voulais faire un plus gros jeu de ça pour apprendre Clojure , alors ça a pris un certain temps pour réussir (et je suis devenu assez gros.) Je me suis beaucoup amusé à le faire, d'ailleurs!

Clojoban! Restart levelNew game

. .

- No-op*

. .

** (cliquez ici si le jeu ne répond plus) *

Instructions

Vous êtes Robby Robby, un robot qui travaille dur. Vous travaillez chez un FlipCo Industriestransporteur de charges lourdes. Votre travail consiste à amener chacun box Une boîteà goal Un butdépenser le moins possible. FlipCoLes installations de sont dangereuses . Il y a beaucoup de défis et d'endroits spéciaux à découvrir.

Si vous êtes bloqué, cliquez sur Restart level(mais votre nombre de pas ne sera pas réinitialisé!)


Vous pouvez également jouer en première page de Clojoban (bien que cela gâche le but du défi.) Il corrige le problème d'ancre infâme, ne nécessite pas de cookies intersites et vous pouvez jouer avec les touches de direction de votre clavier! Vous pouvez également jouer sur ma page de profil utilisateur sans le problème d'ancrage gênant.

Dans Firefox, l'image ne clignote pas pendant le chargement, ce qui rend le jeu un peu plus confortable.

Ce jeu est loin d'être terminé, Clojoban est toujours un travail en cours . Vous pouvez voir le code source complet sur la page du projet GitHub de Clojoban . Le README contient des informations sur la contribution . J'ai besoin de niveaux aussi! Voir le format de niveau aux niveaux d'exemple . Vous pouvez jeter un coup d'œil au traqueur de problèmes de Clojoban et voir ce qui s'en vient!


Maintenant, votre réputation est de 11 :)
mellamokb Le

@mellamokb merci! Le jeu est intégré maintenant :)
Álvaro Cuesta

Apparemment, cela n'a pas attiré beaucoup d'attention. Des conseils pour améliorer?
Álvaro Cuesta le

Votre réponse est bonne, je pense que cette question a globalement stagné. Je n'ai pas vu beaucoup d'activités ni de votes au cours des derniers jours.
Mellamokb

C'est un super jeu! Je pense que vous devriez faire une version autonome; Je suis arrivé au troisième niveau et je me suis débarrassé d'appuyer sur le bouton No-op. :) En tout cas, excellent travail!
Cristian Lupascu

17

Labyrinthe

http://phpshizzle.t15.org/sogolf_maze/maze.php -
New Noop button

J'ai commencé avec le générateur de labyrinthe PHP que j'ai trouvé ici: http://dev.horemag.net/2008/03/01/php-maze-generation-class/ .

EDIT : modification de la sortie en PNG au lieu de SVG (pour une meilleure compatibilité entre navigateurs).

EDIT 2: ajout d'un en-tête pour la fixation de la compatibilité des cookies IE. Devrait maintenant fonctionner correctement dans tous les principaux navigateurs.

L'image ne s'actualise pas si vous prenez deux fois la même direction (en raison des liens d'ancrage). Appuyez sur F5 une deuxième fois ou jouez le labyrinthe sur mon profil stackoverflow .

EDIT 3: Ajout d’un bouton no-op pour pouvoir facilement prendre deux fois la même direction (voir commentaires ci-dessous).

<?php
// based upon the maze generator by Evgeni Vasilev (PHP Adaptation)
// see http://dev.horemag.net/2008/03/01/php-maze-generation-class/
class Maze
{
  var $maze = array();
  var $mx = 0;
  var $my = 0;
  var $xplayer = 1;
  var $yplayer = 1;

  function Maze($mx, $my)
  {
    $mx +=2;
    $my +=2;
    $this->mx = $mx;
    $this->my = $my;
    $dx = array( 0, 0, -1, 1 );
    $dy = array( -1, 1, 0, 0 );
    $todo = array(); 
    $todonum = 0;

    for ($x = 0; $x < $mx; ++$x){
      for ($y = 0; $y < $my; ++$y){
        if ($x == 0 || $x == $mx-1 || $y == 0 || $y == $my-1) {
          $this->maze[$x][$y] = 32;
        } else {
          $this->maze[$x][$y] = 63;
        }
      }
    }
    $x = rand(1, $mx-2); $y = rand(1, $my-2);
    $x = 1; $y = 1;
    $this->maze[$x][$y] &= ~48;
    for ($d = 0; $d < 4; ++$d){
      if (($this->maze[$x + $dx[$d]][$y + $dy[$d]] & 16) != 0) {
        $todo[$todonum++] = (($x + $dx[$d]) << 16) | ($y + $dy[$d]);
        $this->maze[$x + $dx[$d]][$y + $dy[$d]] &= ~16;
      }
    }

    while ($todonum > 0) {
      $n = rand(0, $todonum-1);
      $x = $todo[$n] >> 16;
      $y = $todo[$n] & 65535;
      $todo[$n] = $todo[--$todonum];
      do {
        $d = rand(0, 3);
      } while (($this->maze[$x + $dx[$d]][$y + $dy[$d]] & 32) != 0);
      $this->maze[$x][$y] &= ~((1 << $d) | 32);
      $this->maze[$x + $dx[$d]][$y + $dy[$d]] &= ~(1 << ($d ^ 1));
      for ($d = 0; $d < 4; ++$d){
        if (($this->maze[$x + $dx[$d]][$y + $dy[$d]] & 16) != 0) {
          $todo[$todonum++] = (($x + $dx[$d]) << 16) | ($y + $dy[$d]);
          $this->maze[$x + $dx[$d]][$y + $dy[$d]] &= ~16;
        }
      }
    }
    $this->maze[1][1] &= ~1;
    $this->maze[$mx-2][$my-2] &= ~2;
  }

  function _drawLine($img,$color, $x1, $y1, $x2, $y2)
  {
    imageline($img, $x1, $y1, $x2, $y2, $color);
  }

  function _drawPlayer($img, $x, $y, $r, $colorborder, $colorfill)
  {
    imagefilledellipse($img, $x, $y, $r, $r, $colorfill);
    imageellipse($img, $x, $y, $r, $r, $colorborder);
  }

  function _drawWin($img, $color)
  {
    imagestring($img, 5, 170, 90, "YOU WIN!", $color);
  }

  function movePlayerDown()
  {
    if ($this->yplayer+1 < $this->my-1 && ($this->maze[$this->xplayer][$this->yplayer] & 2) == 0)
    $this->yplayer++;
  }

  function movePlayerUp()
  {
    if ($this->yplayer-1 > 0 && ($this->maze[$this->xplayer][$this->yplayer] & 1) == 0)
      $this->yplayer--;
  }

  function movePlayerRight()
  {
    if ($this->xplayer+1 < $this->mx-1 && ($this->maze[$this->xplayer][$this->yplayer] & 8) == 0)
      $this->xplayer++;
  }  

  function movePlayerLeft()
  {
    if ($this->xplayer-1 > 0 && ($this->maze[$this->xplayer][$this->yplayer] & 4) == 0)
      $this->xplayer--;
  }  

  function renderImage($xs, $ys)
  {
    $off = 0;
    $w = ($this->mx*$xs)+($off*2); $h = ($this->my*$ys)+($off*2);
    $img = imagecreatetruecolor($w, $h);
    imagesetthickness($img, 2);
    $fg = imagecolorallocate($img, 0, 0, 0);
    $bg = imagecolorallocate($img, 248, 248, 248);
    $red = imagecolorallocate($img, 255, 0, 0);
    imagefill($img, 0, 0, $bg);
    if (($this->xplayer == $this->mx-2) && ($this->yplayer == $this->my-2)) {
      $this->_drawWin($img, $red);
      return $img;
    }

    for ($y = 1; $y < $this->my-1; ++$y) {
      for ($x = 1; $x < $this->mx-1; ++$x){
        if (($this->maze[$x][$y] & 1) != 0)
          $this->_drawLine ($img, $fg, $x * $xs + $off, $y * $ys + $off, $x * $xs + $xs + $off, $y * $ys + $off);
        if (($this->maze[$x][$y] & 2) != 0)
          $this->_drawLine ($img, $fg, $x * $xs + $off, $y * $ys + $ys + $off, $x * $xs + $xs + $off, $y * $ys + $ys + $off);
        if (($this->maze[$x][$y] & 4) != 0)
          $this->_drawLine ($img, $fg, $x * $xs + $off, $y * $ys + $off, $x * $xs + $off, $y * $ys + $ys + $off);
        if (($this->maze[$x][$y] & 8) != 0)
          $this->_drawLine ($img, $fg, $x * $xs + $xs + $off, $y * $ys + $off, $x * $xs + $xs + $off, $y * $ys + $ys + $off);
        if ($x == $this->xplayer && $y == $this->yplayer) {
          $this->_drawPlayer ($img, $x * $xs + ($xs/2), $y * $ys + ($ys/2), 14, $fg, $red);
        }
      }
    }
    return $img;
  }
}
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
session_start();
$orig_url = $_SERVER['HTTP_REFERER'];
if (!isset($_SESSION['maze']) || strpos($orig_url, 'resetmaze')){
    $_SESSION['maze'] = new Maze(25,10);
}
$maze = $_SESSION['maze'];
if (strpos($orig_url, 'playerdown')) { $maze->movePlayerDown(); }
if (strpos($orig_url, 'playerup')) { $maze->movePlayerUp(); }
if (strpos($orig_url, 'playerright')) { $maze->movePlayerRight(); }
if (strpos($orig_url, 'playerleft')) { $maze->movePlayerLeft(); }
$img = $maze->renderImage(16,16);
header("Content-Type: image/png");
imagepng($img);
imagedestroy($img);
?>

1
+1 Nice! pour une meilleure expérience, ajoutez #answer-6171à la fin de vos liens. Sinon, personne n'aura assez de patience pour résoudre le labyrinthe.
Cristian Lupascu

@ W0lf: Merci. J'ai pensé à inclure les #liens, mais le problème est qu'ils ne rafraîchissent pas la page lorsque vous prenez deux fois la même direction (ce qui peut se produire dans un labyrinthe ;-). Je les ai ajoutées maintenant pour que les gens doivent appuyer sur F5 la deuxième fois qu'ils veulent suivre la même direction. Une autre option est de jouer ici (mon profil SO: stackoverflow.com/users/81179/christophed )
ChristopheD

Je souhaiterais un simple lien sans opération (rafraîchir?) Pour faciliter la mise à jour lorsque vous essayez de vous déplacer deux fois dans la même direction :)
kaoD

@kaoD: Sans les pièces d'ancrage ( #) qui sautent à la bonne réponse à la question (en interne, sans rafraîchissement de page), un simple rafraîchissement de page fonctionnerait correctement (comme vous pouvez le voir sur mon profil lié où le même labyrinthe est également disponible) . Mais le problème serait que vous vous retrouviez en haut de la page après chaque actualisation. Le vrai problème, c'est que nous ne pouvons vraiment pas inclure de réponse dans StackOverflow (pour une bonne raison, bien sûr), nous ne pouvons pas utiliser de code Javascript arbitraire par exemple. Je n'ai aucune idée de solution de facilité.
ChristopheD

Vous pouvez toujours avoir l’ancre et elle ira directement à votre message, mais avec une URL différente (ce qui permettra un gameplay correct). Je trouve la méthode F5 peu pratique.
kaoD

14

Jeu d'échecs Pokémon à 2 joueurs [Travaux en cours]

Parce que c'est plus amusant de cette façon. À venir un jour: IA, grille isométrique et ombres!

http://minite.ch/chess/?i=1 http://minite.ch/chess/?i=2 http://minite.ch/chess/?i=3 http://minite.ch/ échecs /? i = 4 http://minite.ch/chess/?i=5 http://minite.ch/chess/?i=6 http://minite.ch/chess/?i=7 http: //minite.ch/chess/?i=8 
http://minite.ch/chess/?i=9 http://minite.ch/chess/?i=10 http://minite.ch/chess/ ? i = 11 http://minite.ch/chess/?i=12 http://minite.ch/chess/?i=13 http://minite.ch/chess/?i=14 http: // minite.ch/chess/?i=15 http://minite.ch/chess/?i=16 
http://minite.ch/chess/?i=17 http://minite.ch/chess/?i = 18 http://minite.ch/chess/?i=19 http://minite.ch/chess/?i=20 http://minite.ch/chess/?i=21http://minite.ch/chess/?i=22 http://minite.ch/chess/?i=23 http://minite.ch/chess/?i=24 
http://minite.ch/ échecs /? i = 25 http://minite.ch/chess/?i=26 http://minite.ch/chess/?i=27 http://minite.ch/chess/?i=28 http: //minite.ch/chess/?i=29 http://minite.ch/chess/?i=30 http://minite.ch/chess/?i=31 http://minite.ch/chess/ ? i = 32 
http://minite.ch/chess/?i=33 http://minite.ch/chess/?i=34 http://minite.ch/chess/?i=35 http: // minite.ch/chess/?i=36 http://minite.ch/chess/?i=37 http://minite.ch/chess/?i=38 http://minite.ch/chess/?i = 39 http://minite.ch/chess/?i=40 
http://minite.ch/chess/?i=41http://minite.ch/chess/?i=42 http://minite.ch/chess/?i=43 http://minite.ch/chess/?i=44 http://minite.ch/ chess /? i = 45 http://minite.ch/chess/?i=46 http://minite.ch/chess/?i=47 http://minite.ch/chess/?i=48 
http: //minite.ch/chess/?i=49 http://minite.ch/chess/?i=50 http://minite.ch/chess/?i=51 http://minite.ch/chess/ ? i = 52 http://minite.ch/chess/?i=53 http://minite.ch/chess/?i=54 http://minite.ch/chess/?i=55 http: // minite.ch/chess/?i=56 
http://minite.ch/chess/?i=57 http://minite.ch/chess/?i=58 http://minite.ch/chess/?i = 59 http://minite.ch/chess/?i=60 http://minite.ch/chess/?i=61http://minite.ch/chess/?i=62 http://minite.ch/chess/?i=63 http://minite.ch/chess/?i=64

Non en passant ou en roque, désolé. Détection de checkmate / check / impasse à mettre en œuvre. Sprites à partir d'ici: http://floatzel.net/pokemon/black-white/sprites/

Voici la source:

<?php
session_start();

function kick() {
    header("Status: Forbidden\r\n", true, 403);
    header("Content-Type: text/plain\r\n");
    die('Go away.');
}

function isEnemy($item) {
    return $item !== -1 && $item & 8;
}

function iValidMoves($board, $type, $x, $y) {
    $results = array();

    switch($type) {
        case 0:
            # Pawn
            if($board[$y - 1][$x] === -1) {
                $results[] = array($x, $y - 1);

                if($y == 6 && $board[$y - 2][$x] === -1) $results[] = array($x, $y - 2);
            }

            if($x > 0 && isEnemy($board[$y - 1][$x - 1])) $results[] = array($x - 1, $y - 1);
            if($x < 7 && isEnemy($board[$y - 1][$x + 1])) $results[] = array($x + 1, $y - 1);

            break;
        case 1:
            # King
            if($x > 0 && $board[$y][$x - 1] & 8) $results[] = array($x - 1, $y);
            if($x > 0 && $y > 0 && $board[$y - 1][$x - 1] & 8) $results[] = array($x - 1, $y - 1);
            if($x > 0 && $y < 7 && $board[$y + 1][$x - 1] & 8) $results[] = array($x - 1, $y + 1);
            if($x < 7 && $board[$y][$x + 1] & 8) $results[] = array($x + 1, $y);
            if($x < 7 && $y > 0 && $board[$y - 1][$x + 1] & 8) $results[] = array($x + 1, $y - 1);
            if($x < 7 && $y < 7 && $board[$y + 1][$x + 1] & 8) $results[] = array($x + 1, $y + 1);
            if($y > 0 && $board[$y - 1][$x] & 8) $results[] = array($x, $y - 1);
            if($y < 7 && $board[$y + 1][$x] & 8) $results[] = array($x, $y + 1);

            break;
        case 2:
            # Queen
            # Downwards diagonal
            for($d = 1; $x + $d < 8 && $y + $d < 8; $d++) {
                if($board[$y + $d][$x + $d] & 8) {
                    $results[] = array($x + $d, $y + $d);

                    if($board[$y + $d][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            for($d = -1; $x + $d >= 0 && $y + $d >= 0; $d--) {
                if($board[$y + $d][$x + $d] & 8) {
                    $results[] = array($x + $d, $y + $d);

                    if($board[$y + $d][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            # Upwards diagonal
            for($d = 1; $x + $d < 8 && $y - $d >= 0; $d++) {
                if($board[$y - $d][$x + $d] & 8) {
                    $results[] = array($x + $d, $y - $d);

                    if($board[$y - $d][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            for($d = -1; $x + $d >= 0 && $y - $d < 8; $d--) {
                if($board[$y - $d][$x + $d] & 8) {
                    $results[] = array($x + $d, $y - $d);

                    if($board[$y - $d][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            # Horizontal
            for($d = 1; $x + $d < 8; $d++) {
                if($board[$y][$x + $d] & 8) {
                    $results[] = array($x + $d, $y);

                    if($board[$y][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            for($d = -1; $x + $d >= 0; $d--) {
                if($board[$y][$x + $d] & 8) {
                    $results[] = array($x + $d, $y);

                    if($board[$y][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            # Vertical
            for($d = 1; $y + $d < 8; $d++) {
                if($board[$y + $d][$x] & 8) {
                    $results[] = array($x, $y + $d);

                    if($board[$y + $d][$x] !== -1) break;
                } else {
                    break;
                }
            }

            for($d = -1; $y + $d >= 0; $d--) {
                if($board[$y + $d][$x] & 8) {
                    $results[] = array($x, $y + $d);

                    if($board[$y + $d][$x] !== -1) break;
                } else {
                    break;
                }
            }

            break;
        case 3:
            # Bishop
            # Downwards diagonal
            for($d = 1; $x + $d < 8 && $y + $d < 8; $d++) {
                if($board[$y + $d][$x + $d] & 8) {
                    $results[] = array($x + $d, $y + $d);

                    if($board[$y + $d][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            for($d = -1; $x + $d >= 0 && $y + $d >= 0; $d--) {
                if($board[$y + $d][$x + $d] & 8) {
                    $results[] = array($x + $d, $y + $d);

                    if($board[$y + $d][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            # Upwards diagonal
            for($d = 1; $x + $d < 8 && $y - $d >= 0; $d++) {
                if($board[$y - $d][$x + $d] & 8) {
                    $results[] = array($x + $d, $y - $d);

                    if($board[$y - $d][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            for($d = -1; $x + $d >= 0 && $y - $d < 8; $d--) {
                if($board[$y - $d][$x + $d] & 8) {
                    $results[] = array($x + $d, $y - $d);

                    if($board[$y - $d][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            break;
        case 4:
            # Knight
            if($x > 1 && $y > 0 && $board[$y - 1][$x - 2] & 8) $results[] = array($x - 2, $y - 1);
            if($x > 0 && $y > 1 && $board[$y - 2][$x - 1] & 8) $results[] = array($x - 1, $y - 2);
            if($x < 7 && $y > 1 && $board[$y - 2][$x + 1] & 8) $results[] = array($x + 1, $y - 2);
            if($x < 6 && $y > 0 && $board[$y - 1][$x + 2] & 8) $results[] = array($x + 2, $y - 1);
            if($x < 6 && $y < 7 && $board[$y + 1][$x + 2] & 8) $results[] = array($x + 2, $y + 1);
            if($x < 7 && $y < 6 && $board[$y + 2][$x + 1] & 8) $results[] = array($x + 1, $y + 2);
            if($x > 0 && $y < 6 && $board[$y + 2][$x - 1] & 8) $results[] = array($x - 1, $y + 2);
            if($x > 1 && $y < 7 && $board[$y + 1][$x - 2] & 8) $results[] = array($x - 2, $y + 1);

            break;
        case 5:
            # Rook
            # Horizontal
            for($d = 1; $x + $d < 8; $d++) {
                if($board[$y][$x + $d] & 8) {
                    $results[] = array($x + $d, $y);

                    if($board[$y][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            for($d = -1; $x + $d >= 0; $d--) {
                if($board[$y][$x + $d] & 8) {
                    $results[] = array($x + $d, $y);

                    if($board[$y][$x + $d] !== -1) break;
                } else {
                    break;
                }
            }

            # Vertical
            for($d = 1; $y + $d < 8; $d++) {
                if($board[$y + $d][$x] & 8) {
                    $results[] = array($x, $y + $d);

                    if($board[$y + $d][$x] !== -1) break;
                } else {
                    break;
                }
            }

            for($d = -1; $y + $d >= 0; $d--) {
                if($board[$y + $d][$x] & 8) {
                    $results[] = array($x, $y + $d);

                    if($board[$y + $d][$x] !== -1) break;
                } else {
                    break;
                }
            }

            break;
    }

    return $results;
}

function invertRelationship($piece) {
    return $piece === -1 ? -1 : $piece ^ 8;
}

function invertPosition($position) {
    return array($position[0], 7 - $position[1]);
}

function invertBoard($board) {
    $invertedBoard = array();

    for($i = 7; $i > -1; $i--) {
        $invertedBoard[] = array_map('invertRelationship', $board[$i]);
    }

    return $invertedBoard;
}

function validMoves($x, $y) {
    global $board;

    $type = $board[$y][$x];

    if($type & 8) {
        return array_map('invertPosition', iValidMoves(invertBoard($board), $type & ~8, $x, 7 - $y));
    } else {
        return iValidMoves($board, $type, $x, $y);
    }
}

function shouldHighlight($x, $y) {
    global $highlight;

    foreach($highlight as $position) {
        if($position[0] == $x && $position[1] == $y) {
            return true;
        }
    }

    return false;
}

if(isset($_SESSION['board'])) {
    $board = $_SESSION['board'];
} else {
    $board = array(
        array(5 | 8, 4 | 8, 3 | 8, 1 | 8, 2 | 8, 3 | 8, 4 | 8, 5 | 8),
        array(0 | 8, 0 | 8, 0 | 8, 0 | 8, 0 | 8, 0 | 8, 0 | 8, 0 | 8),
        array(-1, -1, -1, -1, -1, -1, -1, -1),
        array(-1, -1, -1, -1, -1, -1, -1, -1),
        array(-1, -1, -1, -1, -1, -1, -1, -1),
        array(-1, -1, -1, -1, -1, -1, -1, -1),
        array(0, 0, 0, 0, 0, 0, 0, 0),
        array(5, 4, 3, 1, 2, 3, 4, 5)
    );
}

$back = array(
    imagecreatefrompng('back/16.png'),  # pawn
    imagecreatefrompng('back/6.png'),   # king
    imagecreatefrompng('back/149.png'), # queen
    imagecreatefrompng('back/37.png'),  # bishop
    imagecreatefrompng('back/25.png'),  # knight
    imagecreatefrompng('back/75.png')   # rook
);

$front = array(
    imagecreatefrompng('front/16.png'),     # pawn
    imagecreatefrompng('front/6.png'),      # king
    imagecreatefrompng('front/149.png'),    # queen
    imagecreatefrompng('front/37.png'),     # bishop
    imagecreatefrompng('front/25.png'),     # knight
    imagecreatefrompng('front/75.png')      # rook
);

$image = $_GET['i'];

if(ctype_digit($image)) {
    $image = (int)$image;
} else {
    kick();
}

if($image < 1 || $image > 64) {
    kick();
}

$highlight = array();

$referrer = $_SERVER['HTTP_REFERER'];
$action = null;

if(strpos($referrer, '?a=') > -1) {
    $action = substr($referrer, strpos($referrer, '?a=') + 3);
}

if($action !== null && $image === 1) { # Only do this once!
    if(!ctype_digit($action)) kick();
    $action = (int)$action;

    if($action < 1 || $action > 64) kick();

    $aX = ($action - 1) % 8;
    $aY = floor(($action - 1) / 8);

    if(isset($_SESSION['selected'])) {
        if($_SESSION['selected'] !== $action) {
            # Make sure the piece can actually move there.
            # If it can, move.
            # "Highlight" the places that the piece can move:
            $highlight = validMoves(($_SESSION['selected'] - 1) % 8, floor(($_SESSION['selected'] - 1) / 8));

            if(shouldHighlight($aX, $aY)) {
                # The move is good!
                $sX = ($_SESSION['selected'] - 1) % 8;
                $sY = floor(($_SESSION['selected'] - 1) / 8);
                $board[$aY][$aX] = $board[$sY][$sX];
                $board[$sY][$sX] = -1;

                # Now, rotate the board for the next person to play:
                $invertedBoard = invertBoard($board);
                $rotatedBoard = array();

                foreach($invertedBoard as $row) {
                    for($i = 0; $i < 4; $i++) {
                        $row[$i] ^= $row[7 - $i];
                        $row[7 - $i] ^= $row[$i];
                        $row[$i] ^= $row[7 - $i];
                    }

                    $rotatedBoard[] = $row;
                }

                $board = $rotatedBoard;
            }
        }

        unset($_SESSION['selected']);
    } elseif(($board[$aY][$aX] & 8) === 0) {
        # Select a piece:
        $_SESSION['selected'] = $action;
    }
}

if(isset($_SESSION['selected'])) {
    # Highlight the places that the piece can move:
    $highlight = validMoves(($_SESSION['selected'] - 1) % 8, floor(($_SESSION['selected'] - 1) / 8));
}

# Draw the background:
$background = imagecreatetruecolor(96, 96);
$black = imagecolorallocate($background, 0, 0, 0);
$white = imagecolorallocate($background, 255, 255, 255);
$red = imagecolorallocatealpha($background, 255, 0, 0, 100);

if(($image + floor(($image - 1) / 8)) % 2) {
    imagefilledrectangle($background, 0, 0, 96, 96, $black);
} else {
    imagefilledrectangle($background, 0, 0, 96, 96, $white);
}

# Draw a piece, if there is one:
$piece = $board[floor(($image - 1) / 8)][($image - 1) % 8];

if($piece > -1) {
    if($piece & 8) {
        $piece &= ~8;
        $draw = $front[$piece];
    } else {
        $draw = $back[$piece];
    }

    imagecopy($background, $draw, 0, 0, 0, 0, 96, 96);
}

# Should we highlight this place?
if(shouldHighlight(($image - 1) % 8, floor(($image - 1) / 8))) {
    imagefilledrectangle($background, 0, 0, 96, 96, $red);
}

header("Content-Type: image/png\r\n");

imagepng($background);

$_SESSION['board'] = $board;
?>

J'aime cela, mais les deux côtés devraient être différents Pokemon!
MrZander

Très agréable. J'aime que la table tourne à chaque changement de tour.
Cristian Lupascu le

1
Et en PHP, +1 pour les jeux PHP: p
Event_Horizon le

1
@hhh: Non, vous ajoutez des paramètres à la même page et générez la ou les images sur le serveur en vérifiant l'en- Referertête.
Ry-

5
:-(. Vos sprites sont morts.
Justin

10

"Simon dit" jeu

Malheureusement, je ne pouvais pas obtenir cette soumission dans les délais impartis à la date limite (quelque peu arbitraire), mais je voulais vraiment présenter une animation dans un jeu de profil utilisateur aussi, et aucune des soumissions précédentes n'est animée. Ce jeu est un clone du jeu classique de Milton Bradley, Simon , dans lequel le joueur tente de répéter une séquence de signaux de plus en plus longue.

Des informations sur ce jeu, y compris son code source, sont disponibles sur sa page GitHub . Il peut y avoir des problèmes graphiques occasionnels (en particulier sur les ordinateurs Windows) résultant de "l'animation de palette" hackish qui évite le besoin d'une bibliothèque de dessins graphiques. L’existence de ces problèmes peut servir d’excuse utile pour perdre rapidement ce jeu à cause d’une terrible mémoire.

En outre, les effets d'une latence élevée et d'une bande passante limitée peuvent rendre ce jeu beaucoup plus difficile que le jeu d'origine. Je pense que pour obtenir beaucoup plus que cinq points (lorsque le jeu s’accélère pour la première fois), vous devrez déterminer quelle lumière clignote une fois de plus que lors du tour précédent plutôt que de dépendre de la séquence correcte (ce qui est très difficile à obtenir). faire).

Si ce jeu ne fonctionne pas pour vous (il redémarre chaque fois que vous cliquez sur un bouton), il est possible que votre navigateur bloque son cookie. Je n'ai pas encore ajouté de solution de contournement. Pour le moment, utilisez Chrome, Opera ou Firefox, ou modifiez temporairement les paramètres de votre cookie Internet Explorer ou Safari.

Edit 2018-05-24: Pour l' instant, j'ai supprimé l'instance Heroku de cette application accessible au public. Je peux ou ne peux pas remettre l'application en ligne à une date ultérieure. Le code de l'application est toujours disponible sur GitHub, vous pouvez donc l'exécuter localement ou créer votre propre instance d'application Heroku si vous souhaitez jouer au jeu.


+1 C'est absolument génial! Jamais pensé à créer des gifs animés générés dynamiquement: P
mellamokb

2

Pierre papier ciseaux

Tous les liens vont à ma page de profil pour la vitesse.

Le jeu

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.