Buat Game-Profil Mini-Pengguna


49

Kemarin, saya menemukan sesuatu yang sangat pintar.

Game profil tic-tac-toe minitech

Ya, itu adalah implementasi Tic-Tac-Toe yang berfungsi pada halaman profil pengguna @minitech. Tentu saja, saat saya melihatnya, saya harus merekayasa balik idenya dan meningkatkannya : P

menara mellamokb untuk game profil hanoi

Inilah contoh saya sendiri yang tertanam langsung di pos. Ini sedikit buggy karena beberapa detail implementasi saya belum menemukan solusi yang baik untuk itu. Kadang-kadang setelah Anda mengklik pasak, itu tidak memperbarui dengan benar sampai halaman lain menyegarkan:

Menara 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

Setel ulang

Bisakah kamu berbuat lebih baik?

  • Buat game yang berfungsi di jawaban yang Anda posting (atau halaman profil pengguna Anda). Ini dilakukan melalui mengkonfigurasi server web yang Anda miliki (atau menulis program yang bertindak sebagai server web) dengan tepat, dan menyematkan konten dari server tersebut dalam sebuah posting, menggunakan referer untuk menentukan perintah apa yang diberikan pengguna kepada permainan.
  • Ide paling keren (suara terbanyak) memenangkan kompetisi, pada Hari Kanada (Minggu, 1 Juli 2012 @ 11:59 PM EST)
  • Dalam hal seri, jawaban yang lebih tua menang.

1
+1 Ide sederhana, tetapi cemerlang! BTW - untuk tenggat waktu, saya pikir maksud Anda 2 Juni 2012.
Cristian Lupascu

Derp, ya saya lakukan, terima kasih :)
mellamokb

1
@ boothby: Saya sebenarnya berpikir untuk menghapus jawaban saya. Tujuannya adalah untuk memberikan contoh nyata, bukan untuk memenangkan kontes (atau suara, saya tidak terlalu peduli dengan perwakilan). Bisakah Anda memberikan beberapa saran konstruktif untuk kompetisi? Anda ingin tenggat waktu seperti apa? Bagaimana spek harus diubah untuk memotivasi Anda untuk berpartisipasi?
mellamokb

4
Saya hanya memperhatikan bahwa AI minitech tidak dapat memainkan permainan tic-tac-toe yang sempurna. Mainkan tengah, kiri bawah, tengah atas, kanan tengah, kiri tengah.
PhiNotPi

1
@ Mr.Wizard: berfungsi dengan baik pada FF 12.0 & Windows 7 di sini, dapatkah Anda memposting detail lebih lanjut tentang apa yang tidak berfungsi?
ChristopheD

Jawaban:


27

Permainan Kehidupan Conway

+1 generasi - +5 generasi - memperbesar - memperkecil

Pola beban: acak - glider - gunstar - siput - lwss - lightspeedoscillator1 - tumbler

Output Python dan SVG yang digunakan. Saya telah mencoba menggunakan piksel tunggal pada awalnya (sehingga Anda dapat beralih sel tunggal), tetapi tidak berhasil, karena browser tidak memuat gambar secara berurutan. Juga, pola yang jauh lebih besar dimungkinkan seperti ini tanpa merusak server web saya.

Memperbarui:

Saya bersenang-senang dengan python dan menambahkan beberapa fitur dan peningkatan:

  • Menambahkan HUD dengan jumlah populasi, pembesaran, dan nama
  • Pola dalam format rle sekarang dapat dimuat ( daftar panjang , via ) menggunakan patternparameter (misalnya ?pattern=glider). Ukuran file dibatasi hingga 1,5 kB
  • Dapat meneruskan n generasi, terbatas hingga 5 pada satu waktu, menggunakan nextparameter
  • Algoritma sedikit ditingkatkan. Ini tidak terlalu cepat, saya ingin ini tetap sederhana
  • Ia juga berfungsi mandiri sekarang (menggunakan referer atau string kueri sendiri): 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()

Anda dapat mengambil kode saya sebagai templat untuk pengiriman python fastcgi lebih lanjut.


+1 Luar Biasa! Satu saran: tambahkan #5946ke tautan Anda, dan itu akan melompat kembali ke pos Anda setelah setiap pembaruan.
mellamokb

hmm .. setidaknya itu berhasil ketika saya mencobanya .. ah. karena di Towers of Hanoi Anda selalu mengklik pasak yang berbeda. hmm
mellamokb

@Mellamokb berfungsi, tetapi Anda tidak dapat mengklik tautan yang sama dua kali sekarang
salin

Ya, saya baru menyadari bahwa lol. Tebak Anda dapat memberikan penafian bahwa saat melakukan generasi berikutnya, cukup tekan F5 untuk iterasi di masa mendatang alih-alih mengklik nexttautan itu lagi dan lagi setelah pertama kali.
mellamokb

1
@ellamokb terima kasih. Menurut pendapat saya, Anda tidak benar-benar perlu menerima jawaban pada platform ini, karena sepertinya tantangannya sudah ditutup
salin

35

C # - Stack Exchange Hangman

