Hänga gubbe spelet i c++.

Tråden skapades och har fått 9 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Sundsvall
  • 2007-05-19 11:38

Hej!
Hoppas någon kan titta på min kod och tala om vad är det jag gör för fel som gör att spelet inte fungerar. Det enda som fungerar är att avsluta spelet. Att välja eller slumpa fram ett ord gör bara att första delen av figuren ritas sedan kan man inte göra något.

#include <iostream>
using namespace std;
#include <cstdlib>
#include <string> 
#include <cctype>
#include <fstream>
#include <ctime>


void start(); //funktionen skriver ut en meny där användaren kan välja vad den vill göra.
						//den anropar antingen "valfritt_ord" eller "slumpa_od för att hämta det ord som skall gissas på. 
						//därefter skickas det ordet till "gissa_ord".

string valfritt_ord(); //funktionen låter användaren ange ett eget ord och returnerar ordet till "start".

string slumpa_ord(); //funktionen slumpar fram ett ord från en textfil och returnerar ordet till "start".

void gissa_ord(string ord, int ord_langd); //funktionen får ordet det ska gissas på antingen från "valfritt_ord" eller "gissa_ord" och
												//låter användaren gissa på det valda ordet.Gissar användaren rätt anropas
												// "ratt_gissat" annars anropas "game_over".
     	
void ratt_gissat(string ord); //Användaren har gissat rätt ord, så funktionen rensar skärmen och skriver ut det ord som man skulle
								//gissa på. Därefter anropas funktionen "start".

void kors(); //Funktionen anropas från "start" och skriver ut ett kors figur.

void draw1(); //användaren har gissat fel en gång så funktionen ritar första delen i figuren.

void draw2(); //användaren har gissat fel två gånger.nu ritar funktionen andra delen i figuren.

void draw3(); //användaren har gissat fel tre gånger, så tredje delen i figuren ritas.

void draw4(); //användaren har gissat fel fyra gånger.Funktionen ritar fjärde delen .

void draw5(); //användaren har gissat fel fem gånger.Funktionen ritar femte delen.

void draw6(); //användaren har gissat fel sex gånger. Funktionen ritar sjätte delen i figuren.

void draw7(string ord); //användaren har gissat fel sju gånger. Nu	ritar funktionen den sista delen i figuren.

void game_over(string ord); /*det betyder att användaren har gissat fel ord, då rensar funktionen skärmen och skriver ut det ord som man skulle gissa på. */

string ord;
char paus;
char gissa;

int main()
{
	start();
   return 0;
}

void start()
{
	system("cls");
	int svar;
   int ord_langd;
   //string ord;

	
	cout <<  "Välkommen till spelet Hänga Gubbe, "<<"hur vill du spela?"<<endl;
   cout <<  "1. Mata in ett eget ord"<<endl;
   cout <<  "2. Ett ord som programmet slumpar fram"<<endl;
   cout <<  "3. Avsluta programmet"<<endl;
	cout <<  "Vad väljer du? ";
	cin >> svar;

	switch (svar)
   {
   	case 1:
			ord = valfritt_ord(); //anropar funktionen valfritt_ord
			ord_langd = ord.length();//räkanr längden på det inmatade ordet
			gissa_ord(ord, ord_langd);//som funktionen gissa-ord kommer att kontrollerar hur många rätta bokstäver det finns i det valda ordet
    	break;

		case 2:
			ord = slumpa_ord();//anropar funktionen slumpa_ord
      		ord_langd = ord.length();
			gissa_ord(ord, ord_langd);
      break;

   	case 3:
      	system("cls");
			exit(1);
		break;

      default:
			cout << "Felaktigt val!" << endl;
         cout << "Tryck enter för att försöka igen"<<endl;
         cin.get(paus); //inväntar användarens svar
         cin.ignore();
        
         start();//anropar funktionen start
	}
}

string valfritt_ord()
{	
	system("cls");
	string ord;
	cout<<"Vilket ord vill du använda?"<<endl;
	cin>>ord; 
	return ord;
}

string slumpa_ord()
{
	system("cls");
	string ord;
   int antal_ord = 0;
   char next, temp;
   int slumpa;

	ifstream in;
   in.open("f9.txt");
   if(in.fail())
   {
      	cout << "Det gick inte att öppna inströmmen! \n";
        cout << "Tryck enter för att fortsätta"<<endl;
		cin.get(paus);
   		cin.ignore();
		start();
   }

	in.get(next);
   while(!in.eof())
   {
		if(next == '\n') //om nästa inlästa tecken är en radbrytning så öka antalet inlästa ord med 1
   		antal_ord++;
    	in.get(next); //och läs in nästa tecken
   }
   antal_ord = antal_ord + 1;
	in.clear();  

	srand(time(0)); //undviker att samma ord skrivs ut varje gång i en rad vid varje körning
   slumpa = rand() % antal_ord;

	in.seekg(0, ios::beg);//söker och läser från filens början

   in.get(temp);
	while(true) 
   {
   	if(temp == '\n')
      	slumpa--;

      if(slumpa == 0)
      {
         in.seekg(-1, ios::cur);
       	 in>>ord;

         in.close();
         return ord;
      }
      in.get(temp);
   }
}

