Tạo một trò chơi nhỏ trong hồ sơ người dùng


49

Hôm qua, tôi vấp phải một điều rất thông minh.

trò chơi hồ sơ tic-tac-toe của minitech

Có, đó là một triển khai làm việc của Tic-Tac-Toe trên trang hồ sơ người dùng, từ @minitech. Tất nhiên, ngay lúc tôi nhìn thấy nó, tôi đã phải đảo ngược ý tưởng của anh ấy và một lần lên anh ấy : P

mellamokb's tower của hà nội trò chơi

Đây là ví dụ của riêng tôi được nhúng trực tiếp trong bài viết. Đó là một lỗi nhỏ do một vài chi tiết triển khai mà tôi chưa tìm ra giải pháp tốt cho. Đôi khi sau khi bạn nhấp vào chốt, nó không cập nhật đúng cho đến khi làm mới trang khác:

Tháp Hà Nội

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

Cài lại

Bạn có thể làm tốt hơn không?

  • Tạo một trò chơi làm việc trong câu trả lời được đăng của bạn (hoặc trang hồ sơ người dùng của bạn). Điều này được thực hiện thông qua việc cấu hình thích hợp một máy chủ web mà bạn sở hữu (hoặc viết chương trình hoạt động như một máy chủ web) và nhúng nội dung từ nó vào bài đăng, sử dụng tham chiếu để xác định lệnh nào mà người dùng đưa ra cho trò chơi.
  • Ý tưởng tuyệt vời nhất (hầu hết phiếu bầu) sẽ thắng cuộc thi, vào Ngày Canada (Chủ nhật, ngày 1 tháng 7 năm 2012 @ 11:59 PM EST)
  • Trong trường hợp hòa, câu trả lời cũ hơn sẽ thắng.

1
+1 Ý tưởng đơn giản nhưng tuyệt vời! BTW - cho thời hạn cuối cùng tôi nghĩ bạn có nghĩa là ngày 2 tháng 6 năm 2012.
Cristian Lupascu

Derp, vâng tôi đã làm, cảm ơn :)
mellamokb

1
@boothby: Tôi thực sự đã suy nghĩ về việc xóa câu trả lời của mình. Mục đích là đưa ra một ví dụ cụ thể, không giành chiến thắng trong cuộc thi (hoặc phiếu bầu, tôi không quan tâm lắm đến đại diện). Bạn có thể cung cấp một số gợi ý mang tính xây dựng cho cuộc thi? Bạn muốn thời hạn là gì? Làm thế nào các thông số kỹ thuật nên được thay đổi để thúc đẩy bạn tham gia?
mellamokb

4
Tôi chỉ nhận thấy rằng AI của minitech không thể chơi một trò chơi hoàn hảo về tic-tac-toe. Chơi trung tâm, dưới cùng bên trái, trung tâm trên cùng, trung tâm bên phải, trung tâm bên trái.
PhiNotPi

1
@ Mr.Wizard: hoạt động tốt trên FF 12.0 & Windows 7 tại đây, bạn có thể đăng thêm chi tiết về những gì không hoạt động không?
BarsheD

Câu trả lời:


27

Trò chơi cuộc sống của Conway

Thế hệ +1 - +5 thế hệ - phóng to - thu nhỏ

Tải mẫu: ngẫu nhiên - tàu lượn - gunstar - ốc - lwss - lightspeedoscillator1 - con lật đật

Đã sử dụng đầu ra Python và SVG. Tôi đã thử sử dụng các pixel đơn lẻ lúc đầu (để bạn có thể chuyển đổi các ô đơn), nhưng nó không hoạt động, vì trình duyệt không tải hình ảnh theo thứ tự. Ngoài ra, các mẫu lớn hơn nhiều có thể như thế này mà không làm sập máy chủ web của tôi.

Cập nhật:

Tôi đã có một số niềm vui với python và thêm một số tính năng và cải tiến:

  • Đã thêm HUD với số lượng dân số, thu phóng và tên
  • Các mẫu ở định dạng rle hiện có thể được tải ( danh sách dài , thông qua ) bằng cách sử dụng patterntham số (ví dụ:?pattern=glider ). Kích thước tệp được giới hạn ở 1,5kB
  • Có thể chuyển tiếp n thế hệ, giới hạn 5 lần, sử dụng next tham số
  • Thuật toán được cải thiện một chút. Mặc dù nó không thực sự nhanh, tôi muốn nó đơn giản
  • Nó cũng hoạt động độc lập ngay bây giờ (sử dụng tham chiếu hoặc chuỗi truy vấn của riêng nó): https://copy.sh/fcgi-bin/life2 Hebpotype=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()