Tebak nama situs web Stack Exchange di game Hangman ini:



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


Ini dilakukan dengan menggunakan ASP.NET MVC 3.0 . Berikut adalah kode Controlleryang dapat membantu:

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

Selain kode ini, ada tiga kelas lagi yang belum saya sertakan karena cukup panjang dan mudah:

  • HangmanGame - Di sinilah aturan bisnis game diterapkan
  • HangmanImageRenderer - kelas yang merangkum semua keburukan GDI
  • ImageResult- kebiasaan ActionResultyang digunakan untuk mengembalikan gambar yang dihasilkan secara dinamis

Seluruh daftar kode tersedia di http://pastebin.com/ccwZLknX


+1 Wow, kalian luar biasa :). Sukai ide sejauh ini!
mellamokb

Keren, tidak pernah mendengar tentang appharbor.com. Apakah Anda benar-benar membayar untuk menerima jawaban Anda?
mellamokb

@mellamokb tidak, saya menggunakan paket hosting gratis Appharbor. Jika ini diklik banyak, saya kira saya harus membayar ... :)
Cristian Lupascu

2
Saya akan menyebutkan jika perlu, saya dapat menyediakan hosting subdomain khusus dan akses FTP ke situs hosting saya.
mellamokb

@ellamokb terima kasih, tapi saya rasa hosting ini akan berhasil. Saya hanya bercanda tentang banyak klik. :)
Cristian Lupascu

19

Clojoban! [WIP]

Saya ingin membuat permainan yang lebih besar dari ini untuk mempelajari Clojure , jadi ini butuh waktu untuk melakukan (dan menjadi cukup besar.) Saya sangat senang melakukannya, btw!

Clojoban! Restart levelNew game

. .

- No-op*

. .

** (klik di sini jika game menjadi tidak responsif) *

Instruksi

Anda adalah Robby Robby, robot pekerja keras. Anda bekerja FlipCo Industriessebagai pembawa beban yang berat. Tugas Anda adalah memindahkan masing box Sebuah kotak- masing ke goal Sebuah tujuanpengeluaran sesedikit mungkin langkah. FlipCoFasilitasnya BERBAHAYA . Ada banyak tantangan dan tempat khusus untuk dijelajahi.

Jika Anda buntu, klik Restart level(tetapi jumlah langkah Anda tidak akan diatur ulang!)


Anda juga dapat bermain di halaman depan Clojoban (meskipun itu semacam reruntuhan tujuan tantangan.) Ini memperbaiki masalah jangkar yang terkenal, tidak memerlukan cookie lintas-situs dan Anda dapat bermain dengan tombol panah keyboard Anda! Anda juga dapat bermain di halaman profil pengguna saya tanpa masalah jangkar yang mengganggu.

Di Firefox gambar tidak berkedip saat memuat sehingga sedikit lebih nyaman untuk dimainkan.

Game ini JAUH dari selesai, Clojoban masih dalam proses . Anda dapat melihat kode sumber lengkap di halaman proyek GitHub Clojoban . Ada beberapa info dalam README tentang kontribusi . Saya perlu level juga! Lihat format level pada level contoh . Anda dapat mengintip pelacak masalah Clojoban dan melihat apa yang akan terjadi selanjutnya!


Sekarang reputasi Anda adalah 11 :)
mellamokb

@ellamokb terima kasih! Game sudah tertanam sekarang :)
Álvaro Cuesta

Ternyata ini tidak mendapat banyak perhatian. Ada tips untuk meningkatkan?
Álvaro Cuesta

Jawaban Anda bagus, saya pikir pertanyaan ini secara keseluruhan mengalami stagnasi. Saya belum melihat banyak kegiatan atau suara selama beberapa hari terakhir.
mellamokb

Itu permainan yang bagus! Saya pikir Anda harus membuat versi mandiri; Saya naik ke tingkat ketiga dan menyingkirkan menekan tombol No-op. :) Pokoknya, kerja bagus!
Cristian Lupascu

17

Labirin

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

Saya mulai dari generator maze PHP yang saya temukan di sini: http://dev.horemag.net/2008/03/01/php-maze-generation-class/ .

EDIT : mengubah output menjadi PNG dan bukan SVG (untuk kompatibilitas lintas browser yang lebih baik).

EDIT 2: menambahkan header untuk memperbaiki kompatibilitas cookie IE. Seharusnya sekarang berfungsi dengan benar di semua browser utama.

Gambar tidak menyegarkan jika Anda mengambil arah yang sama dua kali (karena tautan jangkar). Tekan F5 kedua kalinya, atau mainkan labirin di profil stackoverflow saya .

EDIT 3: Menambahkan tombol no-op untuk dengan mudah dapat mengambil arah yang sama dua kali (lihat komentar di bawah).

<?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 Bagus! untuk pengalaman yang lebih baik, tambahkan #answer-6171di akhir tautan Anda. Kalau tidak, tidak ada yang akan memiliki cukup kesabaran untuk menyelesaikan labirin.
Cristian Lupascu

