사용자 프로필 미니 게임 만들기


49

어제 나는 매우 영리한 일을 발견했습니다.

미니 텍의 틱택 토 프로필 게임

예, 의 사용자 프로필 페이지에서 작동하는 Tic-Tac-Toe 입니다 @minitech. 물론, 내가 본 순간, 나는 그의 아이디어리버스 엔지니어링하고 그를 위로해야했습니다 . : P

하노이 프로필 게임의 mellamokb의 탑

다음은 게시물에 직접 포함 된 내 예제입니다. 내가 좋은 해결책을 찾지 못했던 몇 가지 구현 세부 사항으로 인해 약간의 버그가 있습니다. 페그를 클릭 한 후 다른 페이지를 새로 고칠 때까지 업데이트가되지 않는 경우가 있습니다.

하노이 타워

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

초기화

더 잘할 수 있습니까?

  • 게시 한 답변 (또는 사용자 프로필 페이지)에서 작동하는 게임을 만듭니다. 이것은 자신이 소유 한 웹 서버를 적절히 구성하거나 웹 서버 역할을하는 프로그램을 작성하고 참조를 사용하여 게시물에 콘텐츠를 포함시켜 사용자가 게임에 어떤 명령을 내리는지를 통해 이루어집니다.
  • 가장 멋진 아이디어 (대표)가 캐나다의 날 (2012 년 7 월 1 일 일요일 오후 11시 59 분 EST)까지 경쟁에서 승리합니다.
  • 동점 일 경우 더 오래된 답변이 이깁니다.

1
+1 단순하지만 훌륭한 아이디어! BTW – 마감일은 2012 년 6 월 2 일 을 의미하는 것 같습니다 .
Cristian Lupascu

Derp, 그렇습니다, 감사합니다 :)
mellamokb

1
@boothby : 실제로 내 대답을 삭제하려고 생각했습니다. 그 목적은 콘테스트에서 이기지 않는 구체적인 예를 제공하는 것이 었습니다 (또는 투표, 대표에 대해서는 크게 신경 쓰지 않습니다). 경쟁사에 건설적인 제안을 해 줄 수 있습니까? 마감일이 무엇입니까? 참여 동기를 부여하기 위해 사양을 어떻게 변경해야합니까?
mellamokb

4
방금 minitech의 AI가 틱택 토 게임을 할 수 없다는 것을 알았습니다. 중앙, 왼쪽 하단, 중앙 상단, 중앙 오른쪽, 중앙 왼쪽을 재생합니다.
PhiNotPi

1
@ Mr.Wizard : FF 12.0 및 Windows 7에서 잘 작동합니다. 작동하지 않는 것에 대한 자세한 내용을 게시 할 수 있습니까?
ChristopheD

답변:


27

콘웨이의 인생 게임

+1 세대 - +5 세대 - 확대 - 축소

부하 패턴 : 무작위 - 글라이더 - gunstar - 달팽이 - lwss - lightspeedoscillator1 - 텀블러

Python 및 SVG 출력을 사용했습니다. 처음에는 단일 픽셀을 사용하려고했지만 (단일 셀을 토글 할 수 있음) 브라우저가 이미지를 순서대로로드하지 않기 때문에 제대로 작동하지 않았습니다. 또한 웹 서버를 손상시키지 않고 이와 같이 훨씬 더 큰 패턴이 가능합니다.

최신 정보:

나는 파이썬으로 재미를 보았고 몇 가지 기능과 개선 사항을 추가했습니다.

  • 인구 수, 확대 / 축소 및 이름이 포함 된 HUD 추가
  • rle 형식의 패턴은 이제 매개 변수 (예 :) 사용하여 로드 할 수 있습니다 ( 긴 목록통해 ). 파일 크기는 1.5kB로 제한됩니다pattern?pattern=glider
  • 다음을 사용하여 한 번에 5 개로 제한된 n 세대를 전달할 수 있습니다. next매개 변수를
  • 약간 개선 된 알고리즘. 정말 빠르지는 않지만 간단하게 유지하고 싶습니다.
  • 또한 독립 실행 형으로 작동합니다 (참조 또는 자체 쿼리 문자열 사용) : 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()

