Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Salve, avrei bisogno di un piccolo aiuto riguardo la realizzazione di un progetto in C. La traccia è la seguente:
"Si vuole sviluppare un algoritmo del cammino casuale di una pedina. Un cammino si svolge su una scacchiera in cui ogni casella rappresenta una possibile posizione del cammino della pedina. Stando in una casella, una pedina può muoversi solo nella casella a destra, nella casella a sinistra, nella casella sopra o nella casella sotto. La scelta di una tra queste quattro caselle deve essere fatta a caso (generando per esempio un numero intero in {0,1,2,3}).
Ogni movimento da una casella all’altra è detto passo del cammino. L’algoritmo usa un array 2D nxn, con n=30, per simulare la scacchiera. Ci sono due pedine sulla scacchiera, e all’inizio una si trova nella casella in alto a sinistra e l’altra nella casella in basso a destra. A ogni movimento di una pedina, segue il movimento dell’altra pedina. Fare attenzione al movimento di una pedina quando si trova sul bordo della scacchiera. L’algoritmo procede finché accade che le due pedine tentano di muoversi sulla stessa casella della scacchiera; in tal caso l’algoritmo termina (cammino terminato), restituendo il numero di passi effettuati. Organizzare l’algoritmo come una function che restituisce il numero di passi (lunghezza) del cammino. Scrivere un main che per 100 volte chiama la function e visualizza la lunghezza di ogni cammino effettuati."
Ho già scritto tutto il codice, ma questo non funziona, nel senso che il compilatore non mi da errori e il codice viene anche eseguito, ma viene immediatamente terminato senza dare nessun risultato. Qui il codice:
So che è un po' "rudimentale", ma la mia intenzione era di scrivere prima qualcosa che effettivamente funzionasse e poi ottimizzare. Qualcuno mi saprebbe dire qual è l'errore che impedisce l'esecuzione corretta? Sono giorni che cerco di capire ma non ci arrivo, ho solo il sospetto che l'errore sia nella function passo_casuale(), ma effettivamente non l'ho trovato. Grazie in anticipo per l'aiuto!
in pratica determina in quale direzione si muovono la pedina p1 e la pedina p2, dovrebbe restituire un numero tra 0 e 3 dove 0=passo in basso, 1=passo in alto, 2=passo a destra e 3=passo a sinistra, e dovrebbe fermarsi fin quando le due pedine non vogliono muoversi sulla stessa casella (quindi fin quando x1=x2 e y1=y2, dato che ho impostato e inizializzato queste posizioni come coordinate). La funzione deve prevedere anche il caso in cui la pedina si trovi al bordo della scacchiera, ad esempio se si trova sul bordo destro e il passo casuale è a destra, la pedina deve ritrovarsi dall'altro lato della scacchiera
Ultima modifica effettuata da luibo il 18/02/2016 alle 20:39
Ok... posso dirti subito che ci sono alcuni problemi:
RIGA 62: nel while, tu hai posto una condizione che non si verificherà mai, perchè passando le coordinate by value alla funzione passo_casuale in effetti il loro valore non cambierà mai: dovresti passarle by reference.
Questo, tra parentesi, è il motivo per cui il tuo programma rimane "bloccato": perchè, di fatto, gli hai inserito un ciclo infinito.
RIGHE DA 80 IN POI: tutte le volte che scrivi l'assegnamento
Codice sorgente - presumibilmente Plain Text
p1=scacchiera[x1][y1];
O analogo con p2, di fatto compi un passo inutile, perchè ti limiti a spostare il "puntatore alla posizione" della pedina, senza che effettivamente essa (che immagino sia rappresentata dal trattino o dall'underscore) si sposti: dovresti anche aggiornare le caselle della tua matrice in modo che il simbolo della pedina si sposti dove opportuno
FUNZIONE MAIN: dovresti resettare la matrice ed i "puntatori" prima di ogni esecuzione della funzione dei cammini.
Questo è ciò che ho notato appena ri-letto il tuo codice... forse ci sono altri problemi (non credo, ma non si sa mai), ma al momento sono troppo stanco per leggere il codice con più attenzione... se domani, dopo aver risolto i problemi che ti ho segnalato ancora il programma non funzionerà, sarò ben felice di aiutarti al massimo delle mie possibilità... per il momento, ti prego di scusarmi, di più non posso fare
Ultima modifica effettuata da Template il 18/02/2016 alle 23:32
Innanzitutto ti ringrazio per la gentilezza e la disponibilità!
Allora, ho cambiato la funzione attuando il passaggio dei parametri per indirizzo, non è comunque bastato a far funzionare l'algoritmo; riflettendo sul tuo suggerimento credo che effettivamente il problema sia proprio il mancato "aggiornamento" della matrice con le nuove posizioni delle pedine, ma come posso implementare al meglio questa cosa? Avevo pensato magari di fare una nuova function che aggiorna di continuo la scacchiera, da richiamare all'inizio del ciclo for che si trova nel main, ma in realtà non sono tanto sicuro.. fatto sta che non mi vengono in mente molte altre soluzioni
Ora finalmente l'algoritmo si esegue, ma non funziona bene. Come numero di passi delle pedine eseguiti prima che esse cerchino di andare sulla stessa casella riporta sempre 1,2 o al massimo 3 (il che capirai che è un po' improbabile), e il numero di passi totali è uguale per ogni esecuzione (mi spiego meglio: il main richiama la function per 10 volte e, quando eseguo l'algoritmo, mi restituisce che per tutte le 10 esecuzioni della function cammino() i passi totali sono stati 1 -o 2 o 3, a volte cambia-). L'unica cosa che mi viene in mente per questo problema è un errore nell'implementazione delle rand()%4, ma non riesco a capire come risolvere..
Attento: nel main, usi x1, y1, x2 e y2 come indici senza averli inizializzati (perchè l'inizializzazione l'hai messa nella funzione cammino)!
Inoltre, nella funzione passo_casuale, effettui tutti gli incrementi senza premettere l'opportuno operatore: tu scrivi y1++, ma avendo passato il parametro by reference dovresti scrivere (*y1)++
Detto questo, è normale che ti escano passi uguali, visto che il tuo programma viene eseguito dal calcolatore in pochissimo tempo e dunque ad ogni ripetizione passa ad srand() un valore di tempo sostanzialmente uguale a quello passatogli prima.
Una semplice soluzione a scopo didattico sarebbe quella di passare alla funzione cammino anche l'indice del for, e ri-scrivere la riga 59 così:
Codice sorgente - presumibilmente Plain Text
srand((((int)time(NULL)) / 314) + i * 27183);
(Notare che i due numeri che ho scelto sono assolutamente arbitrari: io ho preso multipli di pi-greco e del valore di Nepero, ma tu puoi usare quelli che vuoi )
E inoltre potresti riscrivere le due righe 71-72 così:
Codice sorgente - presumibilmente Plain Text
pass1 = (rand() + *x1) % 4;
pass2 = (rand() + 314 * (*x2)) % 4;
Non è una soluzione perfetta (avrai ancora delle ripetizioni, ineluttabilmente), ma almeno ti garantirà dei risultati un po' più interessanti
Detto questo, per la gestione grafica della scacchiera ti basta, in sede di determinazione del prossimo passo, nell'ordine:
- Svuotare la casella dove prima si trovava la pedina
- Determinare la sua nuova posizione
- Inserire il suo segnaposto (un trattino, se ben ricordo) nella nuova posizione
Non è difficile: sono tre-quattro righe di codice implementabili nella funzione passo_casuale
Ultima modifica effettuata da Template il 19/02/2016 alle 9:16
Ciao, secondo me la funzione passo_casuale() è totalmente da rivedere, non rispetta la traccia, nella traccia è specificato che si deve eseguire una mossa alla volta "prima pedina uno, segue pedina due, poi pedina uno ecc...", la funzione cammino() non ha motivo di esistere, è il main() secondo la traccia che deve provvedere al "ciclo", quindi quello che è inserito nella funzione cammino() andrebbe fatto nel main(), la funzione passo_causale() non tiene conto dei 4 possibili movimenti, e non fa nessun controllo sulla possibilità che la mossa è sui bordi della scacchira.
Per passatempo, ho fatto l'esercizio, e magari con qualche BUG sembra funzioni, non so se è il caso di mostrarti una possibile soluzione, bisognerebbe sapere se l'esercizio è un passatempo o altro ??
Ciao, secondo me la funzione passo_casuale() è totalmente da rivedere, non rispetta la traccia, nella traccia è specificato che si deve eseguire una mossa alla volta "prima pedina uno, segue pedina due, poi pedina uno ecc...", la funzione cammino() non ha motivo di esistere, è il main() secondo la traccia che deve provvedere al "ciclo", quindi quello che è inserito nella funzione cammino() andrebbe fatto nel main(), la funzione passo_causale() non tiene conto dei 4 possibili movimenti, e non fa nessun controllo sulla possibilità che la mossa è sui bordi della scacchira.
Per passatempo, ho fatto l'esercizio, e magari con qualche BUG sembra funzioni, non so se è il caso di mostrarti una possibile soluzione, bisognerebbe sapere se l'esercizio è un passatempo o altro ??
Ciao, la traccia mi chiede esplicitamente di organizzare l’algoritmo come una function che restituisce il numero di passi del cammino, e il main deve limitarsi a richiamare questa function per 100 volte. Nella function passo_casuale() i controlli in caso la pedina vada ai bordi della scacchiera ci sono, sono quegli if annidati dove ad esempio
Codice sorgente - presumibilmente C/C++
if (*y1==29)
{
*y1=0;
*p1=scacchiera[*x1][*y1];
}
prevede il caso in cui la pedina si trovi sul bordo in basso della scacchiera e pass1 sia = 0 (cioè il passo della pedina sia verso il basso)