Vai al contenuto
Il server del mese è
Visita la nostra nuova lista server!

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

GreySlime

[Help] Tris in C++

Recommended Posts

topic rivolto per ora solamente a chi mastica un po di c++... allora... 

 

ho provato cosi per sfizio a scrivere un breve programma che simula il celebre gioco del tris (in versione per ora solo per due giocatori, all'intelligenza artificiale per giocatore singolo ci penserò in futuro)...

 

questo è il file .cpp (non ancora compilato) https://www.dropbox.com/s/hdptu3ih0iccztu/tris.cpp

 

il programma funziona per quanto riguarda la parte di ricevere input e mostrarli correttamente a video, il problema credo possa risiedere nella funzione risultato perchè, come potete provare eseguendo il programma, anche se avviene un tris il programma "non se ne accorge" e continua a proseguire fino alla fine facendo terminare sempre la partita in pareggio... la spiegazione più o meno dettagliata del funzionamento del programma è presente all'interno del file sotto forma di commenti, anche se è abbastanza semplice da capire...

 

qualcuno esperto in materia e con tempo e voglia di fare ha qualche idea su come corregerlo e/o individuato l'errore burlone che ho commesso?

 

p.s. uso && per and e || per or (so che alcuni scrivono direttamente a parole) se non capite perchè uso eventuali comandi chiedete

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

p.s. uso && per and e || per or (so che alcuni scrivono direttamente a parole) se non capite perchè uso eventuali comandi chiedete


In C++ and e or non esistono e se sono presenti nel tuo compilatore allora sono sicuramente delle macro.


Comunque l'errore risiede nell'uso sbagliato che fai di ==, es:
 
A[0]==A[1]==A[2]
Se volessimo mettere le parentesi questo diventa: (A[0]==A[1])==A[2] che ovviamente non è quello che vuoi visto che, prima viene fatta la prima comparazione di uguaglianza (tra A[0] e A[1]) che ritonerà false o true (quindi un bool), e poi verrà comparato quel valore con A[2], che ritornerà sempre false visto che i due saranno sempre diversi.

Il giusto codice da usare è:
 
(A[0] == A[1] && A[1] == A[2])

Ah, la mia versione modificata:

#define CHECK_EQUAL(a, b, c) ((a) == (b) && (b) == (c))

bool r_righe(char*A, bool player) //cerca tris nelle righe 
{ 
    if(CHECK_EQUAL(A[0],A[1],A[2]) || CHECK_EQUAL(A[3],A[4],A[5]) || CHECK_EQUAL(A[6],A[7],A[8]))
        return true; 
    return false; 
} 
  
bool r_colonne(char*A, bool player) //cerca tris nelle colonne 
{ 
    if(CHECK_EQUAL(A[0],A[3],A[6]) || CHECK_EQUAL(A[1],A[4],A[7]) || CHECK_EQUAL(A[2],A[5],A[8]))
        return true; 
    return false; 
} 
  
bool r_diagonali(char*A,bool player) //cerca tris nelle diagonali 
{ 
    if(CHECK_EQUAL(A[0],A[4],A[8]) || CHECK_EQUAL(A[2],A[4],A[6]))
        return true; 
    return false; 
} 
Anche se effettivamente in C++ le macro non hanno senso, quindi puoi sostituirla con:

inline bool check_equal(char a, char b, char c) {
    return a == b && b == c;
}

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

In C++ and e or non esistono e se sono presenti nel tuo compilatore allora sono sicuramente delle macro.


Comunque l'errore risiede nell'uso sbagliato che fai di ==, es:
 

A[0]==A[1]==A[2]
Se volessimo mettere le parentesi questo diventa: (A[0]==A[1])==A[2] che ovviamente non è quello che vuoi visto che, prima viene fatta la prima comparazione di uguaglianza (tra A[0] e A[1]) che ritonerà false o true (quindi un bool), e poi verrà comparato quel valore con A[2], che ritornerà sempre false visto che i due saranno sempre diversi.

Il giusto codice da usare è:
 
(A[0] == A[1] && A[1] == A[2])
Ah, la mia versione modificata:

#define CHECK_EQUAL(a, b, c) ((a) == (b) && (b) == (c))

bool r_righe(char*A, bool player) //cerca tris nelle righe 
{ 
    if(CHECK_EQUAL(A[0],A[1],A[2]) || CHECK_EQUAL(A[3],A[4],A[5]) || CHECK_EQUAL(A[6],A[7],A[8]))
        return true; 
    return false; 
} 
  
bool r_colonne(char*A, bool player) //cerca tris nelle colonne 
{ 
    if(CHECK_EQUAL(A[0],A[3],A[6]) || CHECK_EQUAL(A[1],A[4],A[7]) || CHECK_EQUAL(A[2],A[5],A[8]))
        return true; 
    return false; 
} 
  
bool r_diagonali(char*A,bool player) //cerca tris nelle diagonali 
{ 
    if(CHECK_EQUAL(A[0],A[4],A[8]) || CHECK_EQUAL(A[2],A[4],A[6]))
        return true; 
    return false; 
} 
Anche se effettivamente in C++ le macro non hanno senso, quindi puoi sostituirla con:

inline bool check_equal(char a, char b, char c) {
    return a == b && b == c;
}

oh grazie mille ^^ infatti non ero molto sicuro quando ho scritto quegli if... cmq l'inline non so ancora cosa sia ma grazie lo stesso, l'and tra eguaglianze è perfetto


Io ne ho uno di pronto... se vuoi te lo passo

Non metto questa firma

e che gusto c'è ad avere la pappa pronta? :/

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

cmq l'inline non so ancora cosa sia ma grazie lo stesso, l'and tra eguaglianze è perfetto


Sostanzialmente quello che distingue una funzione inline da una normale è che il codice compilato viene inserito dove chiami la funzione, come una macro, ma a livello più basso. E' utile quando hai bisogno di velocità, personalmente la uso nei getter delle classi.

Dove stai imparando? Scuola? Internet? Libri?

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
Studio informatica all'università eheh... Ho studiato prima qualcosa per conto mio (perché mi piace programmare o almeno tentare ovviamente) ma non c o c++... Per adesso che sono al primo anno c'è più teoria che pratica quindi non programmiamo molto per ora... Per quanto riguarda il c++ siamo arrivati agli alberi, poi il corso si è interrotto (è suddiviso in due parti e nella seconda si tratterà la programmazione ad oggetti) e ora sto dando esami vari... Questo tris l'ho buttato giù in una mezzoretta così tanto per cazzeggio xD solo che quegli if mi hanno fregato...

Sostanzialmente quello che distingue una funzione inline da una normale è che il codice compilato viene inserito dove chiami la funzione, come una macro, ma a livello più basso. E' utile quando hai bisogno di velocità, personalmente la uso nei getter delle classi.

Dove stai imparando? Scuola? Internet? Libri?

Inviato dal mio Xperia sole con Tapatalk 2 che mi fa bestemmiare per scrivere

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

  • Chi sta navigando   0 utenti

    Nessun utente registrato visualizza questa pagina.


  • Contenuti simili

    • Da GreySlime
      help pls
      http://puu.sh/ayBLB.jpg
      si tratta di ricavare dal testo, adottando una chiave che non conosco, un codice di 7 caratteri sia lettere che numeri. come? se lo sapessi non ve lo chiederei.
       
      [spoiler]
      p.s. il codice finale poi sarebbe la parte finale del link della pagina con il successivo indovinello (e ultimo di una sequenza assai bastarda ma con un ricco premio finale o almeno spero), tutte le pagine del sito (questo è preso da qui  http://tf2r.com/k3z6veg.html , tranquilli non c'entra assolutamente niente con team fortress 2) iniziano con tf2r.com/k percui la prima lettera è per forza k se vi può essere di aiuto
      [/spoiler]
       
      edit
       
        L'HO RISOLTO! VI POSTO LA SOLUZIONE TRA QUALCHE GIORNO PER EVITARE CHE ENTRIATE NEL RAFFLE ;P
    • Da GreySlime
      ho scaricato e provato lo scorso update l'ultimo giorno in cui era in prova il cugino di grave digger qua sotto e ci avrò fatto un gir di si e no mezzora e poi ho chiuso il gioco...
       

       
      ho notato però che ora non è più possibile trovarlo nel garage nemmeno in single player, è stato rimosso completamente? so che era per un intervallo limitato disponibile da acquistare nell'online, questa cosa l'hanno estesa anche alla modalità storia? quindi ora non ho piu disponibile? le armine swag americane nemmeno? chi ne sa piu di me risponda please
×
×
  • Crea Nuovo...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.