추가 파이썬 fastcgi 제출을위한 템플릿으로 내 코드를 사용할 수 있습니다.


+1 최고! 한 가지 제안 : #5946링크에 추가 하면 업데이트 할 때마다 다시 게시물로 이동합니다.
mellamokb

흠 .. 적어도 내가 시도했을 때 효과가 있었다 .. 아. 하노이 타워에서는 항상 다른 못을 클릭하기 때문입니다. 흠
mellamokb

@mellamokb 그것은 작동하지만, 이제 두 번 같은 링크를 클릭 할 수 없습니다
복사

나중에, 나는 그 lol을 깨달았습니다. 차세대를 수행 할 때 next처음으로 링크를 다시 클릭하는 대신 F5 키를 눌러 향후 반복을 수행 할 수 있습니다.
mellamokb

1
@mellamokb 감사합니다. 이 도전이 닫혀 같은 경우 보이기 때문에 내 생각에 당신은 정말이 플랫폼에 대한 답변을 받아 들일 필요가 없습니다
복사

35

C #-스택 교환 행맨

이 행맨 게임에서 Stack Exchange 웹 사이트의 이름을 추측하십시오.



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


이것은 ASP.NET MVC 3.0을 사용하여 수행되었습니다 . Controller트릭을 수행 하는 코드는 다음과 같습니다 .

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

이 코드 외에, 매우 길고 간단하기 때문에 포함하지 않은 클래스가 세 개 더 있습니다.

  • HangmanGame -게임 비즈니스 규칙이 구현되는 곳
  • HangmanImageRenderer -모든 GDI 추악을 캡슐화하는 클래스
  • ImageResult- ActionResult동적으로 생성 된 이미지를 반환하는 데 사용되는 사용자 정의

전체 코드 목록은 http://pastebin.com/ccwZLknX 에서 확인할 수 있습니다


+1 와우, 당신은 굉장합니다 :). 지금까지의 아이디어처럼!
mellamokb

appharbor.com에 대해 들어 본 적이 없습니다. 답변을 주최하기 위해 정말로 비용을 지불하고 있습니까?
mellamokb

@mellamokb 아니오, 저는 Appharbor의 무료 호스팅 계획을 사용하고 있습니다. 이것이 많이 클릭되면 나는 비록 지불해야 할 것 같아요 ... :)
Cristian Lupascu

2
필요한 경우 사용자 지정 하위 도메인 호스팅 및 호스팅 사이트에 대한 FTP 액세스를 제공 할 수 있다고 언급하려고합니다.
mellamokb

@mellamokb 감사합니다,하지만이 호스팅이 될 것이라고 생각합니다. 많은 클릭에 대해 농담했습니다. :)
Cristian Lupascu

19

클로 호반! [WIP]

Clojure 를 배우기 위해이 게임에서 더 큰 게임을 만들고 싶었 습니다.

클로 호반! Restart levelNew game

. .

- No-op*

. .

** (게임이 응답하지 않으면 여기를 클릭하십시오) *

명령

당신은 로비열심히 일하는 로봇 인 로비 입니다. 당신 FlipCo Industries은 무거운 짐 운반자로 일합니다. 당신의 임무는 각 이동하는 것입니다 box 상자A를 goal 목표가능한 한 몇 가지 단계로 지출. FlipCo의 시설은 위험합니다 합니다. 발견해야 할 많은 도전과 특별한 장소가 있습니다.

막히면 클릭하십시오 Restart level(그러나 걸음 수는 재설정되지 않습니다!)


Clojoban의 첫 페이지 에서 게임을 할 수도 있습니다 (도전의 목적을 망칠 수는 있지만) 악명 높은 앵커 문제를 해결하고 사이트 간 쿠키가 필요하지 않으며 키보드 화살표 키로 재생할 수 있습니다! 성가신 앵커 문제없이 내 사용자 프로필 페이지 에서 재생할 수도 있습니다 .

Firefox에서는 이미지가로드되는 동안 깜박이지 않으므로 재생하기에 조금 더 편합니다.

