एक उपयोगकर्ता-प्रोफ़ाइल मिनी-गेम बनाएं


49

कल, मैं एक बहुत चालाक चीज पर ठोकर खाई।

मिनिटेक की टिक-टैक-टो प्रोफ़ाइल गेम

हां, वह उपयोगकर्ता प्रोफ़ाइल पृष्ठ पर, टिक-टैक-टो से काम करने वाला कार्यान्वयन है @minitech। बेशक, जिस क्षण मैंने इसे देखा, मुझे उसके विचार को उलट-पलट कर इंजीनियर बनाना पड़ा : पी

हनोई प्रोफ़ाइल गेम के मेलमोकब के टॉवर

यहाँ मेरा अपना उदाहरण सीधे पोस्ट में सन्निहित है। यह कार्यान्वयन विवरणों के एक जोड़े के कारण मैं एक अच्छा समाधान के लिए काम नहीं किया है के कारण यह एक छोटी गाड़ी है। कभी-कभी खूंटी क्लिक करने के बाद, यह तब तक ठीक से अपडेट नहीं होता, जब तक कि कोई दूसरा पृष्ठ ताज़ा न हो जाए:

हनोई के टावर

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 जुलाई, 2012 @ 11:59 ईएसटी) द्वारा प्रतियोगिता जीतते हैं।
  • टाई होने की स्थिति में, पुराना उत्तर जीत जाता है।

1
+1 सरल, लेकिन शानदार विचार! BTW - मुझे लगता है कि समय सीमा के लिए आप 2 जून , 2012 का मतलब है ।
क्रिस्टियन ल्यूपस्कू

डेरप, हाँ मैंने किया था, धन्यवाद :)
मेलामोक

1
@boothby: मैं वास्तव में अपना उत्तर हटाने के बारे में सोच रहा था। इरादा एक ठोस उदाहरण प्रदान करना था, प्रतियोगिता को जीतने के लिए नहीं (या वोट, मैं प्रतिनिधि के बारे में बहुत परवाह नहीं करता)। क्या आप प्रतियोगिता के लिए कुछ रचनात्मक सुझाव दे सकते हैं? आप क्या समय सीमा तय करना चाहेंगे? आपको भाग लेने के लिए प्रेरित करने के लिए कल्पना कैसे बदलनी चाहिए?
मेलमोकब

4
मैंने अभी देखा कि मिनिटेक का AI टिक-टैक-टो का सही खेल नहीं खेल सकता है। प्ले सेंटर, बॉटम-लेफ्ट, टॉप-सेंटर, सेंटर-राइट, सेंटर-लेफ्ट।
PhiNotPi

1
@ Mr.Wizard: एफएफ 12.0 और विंडोज 7 पर यहां ठीक काम कर रहा है, क्या आप इस बारे में अधिक जानकारी पोस्ट कर सकते हैं कि क्या काम नहीं कर रहा है?
क्रिश्चोफैड

जवाबों:


27

कॉनवे का जीवन का खेल

+1 पीढ़ी - +5 पीढ़ी - ज़ूम इन - ज़ूम आउट करें

लोड पैटर्न: यादृच्छिक - ग्लाइडर - gunstar - घोंघा - lwss - lightspeedoscillator1 - गिलास

पायथन और एसवीजी आउटपुट का इस्तेमाल किया। मैंने पहली बार एकल पिक्सेल का उपयोग करने की कोशिश की है (ताकि आप एकल कोशिकाओं को टॉगल कर सकें), लेकिन यह काम नहीं करता था, क्योंकि ब्राउज़र छवियों को क्रम में लोड नहीं करता है। इसके अलावा, मेरे वेबसर्वर को क्रैश किए बिना इस तरह के बहुत बड़े पैटर्न संभव हैं।

अपडेट करें:

मैंने अजगर के साथ कुछ मज़ेदार किया और कई सुविधाएँ और सुधार जोड़े:

  • जनसंख्या संख्या, ज़ूम और नाम के साथ HUD जोड़ा गया
  • Rle प्रारूप में पैटर्न अब पैरामीटर (जैसे ) का उपयोग करके लोड किया जा सकता है ( लंबी सूची , के माध्यम से )। फ़ाइल का आकार 1.5kB तक सीमित हैpattern?pattern=glider
  • nextपैरामीटर का उपयोग करके, एक समय में 5 तक सीमित n पीढ़ियों को आगे बढ़ा सकते हैं
  • थोड़ा सुधार एल्गोरिथ्म। हालांकि यह वास्तव में तेज़ नहीं है, मैं चाहता हूं कि यह सरल रहे
  • यह अब स्टैंडअलोन भी काम करता है (या तो संदर्भकर्ता या अपने स्वयं के क्वेरी स्ट्रिंग का उपयोग करता है): https://copy.sh/fcgi-bin/life2.py?pattern=gosperglideridergun


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()