@ W0lf: Terima kasih. Saya berpikir untuk memasukkan #tautan tetapi masalahnya adalah mereka tidak me-refresh halaman ketika Anda mengambil arah yang sama dua kali (yang dapat terjadi dalam labirin ;-). Saya telah menambahkan mereka sekarang sehingga orang harus menekan F5 saat kedua mereka ingin mengambil arah yang sama. Pilihan lain adalah memainkannya di sini (profil SO saya: stackoverflow.com/users/81179/christophed )
ChristopheD

Saya ingin tautan tanpa operasi sederhana (menyegarkan?) Untuk membuat pembaruan lebih mudah ketika mencoba untuk bergerak dua kali ke arah yang sama :)
kaoD

@ kaoD: Tanpa bagian jangkar ( #) yang melompat ke jawaban yang tepat untuk pertanyaan (secara internal, tanpa penyegaran halaman), penyegaran halaman sederhana akan berfungsi dengan baik (seperti yang dapat Anda lihat di profil tertaut saya di mana labirin yang sama juga tersedia) . Tetapi masalahnya adalah Anda akan menemukan diri Anda berada di bagian atas halaman setelah setiap penyegaran. Masalah sebenarnya adalah bahwa kita benar-benar terbatas pada apa yang dapat kita sertakan dalam jawaban di sini di StackOverflow (untuk alasan yang baik tentunya), kita tidak dapat menggunakan Javascript sewenang-wenang misalnya. Saya tidak tahu jalan keluar yang mudah.
ChristopheD

Anda masih dapat memiliki jangkar dan akan langsung menuju posting Anda, tetapi dengan URL yang berbeda (yang akan memungkinkan untuk gameplay yang benar.) Saya menemukan metode F5 kikuk.
kaoD

14

Catur 2-Pemain Pokemon [Sedang Berlangsung]

Karena ini lebih menyenangkan. Suatu hari nanti: AI, kisi isometrik, dan bayangan!

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

Tidak ada yang lewat atau marah, maaf. Sekakmat / centang / deteksi kebuntuan untuk diterapkan. Sprite dari sini: http://floatzel.net/pokemon/black-white/sprites/

Inilah sumbernya:

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

Saya suka ini, tetapi kedua belah pihak harus Pokemon yang berbeda!
MrZander

Sangat bagus. Saya suka bahwa tabel berubah setiap kali belokan berubah.
Cristian Lupascu

1
Dan dalam PHP, +1 untuk game PHP: p
Event_Horizon

1
@ hhh: Tidak, Anda menambahkan parameter ke halaman yang sama dan menghasilkan gambar di server dengan memeriksa Refererheader.
Ry-

5
:-(. Sprite Anda telah mati.
Justin

10

"Kata Simon," permainan

Sayangnya, saya tidak bisa mendapatkan kiriman ini tepat waktu pada batas waktu (agak arbitrer), tetapi saya benar-benar ingin menunjukkan animasi dalam permainan profil pengguna tersebut, dan tidak ada kiriman sebelumnya yang dianimasikan. Permainan ini merupakan tiruan dari permainan klasik Milton Bradley Simon , di mana pemain mencoba mengulangi urutan sinyal yang semakin lama.

Informasi tentang game ini, termasuk kode sumbernya, tersedia di halaman GitHub-nya . Mungkin ada gangguan grafis sesekali (terutama pada komputer Windows) yang timbul dari "animasi palet" peretasan yang menghindari perlunya perpustakaan menggambar grafik. Keberadaan gangguan ini dapat berfungsi sebagai alasan yang berguna untuk cepat kehilangan game ini karena ingatan yang mengerikan.

Selain itu, efek latensi tinggi dan bandwidth terbatas dapat membuat game ini jauh lebih menantang daripada yang asli juga. Saya berpikir bahwa untuk mendapatkan lebih dari lima poin (ketika permainan pertama kali dipercepat), Anda harus menentukan cahaya yang berkedip sekali lagi daripada di babak sebelumnya daripada tergantung pada urutan yang benar (yang sangat sulit untuk melakukan).

Jika game ini gagal bekerja untuk Anda (itu me-restart setiap kali Anda mengklik tombol), browser Anda mungkin memblokir cookie-nya. Saya belum menambahkan solusi, jadi untuk saat ini, silakan gunakan Chrome, Opera, atau Firefox atau ubah sementara pengaturan Internet Explorer atau cookie Safari Anda.

Sunting 2018-05-24: Saat ini, saya telah menghapus instance Heroku yang dapat diakses oleh publik dari aplikasi ini. Saya mungkin atau mungkin tidak meletakkan aplikasi kembali online di kemudian hari. Kode aplikasi ini masih tersedia di GitHub, jadi Anda dapat menjalankannya secara lokal atau membuat instance aplikasi Heroku Anda sendiri jika Anda ingin bermain game.


+1 Itu benar-benar brilian! Tidak pernah terpikir untuk melakukan gif animasi bergerak yang dihasilkan secara dinamis: P
mellamokb

2

Batu gunting kertas

Semua tautan menuju ke halaman profil saya untuk kecepatan.

Permainan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.