이 게임은 완료에서 FAR이며 Clojoban은 여전히 ​​진행중인 작업입니다 . Clojoban의 GitHub 프로젝트 페이지 에서 전체 소스 코드를 볼 수 있습니다 . README기여 에 대한 정보가 있습니다 . 나도 레벨이 필요해! 예제 레벨 에서 레벨 형식을 참조하십시오 . Clojoban의 이슈 트래커 를보고 다음에 무엇이 올지 볼 수 있습니다 !


이제 당신의 평판은 11 :)
mellamokb

트윗 담아 가기 게임 : 이제 내장되어
알바로 쿠에 스타에게

분명히 이것은 많은 관심을받지 못했습니다. 개선을위한 팁이 있습니까?
Álvaro Cuesta 2016 년

귀하의 답변이 훌륭합니다.이 질문이 전반적으로 정체 된 것 같습니다. 지난 며칠 동안 많은 활동이나 투표를 보지 못했습니다.
mellamokb 2016 년

대단한 게임입니다! 독립형 버전을 만들어야한다고 생각합니다. 나는 세 번째 수준에 도착했고 No-op 버튼을 누르지 않았습니다. :) 어쨌든 훌륭합니다!
Cristian Lupascu

17

미로

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

나는 여기에서 찾은 PHP 미로 생성기에서 시작했습니다 : http://dev.horemag.net/2008/03/01/php-maze-generation-class/ .

편집 : SVG 대신 출력을 PNG로 변경했습니다 (더 나은 크로스 브라우저 호환성을 위해).

편집 2 : IE 쿠키 호환성을 수정하기 위해 헤더를 추가했습니다. 모든 주요 브라우저에서 올바르게 작동합니다.

앵커 링크로 인해 같은 방향을 두 번 사용하면 이미지가 새로 고쳐지지 않습니다. F5를 두 번 누르거나 stackoverflow 프로파일 에서 미로 재생하십시오. .

편집 3 : 같은 방향으로 두 번 쉽게 갈 수있는 no-op 버튼이 추가되었습니다 (아래 주석 참조).

<?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 니스! 더 나은 경험 #answer-6171을 위해 링크 끝에 추가 하십시오. 그렇지 않으면 아무도 미로를 풀기에 충분한 인내심을 가지지 못할 것입니다.
Cristian Lupascu

@ W0lf : 감사합니다. #링크 를 포함하는 것에 대해 생각 했지만 문제는 동일한 방향을 두 번 (미로에서 발생할 수있는 ;-) 페이지를 새로 고치지 않는다는 것입니다. 사람들이 같은 방향으로 가고 싶을 때 두 번째 F5 키를 눌러야하므로 지금 추가했습니다. 또 다른 옵션은 여기에서 재생하는 것입니다 (내 SO 프로필 : stackoverflow.com/users/81179/christophed )
ChristopheD

같은 방향으로 두 번 이동하려고 할 때 업데이트를 더 쉽게하기 위해 간단한 무 작동 링크 (새로 고침?)를
좋아합니다.

@kaoD : #질문에 대한 정답으로 이동 하는 앵커 부분 ( )이 없으면 (내부적으로 페이지 새로 고침 없음) 간단한 페이지 새로 고침이 잘 작동합니다 (동일한 미로도 사용할 수있는 링크 된 프로파일에서 볼 수 있음) . 그러나 문제는 매번 새로 고친 후에 페이지 상단에서 자신을 발견한다는 것입니다. 실제 문제는 StackOverflow에 대한 답변에 포함 할 수있는 내용이 실제로 제한되어 있다는 것입니다. 나는 쉬운 탈출구에 대해 전혀 모른다.
ChristopheD

앵커를 가질 수 있으며 게시물로 바로 이동하지만 다른 URL을 사용하면 올바른 게임 플레이가 가능합니다 .F5 방법이 어수선합니다.
kaoD

14

2 인용 포켓몬 체스 [작업 진행 중]

이 방법이 더 재미 있기 때문입니다. AI, 아이소 메트릭 그리드 및 그림자가 언젠가 올라옵니다!

