# Hangman --- Wort auf Buchstabe überprüfen



## lz9c1j (27. April 2005)

Hallo zusammen
Ich bins wieder mal. Ich habe eine kleine Frage bezüglich meinem Hangman.
Es ist ein Spiel und man muss ein vorgegebenes Wort eraten. Wenn der ausgesuchte Buchstabe nicht im Wort enthalten ist, wächst das Männchen, welches aufgehängt ist, immer um ein Körperteil. (ca.8 Versuche).

Wort: Schweiz
TIPP: Land (z.B)

Meine Frage lautet, wie kann ich ein Wort auf einen Buchstaben vergleichen. Ich möchte also ein beliebiges Wort eingeben, welches dann mein Kollege erraten muss. Wenn ich also Text eintippe und mein Kollege ein e wählt, sollte 

Lösung: _ _ _ _ e _ _ _ (wenn er ein e wählt)

Wenn die Lösung aber falsch ist, sollte beim Männchen ein Kopf hinkommen. 
Könnte ihr mir bitte weiterhelfen.
Thx 4 hlp


----------



## Tobias K. (27. April 2005)

moin


In dem du eine Liste mit der selben größe wie dein Wort erstellst in der du speicherst ob der Buchstabe angezeigt werden soll oder nicht.


```
bool anzeigen[10];
char wort[10];

strcpy(wort, "Schweiz");

//Benutzereingabe.....

char taste = getch();

//prüfen ob vorhanden, an welcher, Stelle, und einstellen ob es angezeigt werden soll
for(int i=0; i<strlen(wort); i++)
    if(wort[i] == taste)
        anzeigen[i]=1;

//Ausgabe
for(int i=0; i<strlen(wort); i++)
{
    if(anzeigen == 1)
        printf("%c", wort[i]);
    else
        printf("_");
}
```

So im Prinzip wäre ein Durchlauf.


mfg
umbrasaxum


----------



## lz9c1j (2. Mai 2005)

danke für deine antwort. ware leider weg, seit deinem post. ich habe den code bei mir noch angepasst und nun habe ich ein weiteres problem. ich mache ja einen hangman und dann sollte man das wort von der vorhergehenden runde mitnehmen.

ist nur ein teil von dem code