Bạn có thể lấy mã của tôi làm mẫu để gửi thêm python fastcgi.


+1 Tuyệt vời! Một đề xuất: nối #5946vào các liên kết của bạn và nó sẽ quay trở lại bài đăng của bạn sau mỗi lần cập nhật.
mellamokb

hmm .. ít nhất nó đã hoạt động khi tôi thử nó .. ah. bởi vì ở Towers of Hà Nội, bạn luôn nhấp vào các chốt khác nhau. hmm
mellamokb

@mellamokb nó hoạt động, nhưng bạn không thể nhấp vào cùng một liên kết hai lần bây giờ
sao chép

Ya, tôi mới nhận ra rằng lol. Đoán rằng bạn có thể cung cấp từ chối trách nhiệm rằng khi thực hiện thế hệ tiếp theo, chỉ cần nhấn F5 cho các lần lặp lại trong tương lai thay vì nhấp vào nextliên kết nhiều lần sau lần đầu tiên.
mellamokb

1
@mellamokb cảm ơn. Theo tôi, bạn không thực sự cần phải chấp nhận câu trả lời trên nền tảng này, vì có vẻ như thử thách đã kết thúc
sao chép

35

C # - Hang trao đổi ngăn xếp

Đoán tên của các trang web Stack Exchange trong trò chơi Hangman này:



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


Điều này đã được thực hiện bằng cách sử dụng ASP.NET MVC 3.0 . Đây là mã của Controllerthủ thuật đó:

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

Ngoài mã này, còn có ba lớp nữa mà tôi chưa bao gồm vì chúng khá dài và đơn giản:

  • HangmanGame - đây là nơi quy tắc kinh doanh trò chơi được thực hiện
  • HangmanImageRenderer - lớp gói gọn tất cả sự xấu xí của GDI
  • ImageResult- một tùy chỉnh ActionResultđược sử dụng để trả về hình ảnh được tạo động

Toàn bộ danh sách mã có sẵn tại http://pastebin.com/ccwZLknX


+1 Wow, các bạn thật tuyệt vời :). Giống như những ý tưởng cho đến nay!
mellamokb

Thật tuyệt, chưa bao giờ nghe nói về appharbor.com. Bạn có thực sự trả tiền để lưu trữ câu trả lời của bạn?
mellamokb

@mellamokb không, tôi đang sử dụng gói lưu trữ miễn phí của Appharbor. Nếu điều này được nhấp nhiều, tôi đoán tôi sẽ phải trả tiền ... :)
Cristian Lupascu

2
Tôi sẽ đề cập nếu cần thiết, tôi có thể cung cấp lưu trữ tên miền phụ tùy chỉnh và truy cập FTP vào trang web lưu trữ của mình.
mellamokb

@mellamokb cảm ơn, nhưng tôi nghĩ hosting này sẽ làm được. Tôi chỉ nói đùa về nhiều nhấp chuột. :)
Cristian Lupascu

19

Clojoban! [WIP]

Tôi muốn tạo ra một trò chơi lớn hơn từ đây để học Clojure , vì vậy phải mất một thời gian để thực hiện (và trở nên khá lớn.) Tôi đã có rất nhiều niềm vui khi làm điều đó, btw!

Clojoban! Restart levelNew game

. .

- No-op*

. .

** (bấm vào đây nếu trò chơi trở nên không phản hồi) *

Hướng dẫn

Bạn là Robby Cướp, một robot chăm chỉ. Bạn làm việc FlipCo Industriesnhư một tàu sân bay tải nặng. Công việc của bạn là để di chuyển mỗi box Một hộpmột goal Mục tiêuchi tiêu càng ít bước càng tốt. FlipCoCơ sở của là NGUY HIỂM . Có rất nhiều thử thách và những nơi đặc biệt để khám phá.

Nếu bạn gặp khó khăn, hãy nhấp Restart level(nhưng số bước của bạn sẽ không được đặt lại!)


