PDA

Visualizza la versione completa : [c++] Algoritmo per una scacchiera


Pensiero
01-11-2011, 10:44
Dunque sto sviluppando un gioco usando Visual C++ 2010 express e la libreria SDL. In questo gioco c'è una specia di scacchiera. Le pedine hanno ciacuna un massimo numero di movimenti diversi, c'è chi si può muovere fino a tre 3 caselle in una mossa (ma possono muoversi anche di meno), altre pedine fino a 2, ecc.
Tutte si possono muovere in tutte le 8 possibili direzioni(avanti,dietro,destra,sinistra,diagonale-destra in avanti,diagonale-sinistra in avanti,diagonale-destra indietro,diagonale-destra indietro).
Quindi posso ad esempio spostare una pedina, che ha un massimo di 3 movimenti consentiti, 2 caselle a destra e una in avanti, ecc.
Però non devono essere presenti altre pedine nel mezzo di questo percorso, quindi le pedine nel muoversi non possono "saltare" altre pedine.
Ora io devo realizzare una funzione, in c++, che mi permetta di stabilire se un dato movimento è consentito oppure no, passando come parametri il numero della casella di partenza e di quella di arrivo.
Infatti, ogni casella ha un numero , la prima ha è la numero uno.
Spero di essere stato chiaro. Vi chiedo se mi potreste aiutare facendomi , almeno, una sorta di schema, che mi indichi come sviluppare questo algoritmo.

oregon
01-11-2011, 11:06
Non è possibile neanche tentarci (anche volendo e avendo il tempo) senza conoscere *precisamente* le regole di cui hai parlato in modo confuso.

Ovviamente, la funzione, oltre alla casella di partenza e quella di arrivo, dovrà conoscere la situazione di ogni casella nella scacchiera.

Pensiero
01-11-2011, 12:22
Originariamente inviato da oregon
Non è possibile neanche tentarci (anche volendo e avendo il tempo) senza conoscere *precisamente* le regole di cui hai parlato in modo confuso.

Ovviamente, la funzione, oltre alla casella di partenza e quella di arrivo, dovrà conoscere la situazione di ogni casella nella scacchiera.
Certo, c'è una funzione per capire, dato il numero di una casella, se queela casella è occupata o meno. La funzione restituisce true se è occupata, altrimenti false.

La prima casella è uno, la seconda è 2 e così via.
Ho una scacchiera 11X12, cioè 11 caselle di larghezza, 12 di lunghezza.
Non capisco cosa intendi per conoscere "precisamente " le regole. Non credo che serva esporre tutto il funzionamento del gioco. Il problema è qui non creare tutto il gioco per intero, non mi permetterei mai di chiedere una cosa simile, ma creare una funzione, a cui basta dare i seguenti parametri:
numero massimo di caselle consentito in cui la pedina può spostarsi, numero della casella di partenza, numero della casella di arrivo.
Naturalmente, questa funzione, al suo interno userà la funzione apposita per conoscere se una casella, corrispondente a quel dato numero, è occupata o meno.
L' unica cosa che dovrebbe bastare per creare questa funzione è conoscere qual'è il movimento consentito e quale no. Il movimento consentito è dato dallo spostamento, entro il numero massimo consentito. Quindi bisogna calcolare tutti i percorsi possibili che si possono fare per arrivare alla casella di arrivo (tutte le direzioni sono ammesse, anche in diagonale).
Inoltre bisognerà stabilire se, di questi percorsi possibili (se non esiste almeno un movimento possibile la funzione ritornerà false), almeno uno è libero, cioè se non esistono altre pedine ad intralciare il percorso.
Se uno di questi percorsi è libero bisognerà restituire true.
Altrimenti false.
Quindi per creare questa funzione non serve conoscere tutte le regole del gioco e tutti i tipi di pedine esistenti, ma soltanto dandole numero di partenza, numero di arrivo, numero di movimento massimo, lei deve stabilire se esiste almeno un percorso libero per arrivare fino a là. Questa è l'unica cosa che la funzione deve fare.

oregon
01-11-2011, 12:33
Nel primo post hai scritto

"passando come parametri il numero della casella di partenza e di quella di arrivo."

e questo non basta se non sai come si possono muovere le pedine.

Ora aggiungi

"dandole numero di partenza, numero di arrivo, numero di movimento massimo"

"(tutte le direzioni sono ammesse, anche in diagonale)"

dando quelle informazioni che mancavano e che ti chiedevo.

Secondo me, la prima cosa che devi fare è impostare un metodo per individuare le caselle con due coordinate x e y e non con un singolo numero.
Fatto questo, nella funzione, a partire dalle coordinate della tua pedina, diciamo

x0, y0

devi chiamare la funzione che controlla la presenza di altre pedine per tutte le caselle di coordinate

x0-n,y0-n ... x0+n,y0+n

se n è il numero di mosse consentite ...

Naturalmente la funzione dovrà escludere dal controllo (ovvero restituire false) per la stessa posizione della pedina (x0, y0) e per tutte le posizioni eventualmente esterne alla scacchiera.

LeaderGL
01-11-2011, 13:22
Il gioco prevede una intelligenza artificiale oppure è previsto esclusivamente l'utilizzo da parte di una persona?

Hai già definito delle strutture di base? Ad esempio per sapere:
1) spostamento permesso da ogni tipo di pezzo
2) tracciamento percorso
3) calcolo del "costo" di un percorso (solo in caso di IA)
4) struttura scacchiera
5) stato delle singole celle della scacchiera

Per andare da un punto A ad un punto B esistono più percorsi possibili, a te interessa uno in particolare o semplicemente interessa sapere se è possibile la "mossa"?

Pensiero
01-11-2011, 13:53
Originariamente inviato da oregon
Nel primo post hai scritto

"passando come parametri il numero della casella di partenza e di quella di arrivo."

e questo non basta se non sai come si possono muovere le pedine.

Ora aggiungi

"dandole numero di partenza, numero di arrivo, numero di movimento massimo"

"(tutte le direzioni sono ammesse, anche in diagonale)"

dando quelle informazioni che mancavano e che ti chiedevo.

Secondo me, la prima cosa che devi fare è impostare un metodo per individuare le caselle con due coordinate x e y e non con un singolo numero.
Fatto questo, nella funzione, a partire dalle coordinate della tua pedina, diciamo

x0, y0

devi chiamare la funzione che controlla la presenza di altre pedine per tutte le caselle di coordinate

x0-n,y0-n ... x0+n,y0+n

se n è il numero di mosse consentite ...

Naturalmente la funzione dovrà escludere dal controllo (ovvero restituire false) per la stessa posizione della pedina (x0, y0) e per tutte le posizioni eventualmente esterne alla scacchiera.

Ok, grazie. Il tuo aiuto è stato importante.

Loading