आप आगे अजगर अजगर उपमिश्रण के लिए एक टेम्पलेट के रूप में मेरे कोड ले सकते हैं।


+1 बहुत बढ़िया! एक सुझाव: #5946अपने लिंक को संलग्न करें, और यह हर अपडेट के बाद आपके पोस्ट पर वापस आ जाएगा।
मेलमोकब

हम्म .. कम से कम यह काम किया जब मैंने इसे कोशिश की .. आह। क्योंकि हनोई के टावर्स में आप हमेशा अलग-अलग खूंटों पर क्लिक करते हैं। हम्म
मैलामोकब

@mellamokb यह काम करता है, लेकिन आप अब एक ही लिंक पर दो बार क्लिक नहीं कर सकते हैं
कॉपी करें

हां, मुझे एहसास हुआ कि लोल। लगता है कि आप एक डिस्क्लेमर दे सकते हैं कि अगली पीढ़ी nextकरते समय, पहली बार के बाद बार-बार लिंक पर क्लिक करने के बजाय भविष्य के पुनरावृत्तियों के लिए F5 दबाएं ।
मेलमोकब

1
@ मेलेलमोक धन्यवाद मेरी राय में आपको वास्तव में इस प्लेटफ़ॉर्म पर उत्तर स्वीकार करने की आवश्यकता नहीं है, क्योंकि ऐसा लगता है कि जैसे चुनौती बंद हो गई है
कॉपी करें।

35

सी # - स्टैक एक्सचेंज जल्लाद

इस जल्लाद खेल में स्टैक एक्सचेंज वेबसाइटों के नाम अनुमान:



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 - वह वर्ग जो सभी जीडीआई कुरूपता का सामना करता है
  • ImageResult- एक कस्टम ActionResultजो गतिशील रूप से उत्पन्न छवि को वापस करने के लिए उपयोग किया जाता है

संपूर्ण कोड सूची http://pastebin.com/ccwZLknX पर उपलब्ध है


+1 वाह, तुम लोग कमाल हो :)। अब तक के विचारों की तरह!
मेलमोकब

शांत, appharbor.com के बारे में कभी नहीं सुना। क्या आप वास्तव में अपने उत्तर की मेजबानी के लिए भुगतान कर रहे हैं?
मेलमोकब

@mellamokb नहीं, मैं Appharbor की मुफ्त होस्टिंग योजना का उपयोग कर रहा हूं। अगर यह बहुत अधिक हो जाता है, तो मुझे लगता है कि मुझे भुगतान करना होगा ... :)
क्रिस्टियन लुपस्कू

2
यदि आवश्यक हो तो मैं उल्लेख करने जा रहा था, मैं अपनी होस्टिंग साइट पर कस्टम उपडोमेन होस्टिंग और एफ़टीपी एक्सेस प्रदान कर सकता हूं।
मेलमोकब

@ mellamokb धन्यवाद, लेकिन मुझे लगता है कि यह होस्टिंग करेगा। मैं कई क्लिक के बारे में मजाक कर रहा था। :)
क्रिस्टियन लुपस्कू

19

Clojoban! [विप]

मैं क्लोजर सीखने के लिए इसमें से एक बड़ा खेल बनाना चाहता था , इसलिए इसे खींचने में थोड़ा समय लगा (और बहुत बड़ा हो गया।) मुझे बहुत मज़ा आया है, इसे btw!

Clojoban! Restart levelNew game

। ।

- No-op*

। ।

** (खेल अनुत्तरदायी हो जाता है तो यहां क्लिक करें) *

अनुदेश

आप रॉबीएक मेहनती रोबोट हैं रॉबी । आप FlipCo Industriesएक भारी भार वाहक के रूप में काम करते हैं । आपका काम प्रत्येक box एक बक्साको goal एक लक्ष्यखर्च के रूप में संभव के रूप में कुछ चरणों में स्थानांतरित करना है। FlipCoसुविधाएं खतरनाक हैं । खोज करने के लिए बहुत सारी चुनौतियाँ और विशेष स्थान हैं।

यदि आप अटक जाते हैं, तो क्लिक करें Restart level(लेकिन आपकी चरण गणना रीसेट नहीं होगी!)


आप क्लोजोबैन के फ्रंट पेज पर भी खेल सकते हैं (हालांकि यह चुनौती के उद्देश्य को बर्बाद कर देता है।) यह कुख्यात लंगर समस्या को ठीक करता है, क्रॉस-साइट कुकीज़ की आवश्यकता नहीं होती है और आप अपने कीबोर्ड तीर कुंजी के साथ खेल सकते हैं! आप मेरे उपयोगकर्ता प्रोफ़ाइल पर भी खेल सकते हैं कष्टप्रद लंगर समस्या के बिना पृष्ठ ।

