Kullanıcı Profili Oluştur Mini Oyunu


49

Dün çok zekice bir şeye rastladım.

Minitech'in Tic Tac Toe Profil oyunu

Evet, bu bir kullanıcı profili sayfasında Tic-Tac-Toe'nun çalışan bir uygulaması@minitech . Tabii ki, onu gördüğüm an , fikrini tersine çevirmek ve ona bir tane olmak zorunda kaldım : P

mellamokb hanoi profil oyun kuleleri

İşte doğrudan yazıya gömülü kendi örneğim. Bunun için iyi bir çözüm bulmadığım birkaç uygulama detayı nedeniyle biraz sorunlu. Bazen bir pimi tıkladıktan sonra, başka bir sayfa yenilenene kadar düzgün şekilde güncellenmez:

Hanoi Kuleleri

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

Sıfırla

Daha iyisini yapabilir misin

  • Gönderdiğiniz cevabınızda (veya kullanıcı profili sayfanızda) çalışan bir oyun oluşturun. Bu, sahip olduğunuz bir web sunucusunu (ya da web sunucusu olarak çalışan bir program yazarak) uygun şekilde yapılandırmak ve kullanıcının oyuna hangi komutları verdiğini belirlemek için başvurucuyu kullanarak bir yayına içerik yerleştirmek yoluyla yapılır.
  • En güzel fikir (en fazla oylama), Kanada Gününe göre (1 Temmuz 2012 Pazar günü 23:59 PM EST) rekabeti kazandı
  • Beraberlik durumunda, eski cevap kazanır.

1
+1 Basit ama parlak bir fikir! BTW - son tarih için 2 Haziran 2012 demek istediğinizi düşünüyorum .
Cristian Lupascu

Derp, evet yaptım, teşekkürler :)
mellamokb

1
@boothby: Aslında cevabımı silmeyi düşünüyordum. Amaç, yarışmayı kazanmak için değil (veya oylarla temsilci umrumda değil) somut bir örnek vermekti. Yarışmaya yapıcı önerilerde bulunabilir misiniz? Son teslim tarihinin ne olmasını istersiniz? Katılımınızı motive etmek için şartname nasıl değiştirilmeli?
mellamokb

4
Minitech'in AI'sının mükemmel bir tic-tac-toe oyunu oynayamayacağını fark ettim. Oyun merkezi, alt sol, üst orta, orta sağ, orta sol.
PhiNotPi

1
@ Mr.Wizard: FF 12.0 ve Windows 7'de iyi çalışıyor, neyin işe yaramadığı hakkında daha fazla ayrıntı yayınlayabilir misiniz?
ChristopheD

Yanıtlar:


27

Conway'in Yaşam Oyunu

+1 nesil - +5 nesil - yakınlaştırma - uzaklaştırma

Yük modeli: rastgele - planör - gunstar - salyangoz - lwss - lightspeedoscillator1 - bardak

Kullanılan Python ve SVG çıkışı. İlk önce tek pikselleri kullanmayı denedim (böylece tek hücrelere geçiş yapabiliyordunuz), ancak tarayıcı düzgün görüntü yüklenmediğinden işe yaramadı. Ayrıca, web sunucumu çökertmeden çok daha büyük kalıplar mümkündür.

Güncelleme:

Python ile biraz eğlendim ve çeşitli özellikler ve geliştirmeler ekledim:

  • Nüfus sayımı, yakınlaştırma ve ad içeren HUD eklendi
  • Rle biçiminde Grafikleri artık (yüklenebilir uzun bir liste , ile kullanılarak) patternbir parametre (örneğin ?pattern=glider). Dosya boyutu 1.5kB ile sınırlıdır
  • nextParametreyi kullanarak bir seferde 5 ile sınırlı n nesiller ileri alabilir
  • Biraz geliştirilmiş algoritma. Gerçekten hızlı değil ama bunun basit kalmasını istiyorum.
  • Ayrıca şimdi bağımsız çalışır (başvuru veya kendi sorgu dizesini kullanır): 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()

