Progetto impiccato c++

Matrix8989
salve ragazzi io ho un problema... ho scritto questo programma in c++, che sarebbe il gioco dell'impiccato. volevo implementarlo mettendo ad inizio game l'opzione di poter giocare contro il pc... mi spiego meglio... creando un file esterno dove sono comprese 117000 parole del dizionario vorrei che il pc ne scegliesse una a caso tra queste e la usasse come parola da indovinare... ma non riesco proprio a pensare a come fare... idee? vi posto ora il codice da me scritto :)
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include "Windows.h"
#include "wincon.h"
#include <stdlib.h>


using namespace std;
int menu;
char parola[]={'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'};
char controllo[]={'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'};

int main()
{
     
      int num;
      int cond=0;
      int ugual=0;
      int i,f;
      int tentativi=5;
      int errori=0;
      char risp;
      char lettera;
 
   
  HANDLE hConsole;
 WORD   wAttr;
  hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
 wAttr = FOREGROUND_GREEN;
 SetConsoleTextAttribute(hConsole, wAttr);

	
      cout<<"    BENVENUTI AL GIOCO DELL'IMPICCATO! \n";
system ("pause");



     cout<<"------  \n";
     cout<<"|    | \n";
     cout<<"|    _ \n";
     cout<<"|   | | \n";
     cout<<"|    - \n";
     cout<<"|  / | \\ \n";
     cout<<"|    |   \n";
     cout<<"|  /   \\  \n";
     cout<<"| \n";
     cout<<"| \n";
     cout<<"-------- \n";
     
     cout<< "REGOLE: \n";
     cout<< "Il primo giocatore all'insaputa dell'avversario decide la parola; \n";
     cout<< "dopo averla inserita, spetta al giocatore avversario cercare di indovinare  \n";
     cout<< "la parola. \n";
     cout<< "Il giocatore 2 ha 5 possibilita' di errori, dopo di questo perde. \n";
     cout<< "Che il divertimento abbia inizio! \n";
     system ("pause");
     cout<<"-------------- \n";
      cout<<"==1. GIOCA \n";
      cout<<"==2.CREDITI \n";
     
      cout<<"COSA VUOI FARE? 1 o 2? = ";
      cin>>menu;
      if (menu==2) {
                   system ("cls");
                   
                   cout<<"system 32 copyright \n";
           
                   system ("pause");
                   system ("cls");
                   return main();
                   }
     if ( menu==1) {
     
     
     
      do{
              system ("cls");
              cout<<"QUANTE LETTERE HA LA PAROLA CHE VUOI INSERIRE?(max 16): \n ";
              cin>>num;
              system ("cls");
              cout<<"INSERISCI LA PAROLA : ";
              cin>>parola;
              system("cls");
              cout<<"SICURO CHE LA PAROLA SIA: ";
              for(i=0;i<num;i++)
              {
                      cout<<parola[i];
              }
              cout<<" ?(s/n) ";
              cin>>risp;
              system("cls");
      }while(risp=='n' || risp=='N');
      for(i=0;i<num;i++){
              cout<<"-";
      }
      cout<<"\n\n\n\n Inizia il gioco.\n Tentativi: "<<tentativi<<"\n";
      do{
              cout<<"CHE LETTERA VUOI INSERIRE? ";
              cin>>lettera;
              for(f=0;f<num;f++){
                      if(parola[f]==lettera){
                              controllo[f]=lettera;
                              ugual++;
                              system("cls");
                      }
                      else if(parola[f]!=lettera){
                              errori++;
                              }
              }
              if(errori==num){
                      system ("cls");
                      cout<<"HAI SBAGLIATO!\n\n";
                      system ("pause");
                      tentativi--;
                      system("cls");
                      cout<<"\n\n\n\n Tentativi rimasti: "<<tentativi<<"\n\n\n";
              }
              for(f=0;f<num;f++)
                      cout<<controllo[f];
              cout<<"\n\n\n";        
              errori=0;
              if(tentativi==0){
                      system("cls");
                      cout<<"HAI PERSO!\n\n\n";
                      cond=1;
                       cout<<"------  \n";
     cout<<"|    | \n";
     cout<<"|    _ \n";
     cout<<"|   | | \n";
     cout<<"|    - \n";
     cout<<"|  / | \\ \n";
     cout<<"|    |   \n";
     cout<<"|  /   \\  \n";
     cout<<"| \n";
     cout<<"| \n";
     cout<<"-------- \n";
                      _beep(400, 500);
                      _beep(400, 500);
                      system ("pause");
                   
              }
              else if(ugual==num){
                      cout<<"HAI VINTO!!!\n\n\n";
                      cond=1;
                      _beep(1000, 500);
                      system ("pause");
                     
              }
      }while(cond==0);
     
      return 0;
      }}