फ़ायरफ़ॉक्स में छवि झिलमिलाती नहीं है, जबकि यह लोड हो रहा है इसलिए यह खेलने के लिए थोड़ा अधिक आरामदायक है।

यह खेल पूर्ण होने से एफएआर है, क्लोजोबैन अभी भी प्रगति पर है । आप क्लोजोबैन के गिटहब प्रोजेक्ट पेज पर पूरा सोर्सकोड देख सकते हैं । योगदान के बारे में README में कुछ जानकारी है । मुझे स्तर भी चाहिए! उदाहरण के स्तर पर स्तर प्रारूप देखें । आप क्लोजोबैन के मुद्दे पर नज़र रख सकते हैं और देख सकते हैं कि आगे क्या हो रहा है!


अब आपकी प्रतिष्ठा 11 :)
mellamokb

@ मेलेलमोक धन्यवाद! गेम अब एंबेडेड है :)
rolvaro Cuesta

जाहिर तौर पर इस पर ज्यादा ध्यान नहीं गया। सुधार के लिए कोई सुझाव?
लवारो क्यूस्टा

आपका उत्तर अच्छा है, मुझे लगता है कि यह प्रश्न कुल मिलाकर स्थिर हो गया है। मैंने पिछले कुछ दिनों से बहुत अधिक गतिविधि या वोट नहीं देखे हैं।
मेलमोकब

यह एक महान खेल है! मुझे लगता है कि आपको एक स्टैंडअलोन संस्करण बनाना चाहिए; मैं तीसरे स्तर पर पहुंच गया और नो-ऑप बटन दबाने से छुटकारा पाया। :) वैसे भी, महान काम!
क्रिस्टियन लुपस्कू

17

भूल भुलैया

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

मैंने यहां मिलने वाले PHP भूलभुलैया जनरेटर से शुरुआत की: http://dev.horemag.net/2008/03/01/php-maze-generation-class/

संपादित करें : एसवीजी (बेहतर क्रॉस ब्राउज़र संगतता के लिए) के बजाय आउटपुट को पीएनजी में बदल दिया।

संपादित 2: IE कुकी संगतता को ठीक करने के लिए एक हेडर जोड़ा। अब सभी प्रमुख ब्राउज़रों में सही ढंग से काम करना चाहिए।

यदि आप एक ही दिशा दो बार लेते हैं (लंगर लिंक के कारण) तो छवि ताज़ा नहीं होती है। दूसरी बार F5 दबाएं, या मेरे स्टैकओवरफ़्लो प्रोफ़ाइल पर भूलभुलैया खेलें ।

EDIT 3: आसानी से दो बार एक ही दिशा लेने में सक्षम होने के लिए एक नो-ऑप बटन जोड़ा गया (नीचे टिप्पणियां देखें)।

<?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अपने लिंक के अंत में जोड़ें । अन्यथा, भूलभुलैया को हल करने के लिए किसी के पास पर्याप्त धैर्य नहीं होगा।
क्रिस्टियन लुपस्कू

@ W0lf: धन्यवाद। मैंने #लिंक को शामिल करने के बारे में सोचा था, लेकिन समस्या यह है कि वे पृष्ठ को ताज़ा नहीं करते हैं जब आप एक ही दिशा दो बार लेते हैं (जो भूलभुलैया में हो सकता है; ;-) मैंने उन्हें अभी जोड़ा है इसलिए लोगों को दूसरी बार F5 दबाना होगा क्योंकि वे उसी दिशा में जाना चाहते हैं। एक और विकल्प इसे यहाँ खेलने के लिए है (मेरी SO प्रोफ़ाइल: stackoverflow.com/users/81179/christophed )
ChristopheD

मैं एक सरल नो-ऑपरेशन लिंक (रिफ्रेश?) को अपडेट
करूंगा

