Advertisement
Guest User

Untitled

a guest
May 16th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 KB | None | 0 0
  1. // GuessANumber.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <random>
  7. #include <sstream>
  8. #include <string>
  9.  
  10. using namespace std;
  11.  
  12.  
  13. //Skapar ett randomnummer mellan X och Y.
  14. //I de bästa av världar hade inte objekten instansierats i denna funktionen utan gjort det på ett annat ställe. Men detta påverkade inte prestandan något.
  15. int RandomNumberGenerator(int minGuess, int maxGuess)
  16. {
  17.     random_device _randomDevice;
  18.     mt19937 rng(_randomDevice());
  19.     uniform_int_distribution<int> distr(minGuess, maxGuess);
  20.  
  21.     return distr(rng);
  22. }
  23.  
  24. //Läser användarens inmatning
  25. string ReadUserInput()
  26. {
  27.     string _input;
  28.     getline(cin, _input);
  29.  
  30.     return _input;
  31. }
  32.  
  33. //Struktor för att komma åt de värden som genereras i CheckUserInput.
  34. struct ValidUserInput
  35. {
  36.     int _valueOfInput;
  37.     bool _validInput;
  38. };
  39.  
  40. //Validerar användarinmatningen. Tar hänsyn till ifall <ENTER> trycks ned genom att sätta värdet till 0 om strängen är tom.
  41. ValidUserInput CheckUserInput(string Input)
  42. {
  43.     ValidUserInput _validUserInput;
  44.    
  45.     _validUserInput._validInput = false;
  46.     int _inputValueToInt;
  47.    
  48.     stringstream _IntFromStream(Input);
  49.  
  50.     if(Input == "")
  51.     {
  52.         _validUserInput._valueOfInput = 0;
  53.         _validUserInput._validInput = true;
  54.     }
  55.     else if(_IntFromStream >> _inputValueToInt)
  56.     {
  57.         if(_inputValueToInt >= 1 && _inputValueToInt <= 3)
  58.         {
  59.             _validUserInput._valueOfInput = _inputValueToInt;
  60.             _validUserInput._validInput = true;
  61.         }
  62.     }
  63.     else
  64.     {
  65.         _validUserInput._validInput = false;
  66.     }
  67.  
  68.     return _validUserInput;
  69.  
  70. };
  71.  
  72. //Rekursiv funktion som hanterar felaktig inmatning.
  73. //Returnerar värdet från den sträng som matas in i CheckUserInput in.
  74. int GetUserInput()
  75. {
  76.     ValidUserInput _userInput = CheckUserInput(ReadUserInput());
  77.     int Result;
  78.  
  79.     if (_userInput._validInput == true)
  80.     {
  81.         Result = _userInput._valueOfInput;
  82.     }
  83.     else
  84.     {
  85.         cout << "Inget giltigt värde." << endl;
  86.         Result = GetUserInput();
  87.     }
  88.  
  89.     return Result;
  90. }
  91.  
  92. /*
  93. void OutputToUser()
  94. {
  95.  
  96.     //Göra ytterligare en funktion som har hand om all form av output.
  97.  
  98. }
  99. */
  100.  
  101. int _tmain(int argc, _TCHAR* argv[])
  102. {
  103.  
  104.     cout << "Tänk på ett tal mellan 1 och 100. Tryck ENTER när du är klar." << endl;
  105.     cin.get();
  106.  
  107.     int _answer;
  108.     int _guessCounter = 1;
  109.     int _minGuess = 1;
  110.     int _maxGuess = 100;
  111.     int _numbersToGuess = RandomNumberGenerator(_minGuess, _maxGuess);
  112.  
  113.     bool _correctGuess = false;
  114.  
  115.    
  116.     while ( _correctGuess == false && _guessCounter <= 7 && _minGuess != _maxGuess)
  117.     {
  118.    
  119.         cout << "Jag gissar på " << _numbersToGuess << endl;
  120.         cout << "Tryck 1 om det var rätt tal." << endl << "Tryck 2 om ditt tal är högre" << endl << "Tryck 3 om ditt tal är lägre" << endl << "Avsluta med ENTER." << endl;
  121.        
  122.         _answer = GetUserInput();
  123.         cout << endl << _answer << endl;
  124.        
  125.        
  126.         switch (_answer)
  127.         {
  128.  
  129.             case 1:
  130.                 cout << "Hurra! Jag gissade rätt på " << _guessCounter << " försök." << endl;
  131.                 cin.get();
  132.                 _correctGuess = true;
  133.                 break;
  134.             //Adderar eller subtraherar 1 från varje gissning så att den inte råkar slumpa fram föregående värde.
  135.             //Kan ske ifall första gissningen är väldigt hög/låg.
  136.             case 2:
  137.                 if (_minGuess + 1 <= _maxGuess)
  138.                 {
  139.                     _minGuess = _numbersToGuess ++;
  140.                 }
  141.                 _numbersToGuess = RandomNumberGenerator(_minGuess, _maxGuess);
  142.                 break;
  143.  
  144.             case 3:
  145.                 if (_maxGuess - 1 >= _minGuess)
  146.                 {
  147.                     _maxGuess = _numbersToGuess --;
  148.                 }
  149.                 _numbersToGuess = RandomNumberGenerator(_minGuess, _maxGuess);
  150.                 break;
  151.  
  152.             case 0:
  153.                 cout << "Avslutar programmet.";
  154.                 _correctGuess = true;
  155.            
  156.             default:
  157.                 cout << "Här borde du inte hamna om kontrollet gjorts ordentligt" << endl;
  158.                 break;
  159.  
  160.         }
  161.         _numbersToGuess++;
  162.     }
  163.  
  164.     //Om nummergeneratorn av någon anledning skulle genenera samma värde, har användaren antingen gjort fel, eller så är det en bugg.
  165.     if (_minGuess == _maxGuess)
  166.     {
  167.         cout << "Om du följde reglerna borde du inte hamnat här." << endl << "Gör om, gör rätt." << endl;
  168.         cin.get();
  169.     }
  170.  
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement