Newsgroup: it.comp.java
Titolo: scacchi

devo scrivere un programma java che faccia giocare a scacchi due "umani"
(quindi niente IA).
non mi serve interfaccia grafica, devo solo visualizzare su schermo gli
spostamenti dei pezzi (es. A4- B4).
qualcuno di voi sa dirmi se in rete č possibile trovare qualche sorgente
java che possa aiutarmi? piů che altro mi servirebbe per essere sicura
di effettuare tutti i controlli per quanto riguarda lo "scacco matto".
vi ringrazio in anticipo
michela

 di effettuare tutti i controlli per quanto riguarda lo "scacco matto".
Io invece credo che ti serva semplicemente un algoritmo per verificare 
la condizione di "scacco". Se già implementi lo spostamento dei pezzi 
(quindi la verifica se lo spostamento è valido oppure no) per verificare 
lo scacco matto è sufficiente simulare tutte le mosse valide e se in 
tutte queste il re si trova in condizione di scacco significa che è 
scacco matto (o stallo, se il re non è sotto scacco).
Io partirei con il definire una classe astratta Pezzo, con le proprietà 
di posizione (X e Y), la squadra di appartenenza (nero o bianco) e un 
metodo move(int x, int y) e un metodo astratto getValidMoves(). Quindi 
delle classi derivate per ciascun tipo di pezzo (Pedone, Re, Regina, 
Torre, etc...). Ciascuna classe specifica implementa il metodo 
getValidMoves() che restituisce una lista delle mosse valide per quel 
pezzo a partire dalla posizione corrente.
Creerei poi una Collection che rappresenta la lista dei pezzi in gara, 
la metterei anche come proprietà del Pezzo in modo che il singolo pezzo 
sappia la posizione degli altri pezzi. Quando una chiamata a move() 
mangia un'altro pezzo, lo toglie dalla Collection.
Su quest'idea credo si possa lavorare. Che ne dici?

 Su quest'idea credo si possa lavorare. Che ne dici?
che sei stato di grandissimo aiuto e ti ringrazio molto!! mi hai dato
delle ottime idee!! spero di non avere problemi durante la
programmazione, in caso posterò qualche dubbio amletico!!  =P
grazie ancora
michela

 eh già, è quella la condizione più difficile da verificare...  =|
Ma no dai, come diceva Vincent, immagina questo algortimo:
A e' il giocatore che deve fare la prossima mossa
B e' l'altro
per ogni pezzo 'p' di B {
  per ogni mossa valida 'm' di p {
 
 se m == posizione del re di A {
   //scacco
          se il re non ha mosse possibili {
  //scacco matto
          }
        }
  } 
Poi ovviamente si puo' migliorare per tentare di non dover guardare tutti i
pezzi ogni volta, ad esempio cominciando a cercare da quelli più vicini al
re che hanno una probabilità maggiore di metterlo sotto scacco.
Oppure non considerando i pedoni a più di un passo dal re.
Ciao
Matteo
-- 
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it/imsv/

 
[snip]
Io invece farei il contrario. Cioè partirei dal re e mi muoverei in 
verticale, orizzontale, diagonale e a L per vedere se incontro pezzi 
avversari ai quali sono consentite tali mosse. Non sarebbe più veloce?

 avversari ai quali sono consentite tali mosse. Non sarebbe più veloce?
Ma non sarebbe completo :-)
In questo modo tu consideri solo il re che non si può muovere, ma questo 
non è necessariamente scacco matto. Scacco matto è quando non posso 
difendere il re dallo scacco con qualsiasi mossa, non solo muovendo il re.


Io intendevo per il controllo dello scacco. Per il matto è ovvio che ci 
devono essere controlli ulteriori.
Esempio:
- muove A
- si controlla se il re di B è sotto scacco con il metodo che ho proposto
- se lo è occorre controllare se è matto
Mi pare corretto. Nemmeno l'altro metodo comunque rileva il matto.

 Io intendevo per il controllo dello scacco. 
Ok, scusa, fra l'altro non avevo nemmeno letto bene.

> Ok, scusa, fra l'altro non avevo nemmeno letto bene.
ragazzi, vi ringrazio molto per tutte le "dritte" che mi state dando!!
mi avete suggerito diversi metodi soddisfacenti per il mio scopo!!  =)
il progetto l'ho iniziato qualche giorno fa... al momento sto valutando
come comportarmi con il *pedone*, perchč avevo intenzione di usare un
metodo astratto per descrivere gli spostamenti dei pezzi...
il problema č questo: 
mentre ad esempio l'alfiere si muove in diagonale e mangia in diagonale;
la torre si muove in orizzontale/verticale e mangia in
orizzontale/verticale; per quanto riguarda il pedone, questo si muove
solo in avanti, ma quando mangia si puň spostare in diagonale... 
quindi dovrei scrivere una sottoclasse specifica per quest'unico
pezzo?!?   =|
michela/ spero di essere stata chiara...  ^_^

 Io invece farei il contrario. Cioè partirei dal re 
Eh si, molto più ragionevole. Bisogna sempre trovare una soluzione ed usare
l'altro punto di vista ;)


 l'altro punto di vista ;)
Dici che è una brutta idea? Puoi almeno motivare?

 Dici che è una brutta idea? 
No no, dicevo proprio il contrario, la mia risposta non era sarcastica :)


 B e' l'altro
[cut]
stavo però riflettendo su una cosa... il tuo metodo in generale mi
sembra buono, pero' pensa a questo caso: il re non si puo' muovere, ma
un altro pezzo si puo' sacrificare per salvarlo... in questo caso non e'
scacco matto e quell'algoritmo non funziona...   =(
michela

 sembra buono, pero' pensa a questo caso: 
[CUT]
Hai ragione, in effetti l'algoritmo non è così buono ;) Ho risposto troppo
in fretta ed evidentemente sottovalutando il problema. Bisogna pensarci un
po' di più, ora non ho tempo ;)


 
Ah, ok :)
Inoltre si potrebbe modificare controllando solo le mosse che sono 
consentite ai pezzi avversari (es. l'avversario non ha più cavalli, è 
inutile controllare gli spostamenti a L).
Per la condizione di matto però bisogna pensarci un po' di più, è 
decisamente più complicata.

 michela
Comunque per fare giocare 2 avversari dei validare le mosse che fanno. 
Questo lo puoi fare crando un algoritmo che genera tutte le mosse possibili 
di un colore in ogni instante della partita. (con istatne intendo 
posizione).
Scacco matto si ha se le mosse generabili sono 0. Oppure stallo (ma non sarà 
difficile discernere dai 2 casi).
Il problema é che la generazione delle mosse non è affatto banale.
Lo avevo fatto per la dama, e già in là la cosa non era facilissima.
Con gli scacchi é ancora peggio.