00001 #include "StateLoop.h"
00002
00003 #include "StateStart.h"
00004 #include "GameContext.h"
00005
00006 #include <iostream>
00007 #include <iterator>
00008 #include <vector>
00009
00010
00011 void StateLoop::update(){
00012 if(!updateAvailable)
00013 return ;
00014 updateAvailable = false;
00015
00016 if(solved || countFailAnswers > 5 ){
00017 solved = false;
00018 countFailAnswers = 0;
00019 State::gameContext->generateNextWord();
00020 letters.erase(letters.begin(),letters.end());
00021 }
00022
00023 currentWord = "";
00024 int countTrueLetters = 0;
00025 std::string word = State::gameContext->getWord();
00026 for(unsigned int i = 0; i < word.size(); i++ ){
00027
00028 if( static_cast<char>(word[i]) == ' '){
00029 currentWord += " ";
00030 countTrueLetters++;
00031 }
00032 else if(letters.find(word[i]) == letters.end())
00033 currentWord += "*";
00034 else{
00035 currentWord += word[i];
00036 countTrueLetters++;
00037 }
00038 }
00039 if(countTrueLetters == word.size())
00040 solved = true;
00041 }
00042 void StateLoop::doPrint(){
00043 clearConsole();
00044 std::cout<<"Hangman Spiel\n-------------\n";
00045 std::cout<<"\n\n\n";
00046 std::cout<<" "<<currentWord<<std::endl;
00047 std::cout<<" _____\n";
00048 std::cout<<" |/ |\n";
00049 switch(countFailAnswers){
00050 case 0:
00051 std::cout<<" |\n |\n |\n";
00052 break;
00053 case 1:
00054 std::cout<<" | O \n |\n |\n";
00055 break;
00056 case 2:
00057 std::cout<<" | O\n | |\n |\n";
00058 break;
00059 case 3:
00060 std::cout<<" | O\n | \\|\n |\n";
00061 break;
00062 case 4:
00063 std::cout<<" | O\n | \\|/\n |\n";
00064 break;
00065 case 5:
00066 std::cout<<" | O\n | \\|/\n | /\n";
00067 break;
00068 case 6:
00069 std::cout<<" | O\n | \\|/\n | / \\ \n";
00070 break;
00071 }
00072 std::cout<<" |\n";
00073 std::cout<<" OOOOOOOO\n\n";
00074 std::cout<<" ";
00075 std::copy(letters.begin(), letters.end(), std::ostream_iterator<char>(std::cout));
00076 std::cout<<"\n\n";
00077 if(countFailAnswers > 5)
00078 std::cout<<" Das gesuchte Wort war: "<<State::gameContext->getWord();
00079 if(solved)
00080 std::cout<<" Wort gefunden";
00081 std::cout<<"\n\n";
00082 if(countFailAnswers > 5 || solved)
00083 std::cout<<"1 Zurueck\n Weiter mit beliebiger Taste\n"<<std::endl;
00084 else
00085 std::cout<<"1 Zurueck\nA-Z Antwort\n"<<std::endl;
00086 std::cout<<"Treffen Sie eine Wahl:";
00087 }
00088 void StateLoop::doGetKey(){
00089
00090 std::cin.clear();
00091 std::cin.ignore(std::cin.rdbuf()->in_avail());
00092 int number = std::cin.get();
00093
00094 if(number == static_cast<int>('1')){
00095 State::gameContext->setState(StateStart::instance());
00096
00097 solved = true;
00098 }
00099 if(solved || countFailAnswers > 5 ){
00100
00101 updateAvailable = true;
00102 return;
00103 }
00104
00105
00106
00107 if(number >= static_cast<int>('a') && number <= static_cast<int>('z')){
00108 number -= 32;
00109 }
00110 if(number >= static_cast<int>('A') && number <= static_cast<int>('Z')){
00111 int len = letters.size();
00112 letters.insert(static_cast<char>(number));
00113 if(len == letters.size()){
00114 std::cout<<"Eingabe vorhanden. Bitte wiederholen.\n";
00115 doGetKey();
00116 return ;
00117 }else{
00118 if(State::gameContext->getWord().find(static_cast<char>(number)) == std::string::npos)
00119 countFailAnswers++;
00120 else
00121 updateAvailable = true;
00122 }
00123 }else{
00124 std::cout<<"Keine gueltige Eingabe. Bitte wiederholen.\n"<<std::endl;
00125 doGetKey();
00126 }
00127 }
00128