Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    6

    Esercitazione scacchiera "interattiva"

    Ciao ragazzi, mi sto scervellando da un po e cercando di studiacchiare quà e la... volevo chiedervi come poter realizzare questo esercizio:

    Si costruisca in Javascript unʼapplicazione contenente una scacchiera 10x10 con una pedina inizialmente posizionata della casella (9,9) ed individuata dal colore rosso di background.
    Si implementi una funzione che ottiene delle mosse da un server remoto attraverso lʼuso di una chiamata AJAX così fatta:
    getPosition.php
    Le mosse sono generate in maniera casuale dal server e codificate attraverso una codifica JSON, secondo il seguente formato:
    posX,posY,TimeStamp
    Il cliente javascript dovrà visualizzare tutte le mosse sino al verificarsi di una determinata combinazione XY. Al termine, bisogna mostrare al cliente lo storico delle mosse secondo il seguente formato:
    <SPAN>X,Y,TIMESTAMP</SPAN>


    Cioè, non saprei da dove iniziare... la scacchiera. Qualche suggerimento? Grazie in anticipo!

  2. #2
    dal testo non mi è molto chiaro cosa deve fare l'utente dal client, vediamo se ho capito.

    Io apro la tua pagina ed il server comincia a fare casualmente mosse (diciamo una mossa ogni 3 secondi) e mano a mano le visualizza. Questo si interrompe quando effettua la mossa xy e deve avere memoria di tutte le mosse fatte precedentemente.

    Chiarimenti:
    -Le mosse hanno una logica o sono effettuate totalmente a casaccio?
    -Una pedina può muovere più volte sulla stessa casella? se sì, devi segnalarlo che la pedina ha mosso più volte sulla stessa casella?
    -Qual'è lo scopo del TIMESTAMP? Prendere nota del tempo in cui il server ha mosso?
    -Le mosse vengono generate ciclicamente o deve intervenire l'utente a dire al server di muovere (in quel caso avrai bisogno di un'altra pagina: move.php per esempio )

    Se mi chiarifichi quei punti ti posso dare una mano, non mi sembra un problema troppo complesso. Per la scacchiera torna comoda una tabella e per lo storico basta creare un div dove mano a mano tramite innerHTML inserisci le mosse fatte dal server. Per la ciclicità basterà un setInterval che ogni tot millisecondi chiamerà la funzione AJAX. Questa genererà la mossa e tramite document.getElementById("td_x_y").style.background = "red"; cambierà colore.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    6
    Ciao SoulStorm, scusa per la tardiva risposta ma sono stato fuorisede e non ho potuto consultare il forum. Allora anche io ho le idee un po confuse quindi per quanto riguarda i chiarimenti credo:

    -Le mosse sono effettuate a caso
    -Non si può muovere nella stessa casella
    -Immagino di sì, però questo punto mi è davvero oscuro ^^'
    -Le mosse vengono eseguite ciclicamente in automatico

    Se mi potessi dare una mano sarebbe davvero magnifico. Per quanto riguarda la realizzazione della scacchiera in javascript diciamo che ho risolto, eventualmente posto il codice nel pomeriggio. Ora scappo, grazie ancora! A più tardi! ;D

  4. #4
    facciamo così, domani mattina ( o pomeriggio al limite) ti butto giù tutto il codice, penso che in un'oretta massimo dovrei riuscirci

    Naturalmente sarà un codice molto essenziale (sopratutto dal punto di vista grafico), a quel punto potrai migliorarlo quanto vorrai (ad esempio se vuoi una scacchiera ad effetto io imposterei uno sfondo preso in internet e per evidenziare la casella userei qualche img opaca con una texture simpatica, presente fireworks ?).

    A quel punto sceglierai se proseguire con il tuo lavoro prendendo dal mio codice solo quel che ti serve o usare direttamente il mio.

  5. #5
    Eccola come promesso:

    Crea il file index.php ed al suo interno mettici questo:
    codice:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <title>...</title>
    	<link rel="stylesheet" href="style.css" type="text/css" />
        <script type="text/javascript" src="core.js"></script>
      </head>
      <body onload="createTable(); timer = window.setInterval('getMove()', 1000);">
        <div id="tableBox"></div>
    	<div id="report"></div>
      </body>
    </html>


    Crea dunque il file core.js ed al suo interno questo:
    codice:
    var _x_stop = 1;  //x di chiusura
    var _y_stop = 5;  //y di chiusura
    
    var _x = new Array();  //x storico
    var _y = new Array();  //y storico
    var _time = new Array(); //time storico
    
    //crea dinamicamente la scacchiera
    function createTable()
    {
      var tableHTML = "<table>";
      for(y = 0; y < 10; y++)
      {
        tableHTML += "<tr>"; 
        for(x = 0; x < 10; x++)
    	{
    	  tableHTML += format("<td id='td{0}{1}'>{2};{3}</td>",y,x,y+1,x+1);
    	}
    	tableHTML += "</tr>";
      }
      tableHTML += "</table>";
      
      document.getElementById("tableBox").innerHTML = tableHTML;
      
      setSquare(9,9);
    }
    
    //colora le caselle dove il server ha mosso
    function setSquare(x,y)
    {
      document.getElementById(format("td{0}{1}",x-1,y-1)).style.background = "red";
    }
    
    //controlla che sulla casella x,y il server non abbia già mosso, controlla anche la sequenza xy di chiusura
    function checkSquare(x,y, time)
    {
      for(var i = 0; i < _x.length; i++)
        if(_x[i] == x && _y[i] == y)
    	  {
    	    getMove();
    		return;
    	  }
      
      if(x == _x_stop && y == _y_stop)
      {
        window.clearInterval(timer);
    	refreshReport();
    	document.getElementById("report").innerHTML += format("<span style='color:red;'>MOSSO SU {0},{1} => COMBINAZIONE DI CHIUSURA!!!</span>",_x_stop,_y_stop);
        return;
      }
      
      setSquare(x,y);
      _x.push(x);
      _y.push(y);
      _time.push(time);
      refreshReport();
    }
    
    //effettua la mossa
    function getMove()
    {
      var xmlhttp;
      
      if(window.XMLHttpRequest)
        xmlhttp = new XMLHttpRequest();
      else
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      
      xmlhttp.onreadystatechange=function()
        {
          if(xmlhttp.readyState==4 && xmlhttp.status==200)
    	  {
    	    var data = xmlhttp.responseText.split(",");
    		checkSquare(parseInt(data[0]),parseInt(data[1]), data[2]);
    	  }
        }
        xmlhttp.open("GET","getPosition.php",true);
        xmlhttp.send();
    }
    
    //stampa le varie mosse (storico)
    function refreshReport()
    {
      spanHTML = "";
      for(var i = 0; i < _x.length; i++)
      {
        spanHTML += format("<SPAN>{0},{1},{2}</SPAN>
    ",_x[i],_y[i],_time[i]);
      }
      document.getElementById("report").innerHTML = spanHTML;
    }
    
    function format( str ) //par1, par2, ... parN 
    {
        if ( arguments.length <= 1 ) return str; //se non ci sono parametri restituisce la stringa
        
        for( var token = 0; token <= (arguments.length - 2); token++ )
            str = str.replace( new RegExp( "\\{" + token + "\\}", "gi" ),arguments[ token + 1 ] );    //sostiuisce i token con i parametri
    
        return str;
    
    }

    Crea il file getPosition.php
    codice:
    <?php
    
    printf("%s,%s,%s", rand(1,10), rand(1,10), date("H:i:s"));
    
    ?>
    Ed infine il file style.css
    codice:
    table
    {
      border: 3px solid black;
    }
    
    td
    {
      border: 1px solid black;
      
      height: 32px;
      width: 32px;
      
      font-size: 12px;
      color: gray;
      text-align: center;
    }


    Spero che capirai il codice nonostante abbia omesso la maggior parte dei commenti, ad ogni modo per qualsiasi dubbio basta che chiedi .
    Dunque, index.php è semplicemente la struttura HTML, quando il body carica fa partire la funzione che genera dinamicamente la tabella ed il timer per le mosse. Tutte le funzioni sono nel foglio js esterno core.js. Core poichè è il vero e proprio nucleo della pagina (anche engine stava bene, non sapevo decidermi ), è la parte più ostica, non esitare a chiedere chiarimenti. Per quanto riguarda getPosition.php è talmente banale che si commenta da sola, uguale per il foglio di stile... come ti avevo già detto ho messo solo la grafica essenziale

    Spero che ti piaccia!!

    NB. Un'ultima cosa, la combinazione di chiusura xy (impostata da me a 1,5) è statica e quindi sempre uguale! L'ho fatta così perché programmando mi sono accorto che neanche quel punto è esplicitato a dovere. chi decide la combinazione? Server o Client? E con quale logica? Statica o Dinamica? Se chiarisci quel punto aggiornerò anche la chiusura

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    6
    Troppo gentile, ora mi studio un po il tuo codice per vedere cosa non mi è chiaro. Grazie infinite! Magari "approfitto" della tua disponibilità per chiederti qualche altro chiarimento :P

    Ciao!

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    6
    Ecco le prime richieste di chiarimenti :P. Allora, non mi è ben chiaro come avviene nella funzione format(str) l'assegnazione di 1;1, 2;2... Ho capito che si sostituiscono i valori dentro le parentesi graffe ma i valori come vengono calcolati (sicuramente faccio qualche errore logico)?

    Il codice getPosition.php deve essere inserito nel body di un altro documento chiamato getPosition.php o sbaglio? Provando il codice noto che si genera la tabella ma non succede nient'altro. Sono proprio alle prime armi e forse sto cercando di fare il passo più lungo della gamba ^^''

    Sto lavorando su Safari per il momento (php e Apache sono configurati correttamente... o almeno spero XD)

    Ciao e grazie ancora per l'enorme aiuto!

  8. #8
    Dunque, la funzione format non fa altro che sostituire alle graffe (segnaposti) i valori...

    stringa = format("valore A: {0}, valore B: {1}", val1, val2);

    In questo caso alla stringa "valore A: {0}, valore B: {1}" verrà sostituito il contenuto della variabile val1 al posto di zero e il contenuto della variabile val2 al posto di uno, così in ordine per tutti gli argomenti dopo la prima stringa secondo la regola format(string, arg0, arg1, arg2...).
    I valori non vengono calcolati ma semplicemente assegnati.

    scrivere
    codice:
    var anno = "1989";
    var messaggio = format("Il muro di Berlino è caduto nell'anno {0}",anno);
    è equivalente a scrivere
    codice:
    var anno = "1989";
    var messaggio = "Il muro di Berlino è caduto nell'anno " + anno;


    Il file position.php è considerata a tutti gli effetti una pagina web, infatti se la apri da sola ti verrà stampata la stringa x,y,time (con i valori generati in quel momento ), cosa fai con AJAX? semplicemente la richiedi al server (come richiedi una qualsiasi pagina web) ma non renderizzi a video il contenuto, al contrario lo sfrutti ... io non genero direttamente x,y,time ma li uso per colorare la tabella ^_^ ... contanto che quindi non uso position.php come "pagina" (nel vero senso del termine) non ha senso che al suo interno vi siano tag come body o altro.



    Dunque, se genera la tabella ma non partono gli "effetti" vuol dire che o hai sbagliato qualcosa nell'impostare il webserver o sbagli a far partire la pagina. La pagina index.php affinchè il progetto vada non può esser fatta partire semplicemente da browser (doppio click sul file da win) ma deve essere fatta partire affinchè giri sul webserver.
    Io da windows uso easyphp e con apache basta fare http://localhost/nome_pagina.php che quella parte a patto che sia nella cartella del dominio (con easy la cartella è www) .
    (se il file è index.php apache dovrebbe essere impostato al punto da farlo partire come pagina di default della cartella, quindi dovrebbe bastarti provare dall'indirizzo http://localhost).

    Se usi safari suppongo tu sia su mac e purtroppo non posso aiutarti più di tanto per questo aspetto, io ho fatto applicazioni web unicamente in aspx e php (quest'ultimo solo su win), non ho esperienza con mac

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    6
    Umhh... intanto grazie per la delucidazione su fotmat(). Però ancora non sono riuscito a far partire l'applicazione... è statica. la pagina mi si apre da localhost ma senza alcun effetto, dovrei modificare il webserver?

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    6
    Ok, risolto tutto... avevo fatto uno stupido errore di scrittura P_P. Grazie infinite!

    Magari al prossimo ostacolo se non hai niente in contrario torno a disturbarti ;P.

    ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.