Bạn cũng có thể chơi tại trang nhất của Clojoban (mặc dù nó phá hỏng mục đích của thử thách.) Nó khắc phục vấn đề neo khét tiếng, không yêu cầu cookie chéo và bạn có thể chơi bằng các phím mũi tên trên bàn phím! Bạn cũng có thể chơi tại hồ sơ người dùng của tôi trang mà không gặp vấn đề neo khó chịu.

Trong Firefox, hình ảnh không nhấp nháy khi đang tải để thoải mái hơn khi chơi.

Trò chơi này là FAR từ khi hoàn thành, Clojoban vẫn đang trong quá trình hoàn thiện . Bạn có thể thấy mã nguồn hoàn chỉnh tại trang dự án GitHub của Clojoban . Có một số thông tin trong README về việc đóng góp . Tôi cũng cần cấp độ! Xem định dạng cấp độ ở các cấp độ ví dụ . Bạn có thể xem lén theo dõi vấn đề của Clojoban và xem điều gì sẽ xảy ra tiếp theo!


Bây giờ danh tiếng của bạn là 11 :)
mellamokb

@mellamokb cảm ơn! Trò chơi được nhúng ngay bây giờ :)
Álvaro Cuesta

Rõ ràng điều này đã không nhận được nhiều sự chú ý. Bất kỳ lời khuyên để cải thiện?
Álvaro Cuesta

Câu trả lời của bạn là tốt, tôi nghĩ rằng câu hỏi này nói chung đã bị đình trệ. Tôi đã không thấy nhiều hoạt động hoặc phiếu bầu trong vài ngày qua.
mellamokb

Đó là một trò chơi tuyệt vời! Tôi nghĩ bạn nên tạo một phiên bản độc lập; Tôi đã lên cấp ba và thoát khỏi việc nhấn nút No-op. :) Dù sao, công việc tuyệt vời!
Cristian Lupascu

17

mê cung

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

Tôi đã bắt đầu từ trình tạo mê cung PHP mà tôi tìm thấy ở đây: http://dev.horemag.net/2008/03/01/php-maze-generation- class / .

EDIT : đã thay đổi đầu ra thành PNG thay vì SVG (để tương thích trình duyệt chéo tốt hơn).

EDIT 2: đã thêm một tiêu đề để sửa lỗi tương thích cookie IE. Bây giờ nên hoạt động chính xác trong tất cả các trình duyệt chính.

Hình ảnh không làm mới nếu bạn thực hiện cùng một hướng hai lần (do các liên kết neo). Nhấn F5 lần thứ hai hoặc chơi mê cung trên hồ sơ stackoverflow của tôi .

EDIT 3: Đã thêm nút không op để dễ dàng có thể thực hiện cùng một hướng hai lần (xem bình luận bên dưới).

<?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 Tốt đẹp! để có trải nghiệm tốt hơn, hãy thêm #answer-6171vào cuối các liên kết của bạn. Nếu không, sẽ không ai có đủ kiên nhẫn để giải quyết mê cung.
Cristian Lupascu

@ W0lf: Cảm ơn. Tôi đã nghĩ đến việc bao gồm các #liên kết nhưng vấn đề là chúng không làm mới trang khi bạn thực hiện cùng một hướng hai lần (điều này có thể xảy ra trong một mê cung ;-). Tôi đã thêm chúng ngay bây giờ để mọi người sẽ phải nhấn F5 lần thứ hai họ muốn đi theo hướng tương tự. Một lựa chọn khác là để chơi nó ở đây (hồ sơ SO tôi: stackoverflow.com/users/81179/christophed )
ChristopheD

Tôi sẽ thích một liên kết không hoạt động đơn giản (làm mới?) Để giúp cập nhật dễ dàng hơn khi cố gắng di chuyển hai lần theo cùng một hướng :)
kaoD

