Dagaz: قصة مثابرة

لا يمكن تمييز أي تقنية متقدمة بما فيه الكفاية عن السحر.
آرثر كلارك
 
- لا أريد أن أكون مقارنة بعد الآن ... اجعلني استعارة.
China Mieville


العمل في مشروع كبيرمشابه للغوص في المترو . لحل مشاكل معينة ، نفتح فرصًا جديدة. بمرور الوقت ، تزداد هذه الفرص قوة ، وتتواصل مع الفرص الأخرى ، وهذا يسمح لنا بحل المشاكل القديمة والأكثر أهمية وتعقيدًا بطريقة جديدة غير متوقعة تمامًا. لدي مثال جيد على هذا الموضوع. وأريد التحدث عنه.

تم تصور وحدة الإعداد المشترك كأداة تصحيح بسيطة. في كثير من الأحيان ، من المفيد جدًا أن تكون قادرًا على العودة إلى موضع معين من أجل توطين المشكلة. لكن هذا الترتيب للأرقام ينشأ في اللعبة بشكل عابر ، واستعادتها تستحق عملًا كبيرًا. كنت بحاجة إلى أداة لأتمتة هذه العملية ، وقد فعلتها. في الواقع ، يمكنني بسهولة ترميز أي موضع من خلال وصف موقع القطع على اللوحة:

؟ setup = 0c3؛ 0a2؛ 0c2؛ 0d2؛ 1a1؛ 4b1؛ 5c1؛ 1d1؛ -1a4؛ 4b4؛ 5c4؛ 1d4؛ 0a3؛ 0d3؛ 0b2 ؛؛ & turn = 0

بعد ذلك ، يمكنني إضافة هذه المعلمات إلى عنوان URL لإعادة إنتاج الموقف. هذا ما يفعله الإعداد المشترك. تحفظ الوحدة وصف جميع المراكز الوسيطة في السجل وتجعل من الممكن استنساخها. هذه ليست آلية مثالية للغاية. على سبيل المثال ، لا يعطينا هذا الوصف أي شيء إذا لم نكن نعرف اللعبة التي ينتمي إليها. هناك أوجه قصور أخرى ، سأناقشها لاحقًا. حان الوقت الآن للقاء المشارك التالي في قصتنا.


جاء خيار المستويات التقدمية من Zillions of Games ولم أفهم لفترة طويلة سبب الحاجة إليه. حاول إيقاف تشغيل كل المصابيح (الأمر بسيط) وستفهم ما أتحدث عنه. بعد فوز اللاعب ، تنظر المستويات التقدمية إلى عنوان url الحالي ، وإذا وجد رقمًا فيه ، فإنه يزيده بمقدار واحد. في الواقع ، هذه طريقة رائعة لإشراك اللاعب ، لكن قدراته لا تقتصر على ذلك. هناك ألعاب تتكون من عدة جولات. بعد الانتهاء من واحد ، يقوم اللاعبون ، وفقًا لقواعد معينة ، بإعادة توزيع القطع والبدء في اللعب مرة أخرى.


غالبا ما يمارس هذا النهج في mankali الأفريقي . في Ovalhu ، على سبيل المثال ، لا تبدأ اللعبة مرة أخرى فقط. يستخدم اللاعبون الحبوب التي تم التقاطها في الجولة السابقة لملء ثقوبهم في البداية. تعتبر الثقوب التي فشلت في ملئها تُسقط من اللعبة ؛ لا يمكن استخدامها. في الواقع ، في كل جولة يتم لعب لعبة جديدة ، على لوحة جديدة. فقط عندما يكون الخاسر في الجولة التالية ، لا يمكن للاعب ملء حفرة واحدة على الأقل ، يتم الاعتراف بهزيمته النهائية.

يمكن فهم هذه الفرصة على نطاق أوسع.

, . common-setup . , , , . , .


, . «» , . , "Magyar Dama" ( , «»), Hive, , . , , , , , .


( , roguelike-). «», seed, . , ( ). (, ), .


, , . . "", , , , .

تم اتخاذ الخطوة التالية عن طريق الصدفة تقريبا. هناك صوت في ألعابي. أنا حقا أحبه ، ولكن ربما هناك أشخاص في العالم يزعجهم. كان من الممكن بالنسبة لهم إيقاف تشغيله. يبدو أن هذا يعمل بشكل جيد ، ولكن لم يتم حفظ الإعدادات في أي مكان ، وبعد تحديث كل صفحة ، كان يجب إيقاف تشغيل الصوت مرة أخرى (وهذا يزعج أكثر). لقد طُلب مني إصلاح هذه المشكلة بطريقة أو بأخرى وكان أول حل يخطر ببالي هو ملف تعريف الارتباط (الحل الأول ليس ناجحًا دائمًا).

هنا كيف بدا
Dagaz.Controller.sound = function() {
    if (Dagaz.Controller.soundOff) {
        sound.innerHTML = "no Sound";
        Dagaz.Controller.soundOff = false;
        document.cookie = "dagaz.sound=on";
    } else {
        sound.innerHTML = "Sound";
        Dagaz.Controller.soundOff = true;
        document.cookie = "dagaz.sound=off";
    }
}

لم أكن أرغب في الرمي ، لذا كانت ملفات تعريف الارتباط قصيرة الأجل حتى يتم إغلاق نافذة المتصفح. ثم فكرت: "لماذا لا تدرس الإعداد المشترك لتخزينه في ملفات تعريف الارتباط أيضًا؟" اضطررت إلى تعيين معلمة الحد الأقصى للعمر ، لكن الأمر كان يستحق ذلك. أولاً ، تم حفظ حالة اللعبة الآن عندما تم إغلاق النافذة عن طريق الخطأ. كمكافأة ، لم يؤدي تبديل وضع اللعبة باستخدام AI / no bot إلى إعادة تعيين اللعبة. كان ذلك عظيما!