http://minite.ch/chess/?i=1 http://minite.ch/chess/?i=2 http://minite.ch/chess/?i=3 http://minite.ch/ chess /? 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=41http://minite.ch/chess/?i=23 http://minite.ch/chess/?i=24 
http://minite.ch/chess/?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=42 http://minite.ch/chess/?i=43http://minite.ch/chess/?i=44 http://minite.ch/chess/?i=45 http://minite.ch/chess/?i=46 http://minite.ch/ chess /? i = 47 http://minite.ch/chess/?i=48 
http://minite.ch/chess/?i=49 http://minite.ch/chess/?i=50 http : //minite.ch/chess/?i=51 http://minite.ch/chess/?i=52 http://minite.ch/chess/?i=53 http://minite.ch/chess/ ? i = 54 http://minite.ch/chess/?i=55 http://minite.ch/chess/?i=56 
http://minite.ch/chess/?i=57 http : // minite.ch/chess/?i=58 http://minite.ch/chess/?i=59 http://minite.ch/chess/?i=60 http://minite.ch/chess/?i=61http://minite.ch/chess/?i=62 http://minite.ch/chess/?i=63 http://minite.ch/chess/?i=64

전임자 나 성씨 없음, 죄송합니다. 수행 할 검사 / 체크 / Stalemate 감지. 여기에서 스프라이트 : http://floatzel.net/pokemon/black-white/sprites/

소스는 다음과 같습니다.

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

나는 이것을 좋아하지만 양면이 다른 포켓몬이어야합니다!
MrZander

아주 좋아요 턴이 바뀔 때마다 테이블이 돌아가는 것이 좋습니다.
Cristian Lupascu 2016 년

1
PHP에서 PHP 게임의 경우 +1 : p
Event_Horizon

1
@hhh : 아니요, 동일한 페이지에 매개 변수를 추가하고 Referer헤더 를 확인하여 서버에서 이미지를 생성합니다 .
Ry-

5
:-(. 당신의 스프라이트는 죽었습니다.
저스틴

10

"시몬 말한다"게임

불행히도, 나는 (약간의 임의의) 마감일까지 제 시간 에이 제출물을 얻을 수 없었지만, 그러한 사용자 프로필 게임에서 애니메이션을 실제로 보여주고 싶었고 이전 제출물 중 애니메이션이 없었습니다. 이 게임은 클래식 Milton Bradley 게임의 복제품입니다 Simon 플레이어는 점점 더 긴 신호 시퀀스를 반복하려고 시도합니다.

소스 코드를 포함한이 게임에 대한 정보는 는 GitHub 페이지 . 그래픽 드로잉 라이브러리가 필요없는 해킹 된 "팔레트 애니메이션"에서 발생하는 그래픽 글리치 (특히 Windows 컴퓨터)가있을 수 있습니다. 이러한 결함이 존재한다는 것은 끔찍한 기억 때문에이 게임을 빨리 잃는 데 유용한 변명이 될 수 있습니다.

또한 높은 대기 시간과 제한된 대역폭의 영향으로 인해이 게임은 원본보다 훨씬 더 어려워 질 수 있습니다. 나는 5 점 이상을 얻으려면 (게임이 처음 속도를 올릴 때) 올바른 순서에 따르기보다 이전 라운드보다 한 번 더 깜박이는 빛을 결정해야한다고 생각합니다 (매우 어렵다) 하다).

이 게임이 작동하지 않으면 (버튼을 클릭 할 때마다 다시 시작) 브라우저가 쿠키를 차단하고있을 수 있습니다. 아직 해결 방법을 추가하지 않았으므로 당분간 Chrome, Opera 또는 Firefox를 사용하거나 Internet Explorer 또는 Safari 쿠키 설정을 임시로 변경하십시오.

2018-05-24 편집 : 현재 공개적으로 액세스 가능한이 앱의 Heroku 인스턴스를 삭제했습니다. 나중에 앱을 온라인 상태로 되돌릴 수 있습니다. 응용 프로그램의 코드는 여전히 GitHub의 볼 수 있습니다, 그래서 당신은 로컬로 실행하거나 게임을 할 경우 자신에게 Heroku 응용 프로그램 인스턴스를 만들 수 있습니다.


+1 정말 훌륭합니다! 동적으로 생성 된 애니메이션 GIF를 생각하지 마십시오 : P
mellamokb

2

가위 바위 보

모든 링크는 내 프로필 페이지로 이동하여 속도를 높입니다.

게임

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.