สร้างมินิเกมโปรไฟล์ผู้ใช้


49

เมื่อวานนี้ฉันสะดุดกับสิ่งที่ฉลาดมาก

เกมโพรไฟล์โอเอกซ์ของ minitech

ใช่ว่าเป็นการดำเนินการในการทำงานของโอเอกซ์@minitechในหน้าโปรไฟล์ของผู้ใช้จาก แน่นอนว่าช่วงเวลาที่ฉันเห็นมันฉันต้องย้อนความคิดของเขากลับคืนมา

หอคอยของเกมโปรไฟล์ฮานอย 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

รีเซ็ต

คุณทำได้ดีกว่านี้ไหม

  • สร้างเกมที่ใช้งานได้ในคำตอบที่โพสต์ของคุณ (หรือหน้าโปรไฟล์ผู้ใช้ของคุณ) สิ่งนี้ทำผ่านการกำหนดค่าเว็บเซิร์ฟเวอร์ที่คุณเป็นเจ้าของอย่างเหมาะสม (หรือเขียนโปรแกรมที่ทำหน้าที่เป็นเว็บเซิร์ฟเวอร์) และฝังเนื้อหาจากมันในโพสต์โดยใช้ผู้อ้างอิงเพื่อพิจารณาว่าคำสั่งที่ผู้ใช้ให้กับเกมนั้นคืออะไร
  • ไอเดียที่เจ๋งที่สุด (โหวตมากที่สุด) เป็นผู้ชนะการแข่งขันโดยวันแคนาดา (วันอาทิตย์ที่ 1 กรกฎาคม 2555 @ 23.59 น. EST)
  • ในกรณีที่เสมอกันคำตอบที่เก่ากว่าชนะ

1
+1 แนวคิดที่เรียบง่าย แต่ยอดเยี่ยม! BTW - สำหรับกำหนดส่งฉันคิดว่าคุณหมายถึง2 มิถุนายน 2555
Cristian Lupascu

Derp, ใช่ฉันไม่ขอบคุณ :)
mellamokb

1
@boothby: จริง ๆ แล้วฉันคิดจะลบคำตอบของฉัน ความตั้งใจที่จะให้ตัวอย่างที่เป็นรูปธรรมไม่ได้ที่จะชนะการแข่งขัน (หรือโหวตฉันไม่สนใจตัวแทนมาก) คุณสามารถให้คำแนะนำที่สร้างสรรค์เพื่อการแข่งขันได้หรือไม่? สิ่งที่คุณต้องการกำหนดเวลาเป็นอย่างไร ข้อมูลจำเพาะควรมีการเปลี่ยนแปลงอย่างไรเพื่อกระตุ้นให้คุณเข้าร่วม
mellamokb

4
ฉันเพิ่งสังเกตเห็นว่า AI ของ minitech ไม่สามารถเล่นเกมที่สมบูรณ์แบบของโอเอกซ์ ศูนย์เล่น, ซ้ายล่าง, กลางบน, กลางขวา, กลางซ้าย
PhiNotPi

1
@ Mr.Wizard: ทำงานได้ดีบน FF 12.0 และ Windows 7 ที่นี่คุณช่วยโพสต์รายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่ไม่ทำงานได้หรือไม่?
ChristopheD

คำตอบ:


27

เกมแห่งชีวิตของคอนเวย์

รุ่น +1 - +5 รุ่น - ซูมเข้า - ซูมออก

รูปแบบการโหลด: สุ่ม - เครื่องร่อน - gunstar - หอยทาก - lwss - lightspeedoscillator1 - แก้วน้ำ

ใช้ Python และเอาต์พุต SVG ฉันได้ลองใช้พิกเซลเดียวในตอนแรก (ดังนั้นคุณสามารถสลับเซลล์เดียว) แต่มันไม่ได้ผลเพราะเบราว์เซอร์ไม่โหลดภาพตามลำดับ ยิ่งไปกว่านั้นรูปแบบที่ใหญ่กว่านี้เป็นไปได้เช่นนี้โดยไม่ต้องขัดข้องเว็บเซิร์ฟเวอร์ของฉัน

ปรับปรุง:

ฉันสนุกกับงูหลามและเพิ่มคุณสมบัติและการปรับปรุงหลายประการ:

  • เพิ่ม HUD ด้วยจำนวนประชากรการซูมและชื่อ
  • รูปแบบในรูปแบบ rle สามารถโหลดได้ ( รายการแบบยาว , ผ่าน ) โดยใช้patternพารามิเตอร์ (เช่น?pattern=glider) ขนาดไฟล์ถูก จำกัด ที่ 1.5kB
  • สามารถส่งต่อ n generation ได้ครั้งละ 5 ครั้งโดยใช้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

อืม .. อย่างน้อยก็ใช้ได้เมื่อฉันลอง .. เพราะในหอคอยแห่งฮานอยคุณจะคลิกที่หมุดต่าง ๆ เสมอ hmm
mellamokb

@mellamokb ใช้งานได้ แต่คุณไม่สามารถคลิกลิงก์เดียวกันสองครั้งได้ในขณะนี้
คัดลอก