بالطبع ، كان علي تقديم شيء آخر
, , , , cookie ( ). «New game», . . , common-setup , ? cookie ( , ).

-
var getName = function() {
  var str = window.location.pathname.toString();
  var result = str.match(/\/([^.\/]+)\./);
  if (result) {
      return result[1].replace("-board", "").replace("-ai", "");
  } else {
      return str;
  }
}

var badName = function(str) {
  var result = str.match(/[?&]game=([^&*]*)/);
  if (result) {
      return result[1] != getName();
  } else {
      return true;
  }
}

var getCookie = function() {
  var str = document.cookie;
  var result = str.match(/dagaz\.(setup=[^*]*)/);
  if (result) {
      var r = decodeURIComponent(result[1]);
      if (badName(r)) return "";
      return "?" + r;
  } else {
      return "";
  }
}

var getSetup = function() {
  var str = window.location.search.toString();
  var result = str.match(/[?&]setup=([^&]*)/);
  if (result) {
      return result[1];
  } else {
      str = getCookie();
      result = str.match(/[?&]setup=([^&]*)/);
      if (result) {
          return result[1];
      } else {
          return "";
      }
  }
}

Dagaz.Model.getSetup = function(design, board) {
  var str = "";
  ...
  str = str + ";&turn=" + board.turn;
  if (Dagaz.Controller.persistense == "setup") {
      var s = str + "&game=" + getName() + "*";
      var maxage = getMaxage();
      if (maxage) {
        document.cookie = "dagaz.setup=" + encodeURIComponent(s) + "; max-age=" + maxage;
      } else {
        document.cookie = "dagaz.setup=" + encodeURIComponent(s);
      }
  }
  return "?setup=" + str;
}

, . , ( Pasang Chaturanji) , , , (Morris, Bolotoudou) common-setup , . , !


. ( , ). , Stratego Luzhanqi, ( ). (common-setup, , ), …


, , , common-setup , . ( Mana, , ), , .

, , . , random, c seed , , , - . , seed cookie, , , , .

لسوء الحظ ، هناك ألعاب لا تكون طريقة حفظ الحالة فيها بواسطة وحدة الإعداد المشترك مناسبة. في Kamisado المذكورة أعلاه ، تعتمد القدرة على إتمام النقل (لجميع التحركات باستثناء الخطوة الأولى) على الحقل الذي تم الانتهاء من الخطوة السابقة. هناك ألعاب بميكانيكا أكثر تعقيدًا:


في المطحنة ، بالإضافة إلى التحركات المعتادة ، هناك مكافآت إضافية - إذا قام اللاعب بترتيب قطعه الثلاث على التوالي ، فلديه الحق في إزالة قطعة خصم واحدة من اللوحة. بالإضافة إلى ذلك ، تحظر القواعد بناء نفس الثلاثية مرتين على التوالي. كل هذا يعني أنه لكي تعمل اللعبة بشكل صحيح ، يجب عليك حفظ تاريخ التحركات السابقة. لحسن الحظ ، هناك مثل هذه الفرصة. تحفظ

وحدة مدير الجلسة سجل اللعبة ، مما يسمح للاعب بالعودة مرة واحدة أو أكثر من الحركات ، وربما يؤدي إلى حركة أخرى. أيضًا ، يرتبط خيار المستشار بهذه الآلية ، التي تخبر اللاعب بالتحرك المحتمل عند اللعب مع البوت. في وقت لاحق ، تبدو فكرة حفظ تاريخ اللعبة في ملفات تعريف الارتباط واضحة ، لكنني لم أتناولها على الفور.

ظهرت لعبة المراسلات لأول مرة
Dagaz . - , "Zillions of Games", 1998 . 2003 Zillions , , . Ed van Zon . "MindSports", .


MindSports Dagaz . Ed , Java-, , , . , Ed Dagaz, .

, , , , . , Dagaz, , - backend-, JavaScript- . Ed session-manager, . , , , , , , ( , ), , .

SGF , , session-manager , SGF . , , , , SGF ( , ). , MindSports, , 80 Dagaz .

كانت الخطوة التالية واضحة جدًا - لقد بدأت في حفظ وصف SGF- للأطراف في ملفات تعريف الارتباط ، ثم أخبروني أنه لم يكن حديثًا جدًا ونقلت كل شيء إلى localStorage (مما أدى إلى تبسيط الرمز وحل بعض مشاكل التصحيح في Google Chrome). عند هذه النقطة ، قد يكون لدى القارئ سؤال. لدي آليتان للغرض نفسه ، وأحدهما أكثر مثالية من الآخر. لماذا لا تحول جميع الألعاب إلى استمرار الجلسة؟ للأسف ، هذا ليس بهذه البساطة.

هناك مجموعات كاملة من الألعاب التي لا تنطبق عليها جلسات الحفظ:

  1. (Shatranj, Sittuyin, Janggi, Stratego, Luzhanqi, Banqi )
  2. , session-manager (Ur, Puluc, Shen, Backgammon, Chaturaji )
  3. (Kamisado, Washington, Ohvalhu)
  4. أخيرًا ، هناك ألعاب لا يمكن فيها استخدام استمرار مدير الجلسة ، لأسباب تتعلق بالأداء (من الغريب ، في Fanorona ، على الرغم من بساطتها الواضحة ، في بداية اللعبة ، هناك عدد كبير من الظهورات المحتملة ذات الصلة بتفاصيل أخذ في هذه اللعبة)

بشكل عام ، لدي آليتان مصممتان بشكل عام لنفس الشيء. وهذا أمر رائع ، لأنه يمكنني اختيار التطبيق الذي أريد تقديمه.

All Articles