Newsgroup: it.comp.lang.c++
Titolo: Ho creato un tris !!

Buongiorno,
come da oggetto, ho creato un tris funzionante!!
avendolo fatto praticamente senza conoscenza di c++visual, sono abb.
contento
perň, a parte che č un po' lento a volte(quando molte caselle sono piene)
vorrei sapere se c'č un modo per far capire al computer quando qualcuno
vince(in modo che ad esempio lo scriva) e fare in modo che se metto due x x
vicine,
lui mette la "o" nel terzo posto, senza fare tutti i tentativi.
Uso winxp e Borland 5
Il codice č:
#include <vcl.h>
#pragma hdrstop
#include <ctime>
#include "tris.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{ }
void __fastcall TForm1::Button1Click(TObject *Sender)
{  ALI:
        const int SIZE=8;
   AnsiString a,b,c,d,e,f,g,h,i,o="o";
   int r;
        a=Edit1->Text;
        b=Edit2->Text;
        c=Edit3->Text;
        d=Edit4->Text;
        e=Edit5->Text;
        f=Edit6->Text;
        g=Edit7->Text;
        h=Edit8->Text;
        i=Edit9->Text;
      srand((unsigned)time(0));
      r=rand()%SIZE+1;  // ho messo +1 perchč altrimenti considerava anche
lo zero
     switch(r)
         {  case 1: if(a!="x"&&a!="o"  )
                               {Edit1->Text=o; break;}
                        else
                              goto ALI;
                        break;
                case 2: if(b!="x"&&b!="o")
                      {         Edit2->Text=o;  break; }
                        else
                               goto ALI;
                        break;
                case 3: if(c!="x"&&c!="o")
                     {          Edit3->Text=o;  break;  }
                        else
                                   goto ALI;
                        break;
        case 4: if(d!="x"&&d!="o")
                    {           Edit4->Text=o; break;    }
                        else
                                  goto ALI;
                        break;
        case 5: if(e!="x"&&e!="o")
                   {            Edit5->Text=o;    break;  }
                        else
                                goto ALI;
                        break;
        case 6: if(f!="x"&&f!="o")
                  {             Edit6->Text=o;  break;     }
                        else
                               goto ALI;
                        break;
        case 7: if(g!="x"&&g!="o")
                 {              Edit7->Text=o;   break;     }
                        else
                                goto ALI;
                        break;
        case 8: if(h!="x"&&h!="o")
                       {        Edit8->Text=o;   break;      }
                        else
                                goto ALI;
                        break;
        case 9: if(i!="x"&&i!="o")
                      {         Edit9->Text=o;  break;        }
                        else
                                 goto ALI;
                        break;
      };
}
 // FINE
Ho messo nel Form1, 9 Edit e un button1 per il turno del computer.
pensate sia un po' macchinoso e lungo??(ho perso un ora e mezza ad accorgemi
che dovevo mettere il
break anche negli if altrimenti si impallava il computer :"(   ).

 break anche negli if altrimenti si impallava il computer :"(   ).
Guarda... scusa se ho scherzato un po... ovviamente il modo c'è... però ci
sono da dire alcune cose e per il tuo bene non sarò molto simpatico nei tuoi
confronti (niente di personale, se vuoi crescere ti do qualche spunto,
vedila così).
I giochi non si programmano con infinite serie d'istruzioni if come hai
fatto tu.
Per il tris ci sono algoritmi come il minimax per la soluzione di giochi a
somma zero (dove il vantaggio di uno è simmetrico allo svantaggio
dell'altro) ed altri algoritmi di "back tracking", questi algoritmi (brute
force o con varie "potature") riescono a capire non solo qual'è la mossa
migliore da giocare (o almeno ci provano...nel caso del tris se applichi
bene il minimax il computer diventa imbattibile... per gli scacchi invece il
solo minimax non basta e servono anche altre tecniche) ma riescono anche a
capire quando il gioco è concluso.
Poggiano sul fatto che il calcolatore può calcolare un ampio numero di
tentativi (nodi) tutte (entro una certa profondità) o molte delle varianti
che si potrebbero determinare in caso di gioco e tra queste valutare le
linee migliori per l'uno o per l'altro giocatore (o computer) in un tempo
che non sempre è ragionevole (dipende anche dalla potenza del calcolatore,
negli anni '80 ad esempio non era difficile perderci su parecchie ore per
risolvere "posizioni" in algoritmi di quel tipo, e anche oggi ci si può
perdere parecchio tempo).
Se t'interessa approfondire il discorso ci sono ottimi libri di "Fondamenti
d'informatica" da consultare.
Quindi, a parte il fatto che il listato non è idoneo alle discussioni su
questo NG, perché scritto con il Borland C++ builder mediante l'uso del
framework VCL e non invece in puro e standard C++ (che il tuo compilatore
potrebbe fare!), il vero problema è che è proprio la filosofia che c'è
dietro che non è corretta per la programmazione dei giochi...
Dovresti prevedere con le istruzioni if qualsiasi posizione che si può
determinare sulla griglia (e che il tris è solo un 3x3, figuriamoci se così
riesci a programmare una dama o un forza 4!) comprese quelle di vittoria,
con l'allineamento di tre segni uguali.
Ciao.

 pensate sia un po' macchinoso e lungo??