ใช่ฉันเพิ่งรู้ว่าฮ่า ๆ เดาว่าคุณสามารถให้ข้อจำกัดความรับผิดชอบว่าเมื่อทำรุ่นต่อไปเพียงแค่กด F5 สำหรับการทำซ้ำในอนาคตแทนที่จะคลิกที่nextลิงก์อีกครั้งและอีกครั้งหลังจากครั้งแรก
mellamokb

1
@ mellamokb ขอบคุณ ในความคิดของฉันคุณไม่จำเป็นต้องยอมรับคำตอบในแพลตฟอร์มนี้เพราะดูเหมือนว่าความท้าทายจะถูกปิด
สำเนา

35

C # - Hangman Exchange Stack

เดาชื่อของเว็บไซต์ Stack Exchange ในเกม Hangman นี้:



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


นี่คือการกระทำโดยใช้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

Clojoban! [WIP]

ฉันต้องการสร้างเกมที่ใหญ่กว่านี้เพื่อเรียนรู้Clojureดังนั้นมันใช้เวลาสักครู่เพื่อดึงออก (และใหญ่ขึ้น) ฉันสนุกมากที่ได้ทำมัน btw!

Clojoban! Restart levelNew game

. .

- No-op*

. .

** (คลิกที่นี่หากเกมไม่ตอบสนอง) *

คำแนะนำ

คุณคือ Robby ร็อบบี้หุ่นยนต์ที่ทำงานหนัก คุณทำงานในFlipCo Industriesฐานะผู้ให้บริการภาระหนัก งานของคุณคือการย้ายแต่ละbox กล่องการgoal เป้าหมายใช้จ่ายเป็นขั้นตอนน้อยที่สุด FlipCoสิ่งอำนวยความสะดวกของเป็นอันตราย มีความท้าทายและสถานที่พิเศษมากมายให้ค้นหา

หากคุณติดขัดให้คลิกRestart level(แต่จำนวนก้าวของคุณจะไม่ถูกรีเซ็ต!)


คุณสามารถเล่นได้ที่หน้าแรกของ Clojoban (แม้ว่ามันจะเป็นจุดประสงค์ของความท้าทาย) มันช่วยแก้ไขปัญหาสมอเรือที่น่าอับอายไม่ต้องใช้คุกกี้ข้ามไซต์และคุณสามารถเล่นกับแป้นลูกศรบนแป้นพิมพ์! คุณยังสามารถเล่นที่หน้าโปรไฟล์ผู้ใช้ของฉันโดยไม่มีปัญหาจุดยึดที่น่ารำคาญ

ใน Firefox ภาพไม่สั่นไหวขณะที่กำลังโหลดดังนั้นจึงสะดวกสบายในการเล่น

เกมนี้อยู่ไกลจากเสร็จสิ้นClojoban ยังคงทำงานในความคืบหน้า ท่านสามารถเข้าดู sourcecode สมบูรณ์ที่หน้าโครงการ GitHub Clojoban ของ มีข้อมูลบางอย่างในเรื่องREADMEเกี่ยวกับการบริจาค ฉันต้องการเลเวลด้วย! ดูรูปแบบระดับที่ระดับตัวอย่างเช่น คุณสามารถดูที่ตัวติดตามปัญหาของ Clojobanและดูว่าจะเกิดอะไรขึ้นต่อไป!


ตอนนี้ชื่อเสียงของคุณคือ 11 :)
mellamokb

@mellamokb ขอบคุณ! เกมฝังอยู่ตอนนี้ :)
Álvaro Cuesta

เห็นได้ชัดว่านี่ไม่ได้รับความสนใจมากนัก เคล็ดลับสำหรับการปรับปรุง?
Álvaro Cuesta

คำตอบของคุณเป็นสิ่งที่ดีฉันคิดว่าคำถามนี้โดยรวมซบเซา ฉันไม่เห็นกิจกรรมหรือคะแนนโหวตมากนักในช่วงสองสามวันที่ผ่านมา
mellamokb

นั่นเป็นเกมที่ยอดเยี่ยม! ฉันคิดว่าคุณควรทำรุ่นสแตนด์อโลน ฉันไปถึงระดับที่สามและกำจัดการกดปุ่ม 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/

แก้ไข : เปลี่ยนผลลัพธ์เป็น PNG แทน SVG (เพื่อความเข้ากันได้ของเบราว์เซอร์ที่ดีขึ้น)

แก้ไข 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