void gissa_ord(string ord, int ord_langd)
{
	system("cls");
	string gissade_bokstaver("*****************************");
	
	int y = 0, count = 1, passed = 0, j = 0;
    int gissa_igen;
    int fill_guessed_chars = 0;

	for(int i = 0; i < ord_langd; i++) //konverterar bokstäverna till stora
		ord[i] = toupper(ord[i]);


	cout<< "Ordet du ska gissa på har " << ord_langd << " bokstäver"<<endl;

	for(int i = 0; i < ord_langd; i++) //för varje bokstav skriver ut ett streck 
   	cout << '-';

	
	cout << "Använda bokstäver: "<<endl;
	cout << "Du gissar på: "<<endl;
	cin>>ord;



	while((count <= 7) && (passed < ord_langd)) 
	{
      gissa_igen = 1;
   	while(gissa_igen > 0)
      {
         gissa_igen = 0;
      	gissa = toupper(gissa);
      	j = 0;

         for(int k = 0; k < fill_guessed_chars; k++)
			{
  				if(gissa == gissade_bokstaver[k])
					gissa_igen++;
      	}
       }
	
   	gissade_bokstaver[fill_guessed_chars] = gissa;
      fill_guessed_chars++;

		for(int i = 0; i < ord_langd; i++)
		{			
			if(gissa == ord[i])
			{
				cout<< gissa;
            passed++;
			}
			else
				j++;
		}
      
		if(j == ord_langd)
      	count++;

      if(count == 2)
      	draw1();

		if(count == 3)
      	draw2();

      if(count == 4)
      	draw3();

      if(count == 5)
			draw4();

      if(count == 6)
      	draw5();

      if(count == 7)
		{
      	
         cout << "Sista chansen"<<endl;
      	draw6();
		}

      if(count == 8)
      	draw7(ord);

   	if(passed == ord_langd)
      	ratt_gissat(ord);
	}
}

void ratt_gissat(string ord)
{
	system("cls");
   cout<< "Rätt gissat" <<endl;
   cout<<"Det rätta ordet var: "<<ord<<endl<<endl;

   cout<< "Tryck enter för att fortsätta";
   cin.get(paus);
   cin.ignore();
   start();
}

void kors()
{
  
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
		      cout<<"|||||||||||||||||||||||||||||||||||||"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;
						cout<<"		___		"<<endl;


}

void draw1()
{
	for(int i = 0; i < 16; i++)
	{
   	cout<<" ||" << endl;
   }
}

void draw2()
{
	
   cout<< "------------";
}

void draw3()
{
	for(int i = 0; i < 3; i++)
	{
		
   	cout << " |" << endl;
   }
}

void draw4()
{
   
   cout << "  //\\ " << endl;
   cout << " |o,o| " << endl;
   cout << "  \\-/ " << endl;
}

void draw5()
{
cout<<"    / -------   \\" << endl;
cout<<"	  /	 |	   |    \\" << endl;
cout<<"  /   |     |     \\" << endl;
	cout << "|     |" << endl;
  	cout << "-------" << endl;

}

void draw6()
{
    cout<< "|       |  " << endl;
    cout<< "|  /\\  | " << endl;
    cout<< "| /  \\ | " << endl;
}

void draw7(string ord)
{
	cout <<" __    __";
}

void game_over(string ord)
{
	system("cls");
	kors();
   cout<<"Du klarade inte spelet! Det rätta ordet var: "<<ord<<endl<< endl;

   cout <<"Tryck enter för att fortsätta spela";
   cin.get(paus);
   cin.ignore();
   start();
}

  • Medlem
  • Lund
  • 2007-05-19 12:06

Att lära sig koda är inte lätt, och du verkar inte vara helt ute å cykla med koden. Lösningen på ditt problem är att stega sig igenom koden med en debugger å se var det går fel i din logik. Antar att du använder Xcode för å utveckla?
Finns isf ett finfint gui till gdb där du kan stega fram i din kod.

  • Medlem
  • Sundsvall
  • 2007-05-19 12:24

Använder xcode ja, men nu sitter jag med visual studio.

har hittat ett fel nu, nämligen variabeln gissa har jag varken deklarerat eller initierat..
så här har jag nu gjort:
gissa= cin.get();
men min gubbe blir hängd även om jag gissar rätt

  • Medlem
  • Lund
  • 2007-05-19 12:55

Ok, Visual Studio har också en debugger (F5), sätt en breakpoint när det börjar närma sig rätt svar, kolla dina jämförelser, ==,<,> så dom är rätt.

Lycka till!

  • Medlem
  • Sundsvall
  • 2007-05-19 13:04

Hmm..varför visas inget i debugg rutan? eller hur ska jag veta var i koden den är nu?

  • Medlem
  • Lund
  • 2007-05-19 13:55

Kolla att du bygger för "Debug" å inte "Release" när du kompilerar... Sitter inte vid nån windowsburk nu men det borde finnas i project eller build.

  • Medlem
  • Mölndal
  • 2007-05-19 14:43

Det finns ingen speciell debugruta i VS, utan det blir en färgmarkering på den rad som körs i det vanliga editorfönstret. Tänk också på att när man tar Debug / Start Debugging så startar programmet, för att få det att stanna någonstans måste du sätta en brytpunkt.

  • Medlem
  • Sundsvall
  • 2007-05-26 10:41

Nu funkar spelet fint

  • Medlem
  • Lund
  • 2007-05-26 12:34

Härligt! hur löste du dina problem?

  • Medlem
  • Sundsvall
  • 2007-05-26 21:43

Jag hade använt mmig av några variabler mer än en gång, hade inte kontrollerat om det gissade bokstaven finns med i ordet, ja..koden var alltså en stor röra..så jag satte mig med min lärare och gick genom koden och vi rättade till det hela.

1
Bevaka tråden