```
//Ablauf
int main() {
 
	 char wahlSpiel;
	 int wahlMenu=0;
	 char oberbegriff[20];
	 char wort[20];
	 char wortPruefen[20];
	 int zufallszahl;
	 int counterVersuche=0;
	 char anzeigen[10];
	 int i;
	 char taste;
	 int counterEnthalten=0;
	 int kopf=0;
	 int kopf1=0;
	 int arm1=0;
	 int arm2=0;
	 int oberkoerper=0;
	 int bein1=0;
	 int bein2=0;
	 int fuss1=0;
	 int fuss2=0;
	 int buchstabenEnthalten=0;
 
	 while (wahlMenu==0) {
 
	 Startmenu(&wahlSpiel);
 
	 switch(wahlSpiel) {
 
		 case 'N': zufallszahl = NewGameTeil1();
				 wahlMenu = 1;
		 break;
 
		 case 'A': Anleitung();
				 wahlMenu = 0;
		 break;
 
		 case 'B': ExitGame(&wahlMenu);
				 wahlMenu = 1;
		 break;
 
	 }
	 }
 
 
	 switch(zufallszahl)
	 {
	 case 1: strcpy(wort, "JAPAN");
			 buchstabenEnthalten = 5;
			 strcpy(oberbegriff, "Land");
	 break;
 
	 case 2: strcpy(wort, "MEXICO");
			 buchstabenEnthalten = 6;
			 strcpy(oberbegriff, "Land");
	 break;
 
	 case 3: strcpy(wort, "PERU");
			 buchstabenEnthalten = 4;
			 strcpy(oberbegriff, "Land");
	 break;
 
	 case 4: strcpy(wort, "MAZEDONIEN");
			 buchstabenEnthalten = 10;
			 strcpy(oberbegriff, "Land");
	 break;
 
	 case 5: strcpy(wort, "UNGARN");
			 buchstabenEnthalten = 6;
			 strcpy(oberbegriff, "Land");
	 break;
 
	 case 6: strcpy(wort, "LETTLAND");
			 counterEnthalten = 8;
			 strcpy(oberbegriff, "Land");
	 break;
 
	 case 7: strcpy(wort, "NIEDERLAND");
			 buchstabenEnthalten = 10;
			 strcpy(oberbegriff, "Land");
	 break;
 
	 case 8: strcpy(wort, "INDIEN");
			 buchstabenEnthalten = 6;
			 strcpy(oberbegriff, "Land");
	 break;
 
	 case 9: strcpy(wort, "KENIA");
			 buchstabenEnthalten = 5;
			 strcpy(oberbegriff, "Land");
	 break;
 
	 case 10: strcpy(wort, "ARMENIEN");
			 buchstabenEnthalten = 8;
			 strcpy(oberbegriff, "Land");
	 break;
	 }
 
	 while (counterEnthalten < buchstabenEnthalten && counterVersuche < 7) {
 
		 printf("\tTIPP: %s", oberbegriff);		
 
		 printf("\n\t	oooooooooo");
		 printf("\n\t	o		o");
		 printf("\n\t	o		o");
		 printf("\n\t	o	 %c%c%c", kopf, kopf, kopf);
		 printf("\n\t	o	 %c %c", kopf, kopf);
		 printf("\n\t	o	 %c %c %c %c", kopf, kopf, kopf, kopf);
		 printf("\n\t	o	 %c %c %c", kopf, kopf, kopf);
		 printf("\n\t	o	 %c %c%c%c %c", kopf, kopf1, kopf1, kopf1, kopf);
		 printf("\n\t	o	 %c %c", kopf, kopf);
		 printf("\n\t	o	 %c%c%c", kopf, kopf, kopf);
		 printf("\n\t	o	 %c %c %c", arm1, oberkoerper, arm2);
		 printf("\n\t	o	 %c %c %c", arm1, oberkoerper, arm2);
		 printf("\n\t	o	 %c%c%c", arm1, oberkoerper, arm2);
		 printf("\n\t	o		%c", oberkoerper);
		 printf("\n\t	o		%c", oberkoerper);
		 printf("\n\t	o	 %c%c%c", bein1, oberkoerper, bein2);
		 printf("\n\t	o	 %c %c", bein1, bein2);
		 printf("\n\t	o	 %c	 %c", bein1, bein2);
		 printf("\n\t	o	%c	 %c", bein1, bein2);
		 printf("\n\t	o %c%c%c%c	 %c%c%c%c", fuss1, fuss1, fuss1, fuss1, fuss2, fuss2, fuss2, fuss2);
		 printf("\n\t	o");
		 printf("\n\toooooooooo");
 
		 printf("\n\tWaehlen Sie bitte einen Buchstaben: ");
		 scanf("%s", &taste);
		 fflush(stdin);
		 //prüfen ob vorhanden, an welcher, Stelle, und einstellen ob es angezeigt werden soll
		 for(i=0; i<strlen(wort); i++)
		 {
			 if(wort[i] == taste)
			 anzeigen[i]=1;
		 }
		 //Ausgabe
		 for(i=0; i<strlen(wort); i++)
		 { 
			 if(anzeigen[i] == 1) {
			 printf("Wort: %c", wort[i]);
			 counterEnthalten++;
			 }
		 else
			 printf("_");
		 }
 
		 if (counterEnthalten==0) {
 
			 switch(counterVersuche) {
				case 0: kopf=111;
						kopf1=95;
				break;
 
				case 1: oberkoerper=111;
				break;
 
				case 2: arm1=111;
				break;
 
				case 3: arm2=111;
				break;
 
				case 4: bein1=111;
				break;
 
				case 5: bein2=111;
				break;
 
				case 6: fuss1=111;
				break;
 
				case 7: fuss2=111;
				break;
			 }
		 }
```


----------



## Tobias K. (2. Mai 2005)

moin


Ich verstehe nciht was du meinst.


mfg
umbrasaxum


----------



## lz9c1j (2. Mai 2005)

ich weiss nicht genau, wie ich folgendes problem lösen soll.

man gibt ja einen beliebigen buchstaben ein, welcher er in der var... taste speichert. danach überprüft die for schleife ob der gewählte buchstabe mit dem ersten buchstaben vom lösungswort üebreinstimmt, dann vergleicht man den gewählten buchstaben mit dem zweiten buchstaben des lösungwortes usw... 
je nach dem erscheint dann der buchstabe oder ein _. da man bei mir im spiel 7 versuche hat um das wort rauszufinden, kann man in der 2ten runde wieder einen buchstaben eingeben. er soll aber den buchstaben von der ersten runde übernehmen.

beispiel:

1. runde:
lösungswort: HANGMAN
buchstaben: A
gibt: _A___A_

2.runde (falsch, also wie es jetzt ist):
buchstabe: G
gibt: ___G___

2.runde (richting, wie ich es gerne haben möchte)
buchstabe: G
gibt: _A_G_A_

hoffe es ist jetzt klarer


----------



## Tobias K. (2. Mai 2005)

moin


Dein Beispiel war sehr verständlich.

Drum änder ich mein Beispiel mal ein bsichen:

```
char ergebnis[10];
char wort[10];

strcpy(wort, "Schweiz");

//Ergebnis mit _ füllen
for(int i=0; i<strlen(wort); i++)
{
    ergebnis[i]='_';
    ergebnis[i+1]='\0';
}

//Benutzereingabe.....
char taste = getch();

for(int i=0; i<strlen(wort); i++)
{
    if(wort[i] == taste)
        ergebnis[i]=wort[i];
}

//Ausgabe
printf("%s", ausgabe);
```

So sollte ein Durchlauf nun aussehen, ist aber ungetestet.
Du müsstest nun noch gucken ob ein Buchstabe zwei mal eingegeben wurde, aber das ja kein Ding.


----------



## Tobias K. (2. Mai 2005)

moin


Wenn nicht auf Groß und Kleinschreibung geachtet werden soll, musst du : 

```
if(wort[i] == taste)
```
Durch

```
if(wort[i] == taste || wort[i] == (taste+32) || wort[i] == (taste-32))
```


mfg
umbrasaxum


----------



## melisa18 (29. März 2007)

hallo ich habe erst vor ca. 1 Woche angemeldet.
Ich habe das gleiche Programm geschrieben aber will mit Wiederholungen schreiben, kann jemand mir einen Lösungsvorschlag geben?
Danke


----------



## melisa18 (29. März 2007)

oooo sorry weil ich neu bin weiß ich nicht so sehr
aber oben steht es egal also
das programm lautet:

```
#include <stdio.h>
#include <string.h>
#include <conio.h>


int main()
{

	char ergebnis[20];
	char wort[20];
	int i, laenge;

	strcpy(wort,"Deutschland");	
	laenge=strlen(wort);
	for(i=0; i<laenge; i++)
	{
		//Ergebnis mit _ füllen
		ergebnis[i]='-';
		
	}
	ergebnis[i]='\0';
	printf("\n%s",ergebnis);

	//Benutzereingabe.....
	char taste=getchar();

	for(i=0; i<laenge; i++)
	{
		if(wort[i]==taste)
		{
			ergebnis[i]=taste;
		}
	}

	//Ausgabe
	printf("%s",ergebnis);
```

wiederholung das heißt ich will es mehrmals wiederholen


----------



## Darkas (29. März 2007)

wenn das genau der Code ist dann mach einfach ein

```
char again = "J";
```
 an den Anfang und ein

```
while(again != "N" || again != "n")
{
:
cout << "Nochmal Spielen? J=Ja; N=Nein" << endl;
cin >> again;
}
```
um das ganze


wie das genau mit printf und scanf geht weiss ich nicht aber das kannst du dir ja denken


----------