@kaoD: หากไม่มีส่วนของจุดยึด ( #) ซึ่งข้ามไปยังคำตอบที่ถูกต้องสำหรับคำถาม (ภายในโดยไม่มีการรีเฟรชหน้า) การรีเฟรชหน้าอย่างง่ายจะทำงานได้ดี (อย่างที่คุณเห็นในโปรไฟล์ที่เชื่อมโยงซึ่งมีเขาวงกตเดียวกันอยู่ด้วย) . แต่ปัญหาก็คือคุณจะพบว่าตัวเองอยู่ที่ด้านบนของหน้าหลังจากรีเฟรชทุกครั้ง ปัญหาที่แท้จริงคือเรามีข้อ จำกัด อย่างมากในสิ่งที่เราสามารถรวมไว้ในคำตอบที่นี่ใน StackOverflow (สำหรับเหตุผลที่ดีในการเรียน) เราไม่สามารถใช้ Javascript แบบสุ่มได้ ฉันไม่รู้เกี่ยวกับทางออกที่ง่าย
ChristopheD

คุณยังสามารถยึดได้และมันจะตรงไปที่โพสต์ของคุณ แต่มี URL อื่น (ซึ่งจะอนุญาตให้เล่นเกมที่ถูกต้อง) ฉันพบวิธีการ F5 clunky
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/ หมากรุก /? 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/ หมากรุก /? 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/ หมากรุก /? 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

ไม่มีคนเดินหรือขว้างเลยขอโทษ รุกฆาต / ตรวจสอบ / จนมุมการตรวจสอบที่จะดำเนินการ สไปรต์จากที่นี่: 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

1
และใน PHP, +1 สำหรับเกม PHP: p
Event_Horizon

1
@hhh: ไม่คุณเพิ่มพารามิเตอร์ในหน้าเดียวกันและสร้างรูปภาพบนเซิร์ฟเวอร์โดยการตรวจสอบRefererส่วนหัว
Ry-

5
:-( สไปรท์ของคุณเสียชีวิตแล้ว
Justin

10

เกม "Simon พูดว่า"

น่าเสียดายที่ฉันไม่สามารถรับข้อมูลนี้ได้ทันเวลาตามกำหนดเวลา (โดยพลการ) แต่ฉันต้องการแสดงภาพเคลื่อนไหวในเกมโปรไฟล์ผู้ใช้ดังกล่าวจริง ๆ และไม่มีสิ่งใดที่ส่งมาก่อนหน้านี้เป็นภาพเคลื่อนไหว เกมนี้เป็นเกมคลาสสิกของ Milton Bradley เกมSimonผู้เล่นพยายามที่จะทำซ้ำสัญญาณที่ยาวขึ้นเรื่อย ๆ

ข้อมูลเกี่ยวกับเกมนี้รวมทั้งรหัสแหล่งที่มาของที่มีอยู่ในหน้า GitHub ของมัน อาจมีข้อผิดพลาดแบบกราฟิกเป็นครั้งคราว (โดยเฉพาะอย่างยิ่งในคอมพิวเตอร์ Windows) ที่เกิดขึ้นจาก "ภาพเคลื่อนไหวแบบพาเล็ต" ที่แฮ็กซึ่งหลีกเลี่ยงความต้องการห้องสมุดภาพวาดกราฟิก การมีอยู่ของข้อผิดพลาดเหล่านี้สามารถใช้เป็นข้อแก้ตัวที่มีประโยชน์สำหรับการสูญเสียเกมนี้อย่างรวดเร็วเนื่องจากหน่วยความจำแย่มาก

นอกจากนี้เอฟเฟกต์ของเวลาแฝงสูงและแบนด์วิดท์ที่ จำกัด สามารถทำให้เกมนี้มีความท้าทายมากกว่าเกมดั้งเดิมเช่นกัน ฉันคิดว่าเพื่อให้ได้คะแนนมากกว่าห้าคะแนน (เมื่อเกมเร็วขึ้นเป็นครั้งแรก) คุณจะต้องพิจารณาว่าไฟใดกะพริบหนึ่งครั้งมากกว่าในรอบก่อนหน้าแทนที่จะขึ้นอยู่กับลำดับที่ถูกต้อง (ซึ่งยากมากที่จะ ทำ).

หากเกมนี้ใช้งานไม่ได้ (จะเริ่มใหม่ทุกครั้งที่คุณคลิกปุ่ม) เบราว์เซอร์ของคุณอาจบล็อกคุกกี้ ฉันยังไม่ได้เพิ่มวิธีแก้ปัญหาดังนั้นในขณะนี้โปรดใช้ Chrome, Opera หรือ Firefox หรือเปลี่ยนการตั้งค่า Internet Explorer หรือ Safari คุกกี้ชั่วคราว

แก้ไข 2018-05-24:ในเวลานี้ฉันได้ลบอินสแตนซ์ Heroku ที่สาธารณชนสามารถเข้าถึงได้ของแอพนี้แล้ว ฉันอาจหรือไม่อาจทำให้แอปกลับมาออนไลน์ในภายหลัง รหัสของแอปยังคงมีอยู่บน GitHub เพื่อให้คุณสามารถทำงานได้ในประเทศหรือสร้างตัวอย่างแอป Heroku คุณเองหากคุณต้องการที่จะเล่นเกม


+1 นั่นยอดเยี่ยมจริงๆ! ไม่เคยคิดที่จะสร้างภาพเคลื่อนไหว gifs แบบไดนามิก: P
mellamokb

2

หินกระดาษกรรไกร

ลิงก์ทั้งหมดไปที่หน้าโปรไฟล์ของฉันเพื่อความเร็ว

เกม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.