Lungo, nemmeno tanto. Macchinoso, umh, si...
In pratica va bene come inizio. Ora che hai esplorato che cosa e' e di che
cosa si tratta.... rinizia da capo in modo piu' rigoroso:
Tommy
P.S. chiedo scusa per la mia ignoranza in campo Borland, ma.... tra le altre
cose siamo su di un NG di C++ e quindi....

 cose siamo su di un NG di C++ e quindi....
Grazie mille e invece chiedo io scusa per aver fatto una richiesta semi-OT,
cmq. mi vanno bene spiegazioni per qualsiasi compilatore(però meglio se
applicabili direttamente al Borland).
 PS. come è possibile che su internet non ci siano manuali complessi??
mah...

 Ciao.
come scrivevo a Tommy, non so ancora cosa sia il VCL, e il C++ standard(in
Consol Wizard)
mi dà WinMain Error,è appunto per questo motivo che ho cominciato a
programmare in visual(che non mi
dà questo errore,credo sia un problema della libreria iostream.h)
GRAZIE
ciao
Nicholas

 mah...
Spiegati meglio!
Tommy

 dà questo errore,credo sia un problema della libreria iostream.h)
con il c++ standard la funzione si deve chiamare solo main e non WinMain.
Ecco in breve una funzione minimax per il tris:
<CODE>
int MiniMax(int & best, int player)
{
     int do_not_care;  // we do not need the value of this variable
     int opponent = -player;
     int value = (player==CPU)?(MIN-1):(MAX+1);
     int tmp_value;
     // is Over ? If yes return the value (CPU
     if(isGameOver(value))
          return value;
     for(int i=0;i<9;++i){
          if(board[i]!=EMPTY) continue;
          // Setting...
          board[i]=player; ++board_count;
          // Trying...
          tmp_value=MiniMax(do_not_care,opponent);
          // Removing...
          board[i]=EMPTY; --board_count;
          if(player==CPU){
               if(tmp_value>value){
                    value=tmp_value;
                    best=i;
               }
          }else{
               if(tmp_value<value){
                    value=tmp_value;
                    best=i;
               }
          }
     }
     return value;
}
</CODE>
Questo e' l'essenziale di quello che ti serve.
Nota che devi implementare la funzione IsGameOver(), ma questa dovrebbe
essere facile, al limite puoi farla controllando "a mano" con degli if le 8
posizioni vincenti.
La funzione non e' difficile ma e' difficile spiegarla su di un NG. Se non
la capisci non ti preoccupare prenditi tempo, tanto sei in anticipo ;-)
Studiati un buon libro di C++ standard come il Deitel&Deitel ultima edizione
(altrimenti non ti si compila il codice ;-) e poi vedrai che sei pronto per
studiare algoritmi e strutture dati. Inoltre non sottovalutare la
matematica, se vuoi fare informatica sappi che ne farai tanta ;-)
Tommy

 bel 'WinMain' Error riferito a COW32.OBJ
due cose:
 1. impara a riportare gli errori con piů precisione. No, non "tanto si
    capisce lo stesso". Io, personalmente, se per rispondere ad un post 
    devo fare a mia volta delle domande perchč chi posta non č preciso, 
    non rispondo del tutto, perchč mi costerebbe piů sforzo
 2. perchč hai tolto la spunta dalla casella "console application", nel 
    Console Wizard? ti stava antipatica?
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.1.0. C, C++ and ASM developers
                               and beta testers are welcome!

 }
pignoleria:
non e' obbligatorio mettere un return al main. se manca viene ritornato 
di default 0.
byez

 ha scritto nel messaggio
news:Xns93375F0...@127.0.0.1...
[Cut All]
Non so se ridere o piangere.. hai ragione..
adesso funziona, però, a essere sincero,
non avrei saputo che errori riportare,
intendevi tutta la riga di errore?
comunque sia, veramente grazie per il suggerimento.
Nicholas

 comunque sia, veramente grazie per il suggerimento.
di nulla, cose che capitano :-)