## melisa18 (30. März 2007)

ja so weit geht jetzt danke
und jetzt möchte ich so machen, dass ich den ganze Wort Raten kann also
z.B. das Wort "Hallo" ist gegeben, bei meine Programm ist so, dass ich nur ein Buchstabe verraten kann. 
Wie geht jetzt wenn ich das ganze Wort Raten will


----------



## Online-Skater (31. März 2007)

Prüfe doch ob der User mehr als nur ein Zeichen eingegeben hat, ist das der Fall vergleichst du es mit dem Ausgedachten oder du vergleichst so oder so immer gleich mit dem ganzen Wort wobei der Fehler nur hochgezählt wird wenn es kein einzelner bzw. ein falscher ist.
Bei diesem Ansatz müsstenst du aber ein Char-Array oder den Typ *string* benutzen (string.h)

mfg


----------



## melisa18 (7. April 2007)

ja danke 
aber könntest du vierleicht mir so ganz kurz das programm schreiben?


----------



## Online-Skater (7. April 2007)

Hier mal ein schnell dahingetipptes Besispiel wie das ausschauen könnte:


```
#include <stdio.h>
#include <string.h>
#include <conio.h>

typedef unsigned short int usint;

int main()
{
  printf("Hangman Deluxe \n\n");
  const usint max_breite = 20, max_err = 10;
  char ergebnis[max_breite];
  const char wort[max_breite] = "Deutschland";
  usint i,laenge=strlen(wort),error=0;
  bool solved = false,OK = false;

  for(i=0; i<laenge; i++)
    //Ergebnis mit _ füllen
    ergebnis[i] = '-';

  ergebnis[i] = '\0';
  printf("%s - Fehler: %d von %d\n",ergebnis,error,max_err);

  while (error != max_err && !solved)
  {
    OK = false;
    //Benutzereingabe.....
    char eingabe[max_breite];
    scanf("\n%s",eingabe);
    if (strlen(eingabe) == 1)
    {
      for(i = 0; i < laenge; i++)
      {
        if (wort[i] == eingabe[0])
        {
          ergebnis[i] = eingabe[0];
          OK = true;  // Buchstabe gefunden
        }
      }
      if (!OK) error++;
      else if (strncmp(wort,ergebnis,max_breite) == 0) solved = true;
    }
    else {
           if (strncmp(wort,eingabe,max_breite) == 0) solved = true;
           else error++;
         }
    //Ausgabe
    if (solved) printf("Richtig !\n\n");
    else printf("%s - Fehler: %d von %d\n",ergebnis,error,max_err);
  }
  printf("Game Over");
  getch();
}
```


----------



## melisa18 (13. April 2007)

danke es hat mir sehr heholfen


----------



## jontte28 (29. Oktober 2009)

Hallo 


Ich bin dabei auch Hangman programm am schreiben. 
hab das problem das... 
**** //das wort wäre z.b. haus, der eingeber gibt h ein.  
h*** //bis jetzt ist alles richtig aber dann gibt der eingeber a ein. 
*a** // das h verschwindet. 
hab ich alle richtige buchstäben eingegeben, spielt das spielt weiter bis die 7 versuche zu ende ist. aber sagt trotzdem gefrafft. 


