http://www.pudn.com/downloads97/sourcecode/others/detail399517.html#include<iostream> //Standard input/output
#include<string> //String manipulation
#include<cctype> //Character manipulation and testing
#include<fstream> //File stream
#include<cstdlib> //Used for random function
#include<time.h> //Used for better random number
#include"draw.h" //run the draw.h file
using namespace std;
//Function declerations
void instruction(int& choice); //Give instructions and gets choice
void usergame(int i); //Plays 2nd user game
void compgame(int i); //Plays against computer
//Tests current letter and raplaces starred word
void test(string word,char letter,int& numwrong,string& temp,int i);
//Checks current letter and adds it to letters chosen output if not entered already
void lchosen(char letter,string& letterchosen,int& check,int& chosencounter,int i);
void rnd(string& word,int i); //Gets random word from file
void drawman(int numguess,int numwrong,int i); //Draws hangman
inline istream& Flush(istream& stream); //Flushses cin stream
//Start of main
int main()
{
int i=0; //Counter variable for loops
int exit=0; //Main loop exit variable
int choice; //users input choice for type of game or to exit
//Main control loop
do{ //while exit!=1
system("cls"); //执行系统命令清屏
instruction(choice);//Give instructions
switch(choice)
{
case 1:
usergame(i);//Calls user game
break;
case 2:
compgame(i);//Calls computer game
break;
case 3:
cout<<"Goodbye"<<endl;
exit=1;
break;
default:
cerr<<"Invalid choice---try again"<<endl;
}
}while(exit!=1);
//End main loop
system("pause"); //执行系统命令:暂停
return 0;
}
//End main
void instruction(int& choice)
{
cout<<" --Hangman--"<<endl<<endl;
cout<<" Created by laser"<<endl<<endl;
cout<<"*************************************************"<<endl;
cout<<endl;
cout<<"Enter --1--to play against user"<<endl;
cout<<"Enter --2--to play against computer"<<endl;
cout<<"Enter --3--to quit"<<endl;
cout<<endl;
cout<<"*************************************************"<<endl<<endl;
cout<<"Choice: ";
cin>>choice;
while(!cin)
{
cerr<<"Invalid character"<<endl;
cerr<<"Enter again --choice: ";
Flush(cin);
cin>>choice;
}
system("cls");
}
void usergame(int i)
{
int numguess=0;
int numwrong=0;
int check;
int wordcheck;
int end=0;
int chosencounter=0;
//
char letter;
string word;
string temp;
string letterchosen=" ";
//
do{
cout<<"How many chances does the person have(4--10):";
cin>>numguess;
}while(numguess<4||numguess>10);
cout<<"Enter word 2nd user: ";
cin>>word;
do{
wordcheck=0;
for(int i=0;i<word.length();i++)
{
if(!isalpha(word.at(i)))
{
wordcheck=1;
}
}
if(wordcheck==1)
{
cout<<"Invalid--Enter word again: ";
cin>>word;
}
}while(wordcheck==1);
temp=word;
for(i=0;i<word.length();i++)
{
temp.replace(i,1,1,'*');
}
system("cls");
do{
drawman(numguess,numwrong,i);
if(word==temp)
{
cout<<endl<<endl;
cout<<"You guessed it["<<word<<"]"<<endl<<endl;
system("pause");
end=1;
}
if(numwrong==numguess)
{
cout<<endl<<endl;
cout<<"You failed"<<endl<<endl;
system("pause");
end=1;
}
if(end==0)
{
cout<<endl<<endl<<endl;
cout<<"Letters chosen: "<<letterchosen<<endl;
cout<<endl<<endl<<endl;
cout<<"guesses left: "<<numguess-numwrong<<endl<<endl;
cout<<" "<<temp<<endl<<endl;
cout<<"Letter: ";
cin>>letter;
while(!isalpha(letter))
{
Flush(cin);
cout<<"Not a letter--enter letter: ";
cin>>letter;
}
lchosen(letter,letterchosen,check,chosencounter,i);
if(check==0)
{
test(word,letter,numwrong,temp,i);
}
else
{
;
}
system("cls");
}
system("cls");
}while(end!=1 && end!=2);
if(end==2)
{
cout<<"Correct word was["<<word<<"]"<<endl<<endl;
system("pause");
}
if(end==1)
{
cout<<" ";
}
system("cls");
}
void compgame(int i)
{
int numguess=0;
int numwrong=0;
int check;
int end=0;
int chosencounter=0;
char letter;
string word;
string temp;
string letterchosen=" ";
do{
cout<<"How many chances do you want(4--10): ";
cin>>numguess;
}while(numguess<4||numguess>10);
rnd(word,i);
temp=word;
for(i=0;i<word.length();i++)
{
temp.replace(i,1,1,'*');
}
system("cls");
do{
drawman(numguess,numwrong,i);
if(word==temp)
{
cout<<endl<<endl;
cout<<"You guessed it["<<word<<"]"<<endl<<endl;
system("pause");
end=1;
}
if(numwrong==numguess)
{
cout<<endl<<endl;
cout<<"You failed"<<endl<<endl;
system("pause");
end=2;
}
if(end==0)
{
cout<<endl<<endl<<endl;
cout<<"Letters chosen: "<<letterchosen<<endl;
cout<<endl<<endl<<endl;
cout<<"Guesses left: "<<numguess-numwrong<<endl<<endl;
cout<<" "<<temp<<endl<<endl;
cout<<"Letter: ";
cin>>letter;
while(!isalpha(letter))
{
Flush(cin);
cout<<"Not a letter---enter letter: ";
cin>>letter;
}
lchosen(letter,letterchosen,check,chosencounter,i);
if(check=0)
{
test(word,letter,numwrong,temp,i);
}
else
{
;
}
system("cls");
}
system("cls");
}while(end!=1&& end!=2);
if(end==2)
cout<<"Correct word was["<<word<<"]"<<endl<<endl;
system("pause");
if(end==1)
cout<<endl;
system("cls");
}
void lchosen(char letter,string& letterchosen,int& check,int& chosencounter,int i)
{
check=0;
for(i=0;i<letterchosen.length();i++)
{
if(letter==letterchosen.at(i))
{
check=1;
}
}
if(check==1)
{
cout<<endl;
cout<<"Letter already chosen"<<endl;
system("pause");
}
else
{
letterchosen.replace(chosencounter,1,1,letter);
chosencounter++;
}
}
void test(string word,char letter,int& numwrong,string& temp,int i)
{
int check2=0;
for(i=0;i<word.length();i++)
{
if(letter==word.at(i))
{
temp.replace(i,1,1,letter);
check2=1;
}
}
if(check2==0)
{
cout<<endl;
cout<<"Wrong letter"<<endl;
system("pause");
numwrong++;
}
}
void rnd(string& word,int i)
{
int x;
ifstream ins;
srand(time(NULL));
x=rand()%100;
ins.open("words.txt");
if(ins.fail())
{
cerr<<"Words.txt is not in same folder as hangman.exe,"<<endl
<<"put in correct file and run again and make sure it's"<<endl
<<"caled words.txt"<<endl;
system("pause");
main();
}
else
{
for(i=0;i<(x+1);i++)
{
getline(ins,word);
}
}
ins.close();
}
void drawman(int numguess,int numwrong,int i)
{
draw d;
for(i=0;i<=numwrong;i++)
{
if(numguess==4)
{
switch(i)
{
case 1:d.rope();cout<<endl;d.head();
cout<<endl;d.neck();break;
case 2:cout<<endl;d.leftarm();
d.rightarm();break;
case 3:cout<<endl;d.waisttop();break;
case 4:cout<<endl;d.leftleg();d.rightleg();
cout<<endl<<endl<<"Dead"<<endl;break;
}
}
else if(numguess==5)
{
switch(i)
{
case 1:d.rope();break;
case 2:cout<<endl;d.head();cout<<endl;d.neck();break;
case 3:cout<<endl;d.leftarm();d.rightarm();break;
case 4:cout<<endl;d.waisttop();break;
case 5:cout<<endl;d.leftleg();d.rightleg();
cout<<endl<<endl<<"Dead"<<endl;break;
}
}
else if(numguess==6)
{
switch(i)
{
case 1:d.rope();break;
case 2:cout<<endl;d.head();cout<<endl;d.neck();break;
case 3:cout<<endl;d.leftarm();d.rightarm();break;
case 4:cout<<endl;d.waisttop();break;
case 5:cout<<endl;d.leftleg();d.rightleg();
case 6:d.rightleg();cout<<endl<<"Dead"<<endl;break;
}
}
else if(numguess==7)
{
switch(i)
{
case 1:d.rope();break;
case 2:cout<<endl;d.head();cout<<endl;d.neck();break;
case 3:cout<<endl;d.leftarm();break;
case 4: d.rightarm();break;
case 5:cout<<endl;d.waisttop();break;
case 6:cout<<endl;d.leftleg();break;
case 7:d.rightleg();cout<<endl<<"Dead"<<endl;break;
}
}
else if(numguess==8)
{
switch(i)
{
case 1:d.rope();break;
case 2:cout<<endl;d.head();break;
case 3:cout<<endl;d.neck();break;
case 4:cout<<endl;d.leftarm();break;
case 5: d.rightarm();break;
case 6:cout<<endl;d.waisttop();break;
case 7:cout<<endl;d.leftleg();break;
case 8:d.rightleg();cout<<endl<<"Dead"<<endl;break;
}
}
else if(numguess==9)
{
switch(i)
{
case 1:d.rope();break;
case 2:cout<<endl;d.head();break;
case 3:cout<<endl;d.neck();break;
case 4:cout<<endl;d.leftarm();break;
case 5: d.rightarm();break;
case 6:cout<<endl;d.waisttop();break;
case 7:break;
case 8:cout<<endl;d.leftleg();break;
case 9:d.rightleg();cout<<endl<<"Dead"<<endl;break;
}
}
else if(numguess==10)
{
switch(i)
{
case 1:d.rope();break;
case 2:cout<<endl;d.head();break;
case 3:cout<<endl;d.neck();break;
case 4:cout<<endl;d.leftarm();break;
case 5: d.rightarm();break;
case 6:cout<<endl;d.waisttop();break;
case 7:break;
case 8:cout<<endl;d.leftleg();break;
case 9:d.rightleg();
cout<<"One last chance.What do you want on your tombstore?";break;
case 10:cout<<endl<<"Dead"<<endl;break;
}
}
}
}
inline istream& Flush(istream& stream)
{
stream.clear();
int chars_to_skip=stream.rdbuf()->in_avail();
return stream.ignore(chars_to_skip);
}