Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    11

    Forza 4 con I.A. consigli

    Buonasera a tutti, sto sviluppando in java per l'università un forza 4 con intelligenza artificiale..
    Oramai sono a buon punto, tranne che per una cosa:
    Non riesco a trovare un modo per permettere all'intelligenza artificiale di individuare un eventuale vincita dell'avversario in DIAGONALE...
    Non sono un programmatore esperto, ho cominciato da un annetto.. Ho provato a pensare di sistemare la cosa con cicli for e controlli if in tutti i modi.. Ma sto uscendo pazzo!
    Se qualcuno ha qualche consiglio sarei immensamente grato.

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    157
    un possibile controllo in diagonale(controlla, per ogni casella, se ha fatto punto in diagonale
    codice:
    for (int x=0; x<tabella.getWidth(); x++)
      for (int y=0; y<tabella.getHeight(); y++){
        boolean ok=true;
        boolean giallo = tabella.get(x,y).isGiallo();
        for (int count = 0; count<4; count++){
          if (tabella.get(x+count, y+count).isGiallo()!=giallo)
            ok=false;
        if (ok) System.out.println('qualcuno ha vinto');
      }
    per l'altra diagonale, basta riadattare le somme.
    questa cosa non funziona, devi sistemare i controlli in modo che non sfori sulle dimensioni della tabella(x+count<width, y+count<height)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    11
    Originariamente inviato da cigiri18
    un possibile controllo in diagonale(controlla, per ogni casella, se ha fatto punto in diagonale
    codice:
    for (int x=0; x<tabella.getWidth(); x++)
      for (int y=0; y<tabella.getHeight(); y++){
        boolean ok=true;
        boolean giallo = tabella.get(x,y).isGiallo();
        for (int count = 0; count<4; count++){
          if (tabella.get(x+count, y+count).isGiallo()!=giallo)
            ok=false;
        if (ok) System.out.println('qualcuno ha vinto');
      }
    per l'altra diagonale, basta riadattare le somme.
    questa cosa non funziona, devi sistemare i controlli in modo che non sfori sulle dimensioni della tabella(x+count<width, y+count<height)

    Potresti commentarmi un po il codice?
    Non ho capito alcune cose: l'utilizzo dei due boolean, il metodo tabella.get(x,y), e il metodo isGiallo();

    Comunque fondamentalmente questo codice mi direbbe chi ha vinto e chi non ha vinto...
    A me servirebbe trovare un modo per impedire che l'avversario vinca.. quindi trovare in diagonale tre pedine avversarie con una cella vuota fra loro e impedire che l'avversario vinca interponendo fra loro una mia pedina.
    Questa cosa purtroppo non riesco a pensarla in termini di codice.. Già mi viene difficile scrivere codice per i controlli in diagonale senza uscire fuori dalle dimensioni dell'array..
    Non so proprio come farlo..

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    157
    tabella.get(x,y) restituisce un oggetto che gestisce la posizione x,y, contenente informazioni sullo stato,
    cambialo in base a come hai sviluppato tutto.

    //inizio il controllo dalla posizione x,y
    boolean avversarioGiallo; //indica il colore delle pedine dell'avversario

    //controllo per riga, verifico se, aggiungendo una sua pedina
    //nella posizione che sto analizzando, l'avversario vincerebbe
    //visto che mi concentro su questa posizione, devo guardare le 3 caselle a sinistra e a destra

    codice:
    boolean vince = false;
    for (int i=-3; i<0; i++) //verifico tutte le combinazioni possibili, ossia divido a blocchi di 4.
    {	for (int c=0; c<4; c++)
    	{	int X = x+i+c;
    		int Y = y;
    		if (i+c!=0) //se i+c==0 allora vuol dire che sono alla posizione x,y, che è
    				//quella da cui parto, che è vuota, quindi non va considerata.
    		{	if (tabella.get(X, Y).isEmpty())
    				break;	//una delle posizioni dove 
    					//dovrebbe esserci la pedina dell'avversario è vuota, 
    					//con questa combinazione non può vincere in una sola mossa.
    			if (tabella.get(X, Y).isGiallo!=avversarioGiallo)
    				break;	//la posizione attuale è occupata da una
    					//mia pedina, quindi l'avversario in questa combinazione
    					//non potrà vincere, vado alla prossima
    		}
    		if (c==3) 	//se ho controllato quattro posizioni, vuol dire che 3 di queste
    			vince = true;	//sono usate dall'avversario, una è quella che mi interessa sapere 
    				//se devo occuparla, in questo caso devo occuparla, sennò perderò.
    	}
    	if (vince == true) break;
    }
    
    if (vince); //metti la pedina in posizione x,y
    questo è per il controllo in orizzontale, da qui puoi arrivare al controllo in diagonale cambiando

    codice:
    int X = x+i+c;
    int Y = y;
    per diagonale destra
    codice:
    int X = x+i+c;
    int Y = y+i+c;
    per diagonale sinistra(credo, ma fai delle prove e fatti un po' di conti)
    codice:
    int X = x-i-c;
    int Y = y+i+c;
    questa è la struttura generica che dovrebbe avere. a questa devi aggiungere tutti i controlli del caso, di modo che non sfori.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.