[23.07.2009] Interfaţa grafică (inclusiv, implementarea jocului) sunt realizate aici folosind prototype.js. Dar am renunţat (iulie 2009) să mai folosesc prototype.js, încât am izolat această aplicaţie faţă de contextul //docere.ro — numai că separarea nu este completă, încât deocamdată aplicaţia este parţial funcţională (fiind necesară ceva inventivitate pentru putea folosi partea de autentificare (care oricum arată rău…)).
Mutare: click pe piesă, apoi click pe câmpul destinaţie; operaţia are efect numai pentru mutări legale (şi numai în modul tacit "execută o nouă mutare"). În dreapta tablei de şah apare "fişa partidei"; click pe o mutare actualizează poziţia pe tablă (folosiţi apoi butoanele din stânga lui Reia). Din modul "parcurgerea fişei" se revine la modul "execută o nouă mutare" prin click Reia.
Nu se testează situaţia de mat! Dacă sunteţi la mutare şi constataţi că nu are efect nicio secvenţă de două click-uri (pe piesa de mutat şi pe câmpul destinaţie) - atunci e mat (sau pat) şi aveţi o singură opţiune: Cedează (sau Remiză).
Nu folosiţi ENTER, ci click (în casete sau pe buton; de exemplu v. rubrica LOGIN)! Procedura practică de schimbare Nume / Parolă este incomodă, dar probabil că ea nici nu trebuie folosită decât o singură dată!
Omisiuni (eventual, temporare): nu se trimite înştiinţare de răspuns prin mail; nu se pot schimba mesaje (chat), ci doar mutări; nu se poate răspunde cu o secvenţă de mutări (ci doar cu o singură mutare); ritmul de joc nu este stabilit (6 zile pe mutare).
LOGIN: ?
LOGIN: ?
Tasta F5 ("Reload"), precum şi combinaţia de taste CTRL F5 actualizează/reiniţializează/"repară" conţinutul. Codul programului va fi uneori modificat (vezi jurnal); pentru a angaja ultima variantă de program (şi nu tot pe cea veche), trebuie să folosiţi CTRL F5 (sau Clear private Data pentru a şterge Cache).
Este recomandabil să folosiţi Firefox; altfel (IE6) — semnalaţi eventualele defecte (şi vezi jurnal).
Retrage vizează ultima mutare efectuată de Dvs. pe tablă, de exemplu pe parcursul investigării unei variante de joc (nu vizează retragerea mutării trimise deja ca răspuns la ultima mutare a partenerului).
Click pe un titlu referitor la "partide" (Partide încheiate, etc.) actualizează lista respectivă. Nu se testează automat dacă partenerul a răspuns, dar fiecare click în lista din Partide proprii re-actualizează / re-iniţializează fişa partidei.
—inseraţi eventual şi adresa Mail proprie—
Nu se actualizează "automat". Nu se testează automat dacă partenerul a răspuns între timp, pentru că în fond este vorba de şah prin corespondenţă (şi nu de şah "on-line"). În schimb, fiecare nou click în Partide proprii neîncheiate va re-actualiza fişa partidei (incluzând deci şi eventualul răspuns "on-line" al partenerului). Însă în principiu, la şah prin corespondenţă primeşti mutarea, meditezi (analizezi) o zi două (1..6 zile) şi apoi răspunzi (după ce revii aici, în cazul nostru); analiza variantelor de joc se poate face chiar pe tabla expusă aici (mutările respective nu sunt transmise adversarului).
Nu se testează situaţia de mat. Câtă vreme nu este vorba de un program de şah "Human - Computer" şi nici de analiza şi evaluarea variantelor de joc, jucătorul (nu programul) trebuie să decidă dacă este în situaţia de a ceda, sau de a propune ori accepta încheierea jocului prin remiză; este suficient ca programul să nu permită decât mutări legale (indiferent dacă sunt bune, sau nu; dacă utilizatorul nu poate executa nici o mutare, atunci el este în poziţie de mat/pat şi nu vedem de ce ar fi necesar ca programul să-i anunţe acest fapt, câtă vreme utilizatorul cunoaşte regulile de bază ale jocului).
Imitări. Decizia de a nu implica testarea de mat/pat (care ar fi necesară la fiecare mutare) are implicaţii majore; de exemplu, nu mai este necesară generarea listei tuturor mutărilor legale în (fiecare) poziţie. Această opţiune iniţială este la limita dintre bun şi rău, pentru concepţia unui program de şah; dar datorită acestei decizii (rare!), am putut evita imitarea programelor cunoscute - cu o singură excepţie importantă: pentru "tabla de şah" am adoptat reprezentarea DOM concepută şi oferită de [mishoo]; aceasta asigură o gestionare eficientă şi elegantă a poziţiilor şi mutărilor, în cadrul programului.
Valoare didactică. Scopul nostru nu a fost acela de a oferi un server de şah prin corespondenţă pentru jucătorii profesionişti... Aici scopurile ţin de "laborator": a oferi exemple instructive (şi dacă se poate, originale) de concepţie, dezvoltare şi analiză a unor aplicaţii; urmează deci să rescriem programul (restructurare, concentrare, modularizare) şi să-l "tutorializăm" corespunzător în Laborator-ul nostru (Martie—Iunie 2008).
[15.02.2008] Greşală N-am testat deloc funcţionarea în IE-6... Fiecare etapă a dezvoltării trebuia testată şi în IE-6 (altfel, doar la sfârşit - e foarte greu să mai depistezi de ce nu merge în IE-6).
[16.02] IE: Every visit to page Prima constatare pe un browser IE-6: piesele apar pe tablă una-câte-una (în loc să apară "deodată", ca în Firefox). E vorba de un bug (deşi Microsoft precizează undeva: This behavior is by design) numit IE6 flicker şi care (simplificând) constă în: imaginea dispare temporar sau fâlfâie, când treci cu mouse-ul peste ea; se întâmplă aşa pentru că IE-6 re-încarcă de pe server imaginea (desigur, este avantajos pentru Microsoft—tocmai de aceea, "This behavior is by design": se sporeşte considerabil numărul de accesări contabilizate pentru Internet Explorer — v. analiza din IE: Popularity theft).
Există acum diverse remedii (la nivelul programării), faţă de IE6 flicker. Dar şi însuşi utilizatorul ar putea "repara", efectuând o anumită setare: în Tools — Internet Options — Temporary Internet Files — Settings — Check for newer versions of stored pages: trebuie aleasă altă opţiune decât Every visit to the page. Această reparaţie manuală, aşa de simplă, nu este neapărat şi bună: dacă în pagina respectivă sunt aduse (prin program) la un anumit moment date noi de pe server, atunci (mai ales dacă opţiunea menţionată este "Never") IE va arăta probabil tot vechea pagină (fără înnoirea datelor)...
[23.02] IE: variable not defined La click pe calul g1 (ca să-l mut pe f3): "variable Knight_Moves not defined" (analog, la click pe un pion). Variabila var Knight_Moves = { a1 : $w('b3 c2'), b1 : $w('a3 c3 d2'), etc. , g8 : $w('f6 e7 h6'), h8 : $w('g6 f7'), }; reprezintă într-un "hash" toate mutările posibile de cal (de pe câmpul a1 calul poate muta pe câmpurile: b3, c3; etc.). În perl un hash se poate încheia prin "," - dar nu şi în javascript (cel puţin, nu pentru IE-6); am eliminat desigur, virgula finală.
[24.02] IE: object doesn't support this property or method... IE diferă de browserele moderne în privinţa posibilităţii de a extinde obiectele DOM native. De exemplu, $('someElement').parentNode.hide() implică metoda hide(), care nu este prevăzută nativ de DOM, ci este o extindere adăugată de prototype.js; ori IE nu permite adăugarea de metode la prototipul obiectelor native ("object doesn't support..."). prototype.js a prevăzut o metodă de extindere explicită: Element.extend() şi un "shortcut": $($('someElement').parentNode).hide() va funcţiona acum şi în IE (all elements returned by the $() function are extended with Prototype DOM extensions). Lucrând numai cu Firefox (greşală?), am neglijat această subtilitate...
[10.03] Mutare ilegală. În partida vlad—bogdan la mutarea 20.Nd3-b5 şah s-a răspuns 20...O-O-O (ilegal: regele aflat în şah nu are dreptul de rocadă); acest caz mi-a scăpat iniţial, dar acum am corectat (şi bineînţeles... am cedat partida).
[10.03] On-line Am adăugat o stratagemă pentru a stabili care sunt jucătorii logaţi la un moment dat (partenerii logaţi simultan pot—eventual—să joace "on-line", clickând din când în când pe partida respectivă pentru actualizarea listei mutărilor efectuate).
[12.03] Încă o surpriză. Mi s-a semnalat că programul nu gestionează corect mutarea pionului; de exemplu este posibilă secvenţa ilegală: 1.e2-e4 e7-e5 2.e4-e5 (sau 2.Cf3 e5-e4). Programul angajează un control general asupra câmpului pe care mută piesa, dar mi-a scăpat cazul concret al câmpului din faţa pionului; acum am corectat (printr-o linie de forma: dacă Pion şi dacă mută pe aceeaşi coloană şi dacă destinaţie=ocupat atunci Return false).