Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Scacchi
Forum - C/C++ - Scacchi

Avatar
Carletto_juo (Normal User)
Newbie


Messaggi: 2
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 14:50
Mercoledì, 21/09/2011
Salve, sono nuovo del forum, ho trovato difficoltà nell'implementare un algoritmo che data la posizione dei pezzi sulla scacchiera calcoli tutte le possibili mosse e contromosse tenendo conto delle caselle occupate dagli altri pezzi e delle mosse "illegali". Mi appello quindi a qualcuno del forum chiedendovi di darmi qualche dritta(anche non in codice C)magari uno pseudocodice. Grazie.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:37
Mercoledì, 21/09/2011
Beh, ci credo, dato che il gioco degli scacchi è uno dei più complessi ...

Non penso ti si possa dare del codice (o pseudocodice) per quello che chiedi ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
delta (Member)
Rookie


Messaggi: 37
Iscritto: 25/08/2010

Segnala al moderatore
Postato alle 15:45
Mercoledì, 21/09/2011
Testo quotato

Postato originariamente da Carletto_juo:

Salve, sono nuovo del forum, ho trovato difficoltà nell'implementare un algoritmo che data la posizione dei pezzi sulla scacchiera calcoli tutte le possibili mosse e contromosse tenendo conto delle caselle occupate dagli altri pezzi e delle mosse "illegali". Mi appello quindi a qualcuno del forum chiedendovi di darmi qualche dritta(anche non in codice C)magari uno pseudocodice. Grazie.  



quello che ti posso dire è che, in questi casi, si fa grande uso del backtracking, tecnica che permette di generare soluzioni in modo incrementale: ad ogni passo si aggiunge una mossa e si verifica che sia valida e il vantaggio rispetto all'avversario (calcolabile come punteggio, per esempio). sia la pagina italiana sia quella inglese di wikipedia sono abbastanza dettagliate, poi una ricerca su google potrà dirti molto di più.


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:50
Mercoledì, 21/09/2011
Testo quotato

Postato originariamente da delta:
...  si fa grande uso del backtracking ...



Concordo ...

Diciamo che se hai scelto questo come programma didattico da cui partire, non hai fatto la scelta giusta ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 16:02
Mercoledì, 21/09/2011
Testo quotato

Postato originariamente da Carletto_juo:

Salve, sono nuovo del forum, ho trovato difficoltà nell'implementare un algoritmo che data la posizione dei pezzi sulla scacchiera calcoli tutte le possibili mosse e contromosse tenendo conto delle caselle occupate dagli altri pezzi e delle mosse "illegali". Mi appello quindi a qualcuno del forum chiedendovi di darmi qualche dritta(anche non in codice C)magari uno pseudocodice. Grazie.  



Ciao,

e' un problema che ho gia' affrontato;
se ti va, dai uno sguardo al codice del mio programma ChessGame, e' in Delphi, potrebbe esserti utile.

Ciao :k:

Luigi


Le cose si fanno per bene o non si fanno affatto
PM Quote
Avatar
Carletto_juo (Normal User)
Newbie


Messaggi: 2
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 0:42
Giovedì, 22/09/2011
Ringrazio per l'interessamento mostrato e per i consigli;
Alcune delle risposte erano abbastanza prevedibili ma ad ogni modo utili;
Tuttavia sono molto aperto e accetto ogni tipo di critica o consiglio;
Intanto ho buttato giù qualche riga di codice sperando di ricevere ulteriori consigli;
Qui il codice:
Codice sorgente - presumibilmente C/C++

  1. #include <stdio.h>
  2.  
  3. int i;
  4. int scacchiera[144] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,57,58,59,60,61,62,63,64,-1,-1,-1,-1,49,50,51,52,53,54,55,56,-1,-1,-1,-1,41,42,43,44,45,46,47,48,-1,-1,-1,-1,33,34,35,36,37,38,39,40,-1,-1,-1,-1,25,26,27,28,29,30,31,32,-1,-1,-1,-1,17,18,19,20,21,22,23,24,-1,-1,-1,-1,9,10,11,12,13,14,15,16,-1,-1,-1,-1,1,2,3,4,5,6,7,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
  5.  
  6. int re(int casella)
  7. {
  8. int j[8] = {+1,-1,+11,+12,+13,-11,-12,-13};
  9. printf("[CASELLA DI PARTENZA]: %d\n", scacchiera[casella]);
  10. printf("[CASELLE DI DESTINAZIONE]: ");
  11.  
  12. for(i=0;i<8;i++)
  13. {
  14. if (scacchiera[casella+j[i]] != -1)
  15.  {
  16.  printf("%d ", scacchiera[casella+j[i]]);
  17.  }
  18. }
  19. }
  20.  
  21.  
  22. int main()
  23. {
  24. re(66);
  25. }


Il programma calcola, data la posizione del re sulla scacchiera, le possibili mosse che può effettuare senza uscire dalla scacchiera stampando sullo schermo i numeri corrispondenti alle caselle che può occupare(A1-H8=1-64).
Ripeto che accetto critiche, su questo codice in particolare, in quanto personalmente non mi sembra molto elegante per fare quello che fa...

Ultima modifica effettuata da Carletto_juo il 22/09/2011 alle 0:57
PM Quote