Kodumu daha fazla python fastcgi başvurusu için şablon olarak alabilirsiniz.


+1 Harika! Bir öneri: #5946bağlantılarınızı ekleyin ve her güncellemeden sonra yayınınıza geri dönecektir.
mellamokb

hmm .. en azından denediğimde işe yaradı .. ah. Çünkü Hanoi Kuleleri'nde daima farklı mandallara tıklıyorsunuzdur. hmm
mellamokb

@mellamokb çalışıyor, ancak aynı bağlantıyı şimdi iki kez tıklayamıyorsunuz
kopyalayın

Ya, az önce o lol'i farkettim. Yeni nesil yaparken next, ilk kez tekrar tekrar tekrar tıklamak yerine, gelecekteki yinelemeler için F5'e basmakla bir feragatname sağlayabileceğini tahmin ediyorum .
mellamokb

1
@ mellamokb teşekkürler. Bence bu platformdaki cevapları gerçekten kabul etmenize gerek yok, çünkü meydan okumanın kapalı olduğu anlaşılıyor
kopya

35

Yığın değişimi

Bu Hangman oyunda Stack Exchange web sitelerinin adlarını tahmin:



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


Bu ASP.NET MVC 3.0 kullanılarak yapıldı . İşte Controllerhile yapan kodu :

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;
    }
}

Bu kod dışında, oldukça uzun ve anlaşılır olduklarından dahil etmediğim üç sınıf daha var:

  • HangmanGame - burada oyun iş kurallarının uygulandığı yer
  • HangmanImageRenderer - tüm GDI çirkinliğini içine alan sınıf
  • ImageResult- ActionResultdinamik olarak oluşturulan bir görüntüyü döndürmek için kullanılan bir özel

Kod listesinin tamamına http://pastebin.com/ccwZLknX adresinden ulaşılabilir.


+1 Vay, siz harikasınız :). Şimdiye kadarki fikirler gibi!
mellamokb

Cool, appharbor.com 'u hiç duymadım. Gerçekten cevabını almak için para mı ödüyorsun?
mellamokb

@mellamokb hayır, Appharbor'un ücretsiz barındırma planını kullanıyorum. Eğer bu çok tıklanırsa sanırım ödemek zorunda kalacağım ... :)
Cristian Lupascu

2
Gerekirse, özel alt etki alanı barındırma ve barındırma siteme FTP erişimi sağlayabilirim.
mellamokb

@mellamokb teşekkürler, ama bu barındırma yapacağını düşünüyorum. Sadece birçok tıklama hakkında şaka yapıyordum. :)
Cristian Lupascu

19

Clojoban! [WIP]

Clojure'u öğrenmek için bundan daha büyük bir oyun yapmak istedim , bu yüzden biraz zaman aldı (ve oldukça büyüdü .) Bunu yaparken çok eğlendim, btw!

Clojoban! Restart levelNew game

. .

- No-op*

. .

** (oyun tepkisiz hale gelirse buraya tıklayın) *

Talimatlar

Sen çok Robbyçalışkan bir robot olan Robby'sin. Bir çalışmak FlipCo Industriesağır bir yük taşıyıcı olarak. İşiniz her box Bir kutubirini bir goal Bir golharcamaya mümkün olduğunca az adımda taşımak . FlipCo'nin tesisleri TEHLİKELİDİR . Keşfedilecek çok fazla zorluk ve özel yer var.

Sıkışırsanız, tıklayın Restart level(ancak adım sayınız sıfırlanmayacak!)


Ayrıca, Clojoban'ın ön sayfasında da oynayabilirsiniz ( zorluğun amacını bozsa da .) Ünlü çapa problemini düzeltir, siteler arası çerezler gerektirmez ve klavyenin yön tuşlarıyla oynayabilirsiniz! Ayrıca can sıkıcı çapa problemi olmadan kullanıcı profil sayfamda oynayabilirsiniz .