@kaoD: Không có phần neo ( #) nhảy đến câu trả lời đúng cho câu hỏi (bên trong, không cần làm mới trang), làm mới trang đơn giản sẽ hoạt động tốt (như bạn có thể thấy trên hồ sơ được liên kết của tôi, nơi cũng có mê cung tương tự) . Nhưng vấn đề sau đó là bạn sẽ thấy mình ở đầu trang sau mỗi lần làm mới. Vấn đề thực sự là chúng tôi thực sự bị giới hạn trong những gì chúng tôi có thể đưa vào câu trả lời ở đây trên StackOverflow (vì lý do chính đáng), chúng tôi không thể sử dụng Javascript tùy ý. Tôi không có ý tưởng về một lối thoát dễ dàng.
BarsheD

Bạn vẫn có thể có mỏ neo và nó sẽ đi thẳng vào bài đăng của bạn, nhưng với một URL khác (sẽ cho phép chơi trò chơi chính xác.) Tôi thấy phương pháp F5 rất cục mịch.
kaoD

14

Cờ vua Pokémon 2 người [Đang tiến hành]

Bởi vì nó vui hơn theo cách này. Sắp tới một ngày nào đó: AI, lưới đẳng cự và bóng tối!

http://minite.ch/chess/?i=1 http://minite.ch/chess/?i=2 http://minite.ch/chess/?i=3 http://minite.ch/ cờ vua /? 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/ cờ vua /? 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=41 http://minite.ch/chess/?i=42 http://minite.ch/chess/?i=43 http://minite.ch/chess/?i=44 http://minite.ch/ cờ vua /? 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

Không có en passant hoặc castling, xin lỗi. Checkmate / kiểm tra / phát hiện bế tắc sẽ được thực hiện. Sprites từ đây: http://floatzel.net/pokemon/black-white/sprites/

Đây là nguồn:

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

Tôi thích điều này, nhưng hai bên nên là Pokemon khác nhau!
MrZander

Rất đẹp. Tôi thích nó là bàn quay bất cứ khi nào thay đổi.
Cristian Lupascu

1
Và trong PHP, +1 cho các trò chơi PHP: p
Event_Horiz

1
@hhh: Không, bạn thêm tham số vào cùng một trang và tạo (các) hình ảnh trên máy chủ bằng cách kiểm tra Referertiêu đề.
Ry-

5
:-(. Các họa sĩ của bạn đã chết.
Justin

10

"Simon nói" trò chơi

Thật không may, tôi không thể nhận được bài nộp này đúng hạn trước hạn chót (hơi tùy tiện), nhưng tôi thực sự muốn thể hiện hoạt hình trong một trò chơi hồ sơ người dùng như vậy và không có bài nộp nào trước đó là hoạt hình. Trò chơi này là một bản sao của trò chơi Milton Bradley cổ điển Simon , trong đó người chơi cố gắng lặp lại một chuỗi tín hiệu ngày càng dài.

Thông tin về trò chơi này, bao gồm mã nguồn của nó, có sẵn tại trang GitHub của nó . Thỉnh thoảng có thể có trục trặc đồ họa (đặc biệt là trên máy tính Windows) phát sinh từ "bảng màu hoạt hình" hackish tránh sự cần thiết của một thư viện vẽ đồ họa. Sự tồn tại của những trục trặc này có thể đóng vai trò là cái cớ hữu ích để nhanh chóng thua trò chơi này vì trí nhớ khủng khiếp.

Ngoài ra, ảnh hưởng của độ trễ cao và băng thông hạn chế có thể khiến trò chơi này trở nên khó khăn hơn nhiều so với bản gốc. Tôi nghĩ rằng để có được nhiều hơn năm điểm (khi trò chơi lần đầu tăng tốc), bạn sẽ cần xác định ánh sáng nào nhấp nháy thêm một lần so với vòng trước thay vì phụ thuộc vào trình tự chính xác (rất khó để làm).

Nếu trò chơi này không hoạt động với bạn (nó khởi động lại mỗi khi bạn nhấp vào nút), trình duyệt của bạn có thể đang chặn cookie của nó. Tôi chưa thêm một cách giải quyết, vì vậy, hiện tại, vui lòng sử dụng Chrome, Opera hoặc Firefox hoặc tạm thời thay đổi cài đặt cookie Internet Explorer hoặc Safari của bạn.

Chỉnh sửa 2018-05-24: Tại thời điểm này, tôi đã xóa phiên bản Heroku có thể truy cập công khai của ứng dụng này. Tôi có thể hoặc không thể đưa ứng dụng trở lại trực tuyến vào một ngày sau đó. Các mã của ứng dụng vẫn còn có sẵn trên GitHub, vì vậy bạn có thể chạy nó tại địa phương hoặc tạo ví dụ ứng dụng Heroku của riêng bạn nếu bạn muốn chơi trò chơi.


+1 Điều đó thật tuyệt vời! Không bao giờ nghĩ đến việc thực hiện một cách linh hoạt các gifs animate: P
mellamokb

2

Oẳn tù tì

Tất cả các liên kết đến trang hồ sơ của tôi cho tốc độ.

Tro choi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.