@kaoD: एंकर भागों के बिना ( #) जो प्रश्न के सही उत्तर के लिए कूदते हैं (आंतरिक रूप से, पृष्ठ ताज़ा किए बिना), एक साधारण पृष्ठ ताज़ा ठीक काम करेगा (जैसा कि आप मेरी लिंक की गई प्रोफ़ाइल पर देख सकते हैं जहां वही भूलभुलैया भी उपलब्ध है) । लेकिन तब समस्या यह होगी कि आप हर ताज़ा होने के बाद अपने आप को पृष्ठ के शीर्ष पर पाएंगे। वास्तविक समस्या यह है कि हम वास्तव में उस स्थिति में सीमित हैं जिसे हम स्टैकऑवरफ्लो पर एक उत्तर में शामिल कर सकते हैं (पाठ्यक्रम से अच्छे कारण के लिए), हम उदाहरण के लिए मनमाने ढंग से जावास्क्रिप्ट का उपयोग नहीं कर सकते हैं। मुझे कोई आसान तरीका नहीं सूझ रहा है।
क्रिस्टोफ़ीड

आपके पास अभी भी एंकर हो सकता है और यह सीधे आपके पोस्ट पर जाएगा, लेकिन एक अलग URL के साथ (जो सही गेमप्ले की अनुमति देगा।) मुझे F5 विधि क्लंकी लगती है।
काओड

14

2-खिलाड़ी पोकेमोन शतरंज [कार्य प्रगति पर]

क्योंकि यह इस तरह से अधिक मजेदार है। किसी दिन आ रहा है: ऐ, सममितीय ग्रिड, और छाया!

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

मुझे यह पसंद है, लेकिन दोनों पक्ष अलग-अलग पोकेमॉन होने चाहिए!
मि। जेंडर

बहुत अच्छा। मुझे यह पसंद है कि जब भी मोड़ बदले तब मेज पलट जाए।
क्रिस्टियन लुपस्कू

1
और PHP में, PHP के खेल के लिए +1: p
Event_Horizon

1
@hhh: नहीं, आप एक ही पृष्ठ में पैरामीटर जोड़ते हैं और Refererहेडर की जांच करके सर्वर पर छवि (ओं) को उत्पन्न करते हैं ।
Ry-

5
:-(। आपका स्प्रिट मर गया है।
जस्टिन

10

"साइमन कहते हैं" खेल

दुर्भाग्य से, मुझे समय पर (कुछ हद तक) मनमाने तरीके से यह सबमिशन नहीं मिला, लेकिन मैं वास्तव में इस तरह के यूजर प्रोफाइल गेम में एनीमेशन प्रदर्शित करना चाहता था, और पिछले सबमिशन में से कोई भी एनिमेटेड नहीं है। यह खेल क्लासिक मिल्टन ब्रैडली खेल साइमन का एक क्लोन है , जिसमें खिलाड़ी संकेतों के एक लंबे लंबे अनुक्रम को दोहराने की कोशिश करता है।

इस गेम की जानकारी, इसके सोर्स कोड सहित, इसके GitHub पेज पर उपलब्ध है । हैकिश "पैलेट एनीमेशन" से उत्पन्न होने वाले कभी-कभी ग्राफिकल ग्लिच (विशेषकर विंडोज कंप्यूटर पर) हो सकते हैं, जो कि ग्राफिक्स ड्राइंग लाइब्रेरी की आवश्यकता से बचाते हैं। इन ग्लिट्स का अस्तित्व भयानक स्मृति के कारण इस गेम को जल्दी से खोने के लिए एक उपयोगी बहाने के रूप में काम कर सकता है।

इसके अतिरिक्त, उच्च विलंबता और सीमित बैंडविड्थ के प्रभाव इस खेल को मूल की तुलना में बहुत अधिक चुनौतीपूर्ण बना सकते हैं। मुझे लगता है कि पांच से अधिक अंक प्राप्त करने के लिए (जब खेल पहले गति बढ़ाता है), आपको यह निर्धारित करने की आवश्यकता होगी कि कौन सा प्रकाश सही अनुक्रम के आधार पर पिछले दौर की तुलना में एक बार अधिक चमकता है (जो कि बहुत कठिन है) करना)।

यदि यह गेम आपके लिए काम करने में विफल रहता है (यह हर बार जब आप एक बटन क्लिक करते हैं), तो आपका ब्राउज़र इसकी कुकी को अवरुद्ध कर सकता है। मैंने अभी तक वर्कअराउंड नहीं जोड़ा है, इसलिए समय के लिए, कृपया क्रोम, ओपेरा, या फ़ायरफ़ॉक्स का उपयोग करें या अस्थायी रूप से अपने इंटरनेट एक्सप्लोरर या सफारी कुकी सेटिंग्स को बदल दें।

संपादित करें 2018-05-24: इस समय, मैंने इस ऐप के सार्वजनिक रूप से सुलभ हरोकू उदाहरण को हटा दिया है। मैं बाद की तारीख में एप्लिकेशन को ऑनलाइन वापस रख सकता हूं या नहीं कर सकता। ऐप्लिकेशन के कोड अभी भी GitHub पर उपलब्ध है, तो आप या तो इसे स्थानीय स्तर पर चलाने के लिए या यदि आप खेल खेलने के लिए चाहते हैं अपनी खुद की Heroku एप्लिकेशन उदाहरण बना सकते हैं।


+1 यह बिल्कुल शानदार है! गतिशील रूप से उत्पन्न चेतन
जिफ

2

रॉक कागज कैंची

सभी लिंक गति के लिए मेरे प्रोफ़ाइल पृष्ठ पर जाते हैं।

खेल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.