Verificare aray cu mutari de sah preluat cu Ajax

Discutii si intrebari legate de scripturi si functii JavaScript, jQuery si Ajax, cod JavaScript in general.
andras
Mesaje: 430

Verificare aray cu mutari de sah preluat cu Ajax

In array-ul parinte am un set de mutari care definesc o diagrama de sah (aici am 3 mutari cu definitia: albul muta si da mat in 3 mutari):

Cod: Selectaţi tot

array (\n 0 => \n array (\n 'mutari_id' => 3,\n 'diagrid' => 4,\n 'mutarefen' => '4k3/8/4K3/8/8/8/8/7R b - - 1 1',\n 'mutarepgn' => '1. Rh1',\n ),\n 1 => \n array (\n 'mutari_id' => 4,\n 'diagrid' => 4,\n 'mutarefen' => '3k4/8/4K3/8/8/8/8/7R w - - 2 2',\n 'mutarepgn' => '1. Rh1 Kd8',\n ),\n 2 => \n array (\n 'mutari_id' => 5,\n 'diagrid' => 4,\n 'mutarefen' => '3k4/8/4K3/8/8/8/8/R7 b - - 3 2',\n 'mutarepgn' => '1. Rh1 Kd8 2. Ra1',\n ),\n 3 => \n array (\n 'mutari_id' => 6,\n 'diagrid' => 4,\n 'mutarefen' => '4k3/8/4K3/8/8/8/8/R7 w - - 4 3',\n 'mutarepgn' => '1. Rh1 Kd8 2. Ra1 Ke8',\n ),\n 4 => \n array (\n 'mutari_id' => 7,\n 'diagrid' => 4,\n 'mutarefen' => 'R3k3/8/4K3/8/8/8/8/8 b - - 5 3',\n 'mutarepgn' => '1. Rh1 Kd8 2. Ra1 Ke8 3. Ra8#',\n ),\n)
Diagrama e data ca tema de casa, iar pentru rezolvare trebuie urmata aceeasi ordine de mutari (atit la alb cit si la negru), bineinteles ca elevului nu-i este afisata rezolvarea, el trebuie s-o gaseasca, iar verificarea se face dupa fiecare mutare. Deci prima mutare efectuata de elev trebuie sa coincida cu prima mutare din definitia diagramei, a doua mutare a elevului trebuie sa coincida cu a doua mutare din diagrama s.a.m.d. Fiecare mutare a elevului pe diagrama genereaza un sir FEN care este comparat cu cimpul mutarefen corespunzator din array. Ar fi minunat daca mi-ai da doar o idee cum sa fac. Multumesc.

MarPlo Mesaje: 4343
Ai putea sa faci asa:
- Definesti o variabila care sa fie incrementata la fiecare mutare; apoi cu ea verifici daca mutarea respectiva (sirul fen) corespunde cu ce e in array-ul cu mutari, la indexul incrementat.

Cod: Selectaţi tot

//array with moves and other data
var arr_moves =[
  {mutari_id:1, diagrid:2, mutarefen:'R3k3/8/4K3/8/8/8/8/8 b - - 1 1', mutarepgn:'1. Ra8#'},
  {mutari_id:3, diagrid:4, mutarefen:'abc..', mutarepgn:'xyz..'}
];

//function called to each move; receives the fen of current move
var move_nr =0;  //incremented to each move
function checkMove(fen){
  if(arr_moves[move_nr].mutarefen == fen){
    //correct move
    move_nr++;
  }
  else alert('Incorrect move');
}

andras Mesaje: 430
Functioneaza doar atunci cind definesc eu array in functia JS. Ex:

Cod: Selectaţi tot

<script>
var idmutari = [{"mutari_id":1,"diagrid":2,"mutarefen":"R3k3/8/4K3/8/8/8/8/8 b - - 1 1","mutarepgn":"1. Ra8#"}];
alert(idmutari[0].mutarefen); // afiseaza R3k3/8/4K3/8/8/8/8/8 b - - 1 1
</script>
Dar daca array-ul vine din ajax nu mai functioneaza. In fisierul apelat cu ajax am pus:

Cod: Selectaţi tot

<?php
$resultat = $objReM->sqlExecute($sql);
$json = json_encode($resultat);
echo $json;
?>
Iar in JS am pus:

Cod: Selectaţi tot

<script>
    success : function(msg) {
        var mutari = JSON.stringify( msg );    
        $('#idmutari').val(mutari);   // idmutari este tip hidden
    }
//........................... iar in functia JS dupa ce extrag valoarea idmutari
alert(idmutari[0].mutarefen); // afiseaza undefined
</script>
De dimineata tot incerc dar nu reusesc. Unde gresesc?

MarPlo Mesaje: 4343
Variabila care sa contina obiectul cu mutarile (var mutari) se defineste in afara functiei ajax (ca sa fie globala, sa poata fi folosita si in alte functii).
JSON.stringify transforma un obiect in sir-json in javascript, deci daca-l vrei obiect /array, nu aplica "JSON.stringify".
Cam asa:

Cod: Selectaţi tot

var mutari ='';
//functia ajax
  success : function(msg) {
        mutari = msg;   //msg e deja obiect /array
        $('#idmutari').val(JSON.stringify( msg ));
  }

andras Mesaje: 430
Am incercat si asa si tot nu-mi merge:

Cod: Selectaţi tot

<script>
    success : function(msg) {
       	alert(msg);    // [{"mutari_id":1,"diagrid":2,"mutarefen":"R3k3\/8\/4K3\/8\/8\/8\/8\/8 b - - 1 1","mutarepgn":"1.                      
                                   Ra8#"}]
        alert(msg[0].mutarefen);  // undefined      - (ar trebui sa afiseze R3k3\/8\/4K3\/8\/8\/8\/8\/8 b - - 1 1)
    }
</script>
Nu-mi explic de ce. Poate la json_encode ar trebui sa pun ceva optiuni, dar am incercat si cu json_encode($resultat, JSON_FORCE_OBJECT) si cu json_encode($resultat, JSON_PRETTY_PRINT) si tot nu functioneaza.

MarPlo Mesaje: 4343
Daca msg e un sir cu date in format json, se foloseste JSON.parse(json_string) ca sa-l transformi in obiect in javascript.

Cod: Selectaţi tot

mutari = JSON.parse(msg);  //makes it object
$('#idmutari').val(msg);  //add the json string in form field
alert(mutari[0].mutarefen);
- Daca nu stii exact ce tip /format de date contine "msg", se verifica in consola, cu: console.log(msg); .

andras Mesaje: 430
Asta era problema, multumesc! Salvez variabila ca format JSON in input type hidden iar inainte de intrebuintare aplic functia JSON.parse() si functioneaza.

Subiecte similare