```
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h> 

int hangman()

{
char input;
char temp[12];
char word[][20] = {"bil","cykel", "hammare", "nyckel",
"hem", "afrika", "nolla", "nummer", "adress", "efter",
"final", "igen", "nu",
"folk", "jag", "du", "allihop", "vem",
"olika", "alltid"};

srand((unsigned)time(NULL)); 
int k = (rand() % 20);
int i = 0;
int r = 0;

char b[]= "*********";

int length = strlen(word[k]);
int turn = 7;
int dummy = 0;
int decide = 0;

printf("so many letters you have.\n");

for(i = 0; i < length; i++)
  {
    printf("%c", b[i]);
  }

while(turn != 0)
  {
  printf("\nTurns left: ");
  printf("%d", turn);

  printf("\nEnter a letter to guess: ");
  input = getchar();
    
    while(getchar() != '\n');
 //   printf(" %s.\n", word[k]);
      for(r = 0; r < length; r++)
	{
	  if(input == word[k][r]) 	//om bokstaven är rätt
	    {
	      decide = 1;
	      
	      printf("%c", word[k][r]);
	    }
	  if(input != word[k][r]) 						//om bokstaven är fel 
	    {
	      decide = 0; 
	      printf("*");
	    }
	}

      if(decide == 0)
	{
	  turn--;
	}

      for(r = 0; r < length; r++)
	{
	  if(input == word[k][r])
	    {
	      b[r] = word[k][r];
	      temp[r] = word[k][r];
	      temp[length] = '\0';

	     // printf("%c", b[r]);
	    }
	}
  }
if(strcmp(temp, word[k]) == 0) 
  { 
    printf("%c", word[k][r]); 
  }
if(strcmp(temp, word[k]) != 0)
  {
    printf("\nSorry, no more turns left. The secret word was %s.\n", word[k]);
  }
else
  {
    printf("\nCongratulations!\nYou guessed the secret word: %s\n", word[k]);
  }

return 0;
}



int main(void)
{

printf("Welcome to HANGMAN\n");

printf("You will be asked to guess the computer's secret word.\n");
printf("The word will be displayed as a number of *'s. Every time\n");
printf("you guess a letter correctly, that letter will be shown in its\n");
printf("correct position in the word. If you guess incorrectly, the\n");
printf("number of tries you have left will be decremented. You will be\n");
printf("given a maximum of 7 incorrect guesses.\n\n");

hangman();

return 0;
}
```


----------



## Online-Skater (30. Oktober 2009)

Hi, an der Stelle von Variable b machst du ein Array "loesung" das nach der auswahl des Suchwortes erstellt wird mit der entsprechenden Anzahl Sterne. Wenn der nutzer nun einen buchstabe richtig rät, weißt du die Stelle und trägst ihn an die richtige Stelle in der Variable "loesung" ein und gibst sie danach aus.


----------



## jontte28 (30. Oktober 2009)

Hi danke für deiner schnelle antwort. 

meinst du an char variabel? 

kannst du zeigen wie das ausehen würde? 

MFG Jontte28


----------



## Online-Skater (30. Oktober 2009)

Nagut ich hoffe du kannst draus lernen und überlegst dir die Programmlogik vorher ein wenig 


```
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

int hangman()
{
    char input;
    char word[][20] = {"bil","cykel", "hammare", "nyckel",
                       "hem", "afrika", "nolla", "nummer", "adress", "efter",
                       "final", "igen", "nu",
                       "folk", "jag", "du", "allihop", "vem",
                       "olika", "alltid"};

    srand((unsigned)time(NULL));
    int k = (rand() % 20);
    int i = 0;
    int length = strlen(word[k]);
    int turn = 7;
    int hit = 0;

    printf("so many letters you have.\n");

    char raten[length];
    for(i = 0; i < length; i++)
    {
        raten[i] = '*';
        printf("%c", raten[i]);
    }
    raten[i] = '\0';

    while(turn != 0)
    {
        printf("\nTurns left: ");
        printf("%d", turn);

        printf("\nEnter a letter to guess: ");
        input = getchar();

        while(getchar() != '\n');
        //printf(" %s.\n", word[k]);
        for(i = 0; i < length; i++)
        {
            if(input == word[k][i] && input != raten[i])     //om bokstaven är rätt
            {
                hit = 1;
                raten[i] = input;
            }
            printf("%c", raten[i]);
        }

        if(hit == 0)
        {
            turn--;
        }
        else
        {
            hit = 0;
            if(strcmp(raten, word[k]) == 0)
            {
                printf("\nCongratulations!\nYou guessed the secret word: %s\n", word[k]);
                break;
            }
        }
    }

    if (turn == 0)
    {
        printf("\nSorry, no more turns left. The secret word was %s.\n", word[k]);
    }
    return 0;
}
```

mfg


----------