Firefox'ta görüntü yüklenirken titremiyor, bu yüzden oynatılması biraz daha rahat.

Bu oyun tamamlandığında FAR, Clojoban hala devam eden bir çalışmadır . Kaynak kodun tamamını Clojoban'ın GitHub proje sayfasında görebilirsiniz . README'de katkıda bulunma konusunda bazı bilgiler var . Benim de seviyeye ihtiyacım var! Örnek seviyelerde seviye formatına bakınız . Clojoban'ın sorun izleyicisine göz atabilir ve sırada ne olacağını görebilirsin!


Şimdi itibarınız 11 :)
mellamokb

@ mellamokb teşekkürler! Oyun şimdi gömülü oldu :)
Álvaro Cuesta

Görünüşe göre bu fazla dikkat çekmedi. Geliştirmek için herhangi bir ipucu?
Álvaro Cuesta

Cevabınız iyi, genel olarak bu sorunun durgun olduğunu düşünüyorum. Son birkaç gündür çok fazla aktivite veya oy görmedim.
mellamokb

Bu harika bir oyun! Bence bağımsız bir sürüm yapmalısın; Üçüncü seviyeye ulaştım ve No-op düğmesine basmaktan kurtuldum. :) Her neyse, harika iş!
Cristian Lupascu

17

Labirent

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

Burada bulduğum PHP labirent jeneratöründen başladım: http://dev.horemag.net/2008/03/01/php-maze-generation-class/ .

EDIT : çıktıyı SVG yerine PNG olarak değiştirdi (daha iyi tarayıcılar arası uyumluluk için).

2 EDIT: IE çerez uyumluluğunu düzeltmek için bir başlık ekledi. Şimdi tüm büyük tarayıcılarda doğru çalışması gerekir.

Aynı yönü iki kez alırsanız görüntü yenilenmez (bağlantı bağlantılarından dolayı). F5'e ikinci kez basın veya labirenti yığın akışı profilimde oynatın .

DÜZENLEME 3: Aynı yöne iki kez kolayca gidebilmek için no-op butonu eklendi (aşağıdaki yorumlara bakınız).

<?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 Güzel! daha iyi bir deneyim #answer-6171için bağlantılarınızın sonuna ekleyin . Aksi takdirde, hiç kimse labirenti çözmek için yeterli sabra sahip olmayacaktır.
Cristian Lupascu

@ W0lf: Teşekkürler. Bağlantıları eklemeyi düşündüm #ama sorun şu ki, aynı yöne iki kez (bir labirentte olabilir ;-); Onları şimdi ekledim, böylece insanlar aynı yöne gitmek istediklerinde F5'e basmaları gerekecek. Başka bir seçenek burada oynamaktır (SO profilim: stackoverflow.com/users/81179/christophed )
ChristopheD

Aynı yönde iki kez hareket etmeye çalışırken güncellemeyi kolaylaştırmak için basit bir işlem dışı bağlantıyı (yenilemek?)
İsterim

@kaoD: Sorunun #doğru cevabına atlayan bağlantı parçaları ( ) olmadan (dahili olarak, sayfa yenileme olmadan), basit bir sayfa yenileme işlemi iyi sonuç verir (aynı labirentin de mevcut olduğu bağlantılı profilimde görebileceğiniz gibi) . Ancak sorun o zaman, her yenilemeden sonra kendinizi sayfanın en üstünde bulabilirsin. Asıl sorun, StackOverflow'taki bir cevaba dahil edebileceğimiz şeyler konusunda gerçekten sınırlı olduğumuzdur (ders dışı iyi nedenlerle), örneğin keyfi Javascript kullanamıyoruz. Kolay bir çıkış yolu hakkında hiçbir fikrim yok.
ChristopheD