Risposte
Matrix8989
ho creato questo codice ora che mi apre un file esterno .txt e mi dice quante stringhe di caratteri ci sono...

#include <iostream>
#include <fstream>
#include <string>


using namespace std;


int main()
{
	ifstream inFile;
	
	inFile.open("dizionario.txt");
	
	//controlliamo se ci sono errori
	
	if (inFile.fail())
	{
		cout<<"controlla il tuo file sorgente"<< endl;
		system ("pause");
		
	}
	
	string item;
	
	int count = 0;
	
	while (!inFile.eof())
	{
	inFile>> item;
	count++;
		
	}
	
	cout<< count<< " parole trovate" << endl;
	
return 0;	
}


ora quello che mi chiedo è: come posso far in modo che il pc scelga una stringa di caratteri random tra tutti e la memorizzi come parola da indovinare?

vict85
Supponendo che tu sappia in numero di parole contenute nel file ti basta generare un numero \(n\) a caso e usare la \(n\)-esima parola.

Probabilmente ti conviene rendere il tutto un po' più modulare invece che mettere tutto nel main. Inoltre penso sia meglio se chiedi direttamente la parola e leggi la dimensione attraverso strlen invece di chiedere la dimensione prima. Tutto sommato, dato che usi il C++ potresti usare string invece delle stringhe del C.

Hai incluso due volte stdlib e non hai bisogno di stdio.

P.S.: visual studio 2015 mi dice che _beep è una funzione obsoleta e di usare al suo posto Beep.

vict85
Il tuo secondo programma calcola un numero in più. Il codice da usare è:
 int count;
for(count = 0; inFile >> item; ++count);

oppure
int count = 0;
while(inFile >> item)
    ++count;



Riguardo al tuo problema potresti:
[list=1][*:1mcdixl4] Calcolarti il numero di parole, generare il numero casuale \(\displaystyle n \) e rileggere il file fino alla \(n\)-esima parola;[/*:m:1mcdixl4]
[*:1mcdixl4] Caricare l'intero file in una qualche struttura dati, generare il numero casuale \(\displaystyle n \) e caricare dalla struttura dati la \(n\)-esima parola;[/*:m:1mcdixl4]
[*:1mcdixl4] Usare un metodo iterativo in cui al passo i, cambia la parola con la prossima del file con probabilità \(\displaystyle \frac{1}{i+1} \) (che sostanzialmente vuol dire generare moltissimi numeri casuali). [/*:m:1mcdixl4][/list:o:1mcdixl4]

Siccome leggere da file è immagino più lento di generare un numero casuale penso che il secondo e il terzo metodo siano meglio del primo.

Matrix8989
"vict85":

P.S.: visual studio 2015 mi dice che _beep è una funzione obsoleta e di usare al suo posto Beep.

si lo so ma uso come compilatore dev c++ :D

Matrix8989
"vict85":

  • Caricare l'intero file in una qualche struttura dati, generare il numero casuale \(\displaystyle n \) e caricare dalla struttura dati la \(n\)-esima parola;

  • questa cosa sinceramente mi intriga molto... vorrei capire però come creare una struttura dati visto che sono abbastanza "scarso" nell'uso di c++ :D

    Matrix8989
    ok forse per la prima parte, ovvero leggere il file esterno e creare array di stringhe ci sono... questo dovrebbe essere il codice:

    #include <iostream> 
    #include <fstream>  
    using namespace std;
    
    int main()
    {
      int array_size = 1200000; 
    	char * array = new char[array_size]; 
    	int position = 0; 
      
    	ifstream fin("dizionario.txt"); 
    	
      if(fin.is_open())
    	{
        
        cout << "ok ci siamo!!!. sto leggendo" << endl;
       
    		while(!fin.eof() && position < array_size)
    		{
    			fin.get(array[position]); /
    			position++;
    		}
    		array[position-1] = '\0'; 
        
        cout << " " << endl << endl;
        
    		for(int i = 0; array[i] != '\0'; i++)
    		{
    			cout << array[i];
    		}
    	}
    	else 
    	{
    		cout << "il file non può essere aperto" << endl;
    	}
    	return 0;
    }
    
    


    ora il problema che mi si pone è che mi stampa tutte le parole... dovrei ora creare una funzione che scelga uno di questi array casuali giusto?

    Rispondi
    Per rispondere a questa discussione devi prima effettuare il login.