Çapa hala olabilir ve doğrudan sizin gönderinize gider, ancak farklı bir URL ile (ki doğru oyun için izin verir.) F5 yöntemini zor buluyorum.
kaoD

14

2 Oyunculu Pokémon Satrancı [Devam ediyor]

Çünkü bu şekilde daha eğlenceli. Bir gün geliyor: AI, izometrik ızgara ve gölgeler!

http://minite.ch/chess/?i=1 http://minite.ch/chess/?i=2 http://minite.ch/chess/?i=3 http://minite.ch/ satranç /? 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/ satranç /? 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/ satranç /? 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

Hiçbir passant veya castling, üzgünüm. Uygulanacak Şah mat / çek / çıkmaz tespiti. Buradan Spritelar: http://floatzel.net/pokemon/black-white/sprites/

İşte kaynak:

<?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;
?>

Bunu seviyorum ama iki taraf da farklı Pokemon olmalı!
MrZander,

Çok hoş. Dönüş her değiştiğinde masanın dönmesini seviyorum.
Cristian Lupascu

1
Ve PHP'de, PHP oyunları için +1: p
Event_Horizon

1
@hhh: Hayır, aynı sayfaya parametreler ekler ve Refererbaşlığı kontrol ederek sunucudaki görüntüleri yaratırsınız .
Ry

5
:-(. Senin ruhların öldü.
Justin

10

"Simon diyor" oyunu

Ne yazık ki, bu gönderimi (biraz keyfi) son teslim tarihine kadar zamanında alamadım, ancak gerçekten böyle bir kullanıcı profili oyunda canlandırmayı göstermek istedim ve önceki gönderimlerin hiçbiri canlandırılmadı. Bu oyun, oyuncunun giderek daha uzun bir sinyal dizisini tekrarlamaya çalıştığı klasik Milton Bradley oyunu Simon'ın bir klonudur .

Kaynak kodu da dahil olmak üzere bu oyun hakkında bilgiler GitHub sayfasında bulunabilir . Grafik çizim kütüphanesine duyulan ihtiyacı ortadan kaldıran kesik "palet animasyonu" ndan kaynaklanan ara sıra grafik hataları (özellikle Windows bilgisayarlarında) olabilir. Bu aksaklıkların varlığı, bu oyunu korkunç hafıza yüzünden çabuk kaybetmek için faydalı bir bahane olarak hizmet edebilir.

Ek olarak, yüksek gecikme süresi ve sınırlı bant genişliğinin etkileri bu oyunu orijinalinden daha zorlu hale getirebilir. Beş oyundan daha fazla puan almak için (oyun ilk hızlandığında), doğru sırasına bağlı kalmak yerine hangi turun bir önceki turdakine göre bir kez daha yanıp söneceğini belirlemeniz gerekeceğini düşünüyorum. yap).

Bu oyun sizin için işe yaramazsa (bir düğmeye her tıkladığınızda yeniden başlar), tarayıcınız çerezini engelliyor olabilir. Henüz bir geçici çözüm eklemedim, bu nedenle, lütfen Chrome, Opera veya Firefox kullanın veya Internet Explorer veya Safari çerez ayarlarınızı geçici olarak değiştirin.

Düzenle 2018-05-24: Şu anda, bu uygulamanın herkese açık Heroku örneğini sildim. Uygulamayı daha sonraki bir tarihte tekrar çevrimiçi hale getirebilir veya koymayabilirim. Uygulamanın kodu hala GitHub'dan mevcuttur, bu nedenle yerel olarak çalıştırmak veya oyun oynamak için isterseniz kendi Heroku uygulama örneğini oluşturabilirsiniz.


+1 Bu kesinlikle mükemmel! Dinamik olarak oluşturulmuş canlı gif yapmayı hiç düşünmedim: P
mellamokb

2

Taş kağıt makas

Tüm bağlantılar hız için profil sayfama gider.

Oyun

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.