Added the ability to set the number of digits in the guessed number.

This commit is contained in:
2023-08-02 15:11:25 +03:00
parent 324510173a
commit 3e22bb1dc1
8 changed files with 127 additions and 39 deletions

View File

@@ -1,14 +1,11 @@
// CGame.cpp // CGame.cpp
// //
#include "CGame.h" #include "CGame.h"
#include <string> #include "CUserInput.h"
#include <random> #include <random>
#include <cwctype>
#include <iostream>
void CGame::Init(int digits) void CGame::Init()
{ {
m_ucDigits = digits;
m_fGameIsEnd = false; m_fGameIsEnd = false;
m_ucBulls = 0; m_ucBulls = 0;
m_ucCows = 0; m_ucCows = 0;
@@ -46,7 +43,7 @@ void CGame::Start()
do do
{ {
PrintGameHeader(); PrintGameHeader();
ShowGuessedNumber(true); ShowGuessedNumber(false);
PrintSteps(); PrintSteps();
ret = GetNumber(step); ret = GetNumber(step);
switch (ret) switch (ret)
@@ -62,11 +59,6 @@ void CGame::Start()
break; break;
} }
case -3: case -3:
{
m_sLastError = L"Вы должны ввести число!";
break;
}
case -4:
{ {
m_sLastError = L"Цифры в числе не должны повторяться!"; m_sLastError = L"Цифры в числе не должны повторяться!";
break; break;
@@ -106,9 +98,8 @@ void CGame::ShowGuessedNumber(bool show)
void CGame::PrintGameHeader() void CGame::PrintGameHeader()
{ {
std::system("cls"); std::system("cls");
std::wcout << L"Быки и Коровы. Версия " << VERSION << std::endl; std::wcout << strGAMENAME << ' ' << strGAMEVERSION << ' ' << VERSION << std::endl;
std::wcout << L"Copyright (c) 2023 by W0LF aka 'dreamforce'" << std::endl; std::wcout << strGAMECOPYRIGHT << '\n' << std::endl;
std::wcout << std::endl;
} }
void CGame::PrintGameFooter() void CGame::PrintGameFooter()
@@ -150,13 +141,13 @@ int CGame::GetNumber(CStep step)
int r = std::iswdigit(c); int r = std::iswdigit(c);
if (!(bool)r) if (!(bool)r)
{ {
return -3; return -2;
} }
else else
{ {
if (IsEqual(sNumber, c, i)) if (IsEqual(sNumber, c, i))
{ {
return -4; return -3;
} }
digits.push_back(((int)c) - 48); // Convert from char 'n' to number n digits.push_back(((int)c) - 48); // Convert from char 'n' to number n
} }
@@ -165,11 +156,40 @@ int CGame::GetNumber(CStep step)
step.StoreStepNumber(digits); step.StoreStepNumber(digits);
step.CheckForAnimals(m_uGuessedNumber, m_ucDigits); step.CheckForAnimals(m_uGuessedNumber, m_ucDigits);
m_Steps.push_back(step); m_Steps.push_back(step);
if (step.GetStepAnimals().first == 4) m_fGameIsEnd = true; if (step.GetStepAnimals().first == m_ucDigits) m_fGameIsEnd = true;
return 0; return 0;
} }
CGame::CGame()
{
CUserInput userInput(1);
bool ok = false;
do
{
PrintGameHeader();
std::wcout << L"Введите количество цифр в числе (от 3 до 7).\n";
std::wcout << L"Чем больше цифр - тем сложнее. Обычно 4.\n";
std::wcout << L"> ";
if (userInput.Get())
{
if (userInput.m_vUserInput.at(0) >= 3 && userInput.m_vUserInput.at(0) <= 7)
{
m_ucDigits = userInput.m_vUserInput.at(0);
ok = true;
}
else
{
userInput.m_vUserInput.clear();
}
}
} while (!ok);
std::wcout << L"m_ucDigits: " << m_ucDigits << std::endl;
}
CGame::~CGame() CGame::~CGame()
{ {
delete[] m_uGuessedNumber; delete[] m_uGuessedNumber;

View File

@@ -1,15 +1,14 @@
// CGame.h // CGame.h
// //
#pragma once #pragma once
#include "defines.h"
#include "CUserInput.h"
#include "CStep.h" #include "CStep.h"
#include <string>
#define VERSION 0.2
class CGame class CGame
{ {
private: private:
int m_ucDigits; int m_ucDigits = 4; // Number of digits into the guessed number
int m_ucBulls; int m_ucBulls;
int m_ucCows; int m_ucCows;
bool m_fGameIsEnd; bool m_fGameIsEnd;
@@ -18,25 +17,19 @@ private:
std::wstring m_sLastError; std::wstring m_sLastError;
std::vector<CStep> m_Steps; std::vector<CStep> m_Steps;
int GetNumber(CStep);
void ShowGuessedNumber(bool);
void PrintGameHeader();
void PrintGameFooter();
void PrintSteps();
template<typename T, typename N> template<typename T, typename N>
bool IsEqual(const T, const N, int); bool IsEqual(const T, const N, int);
int GetNumber(CStep);
void ShowGuessedNumber(bool);
void PrintGameHeader();
void PrintGameFooter();
void PrintSteps();
public: public:
void Init();
void Init(int);
void Start(); void Start();
CGame();
~CGame(); ~CGame();
}; };
@@ -47,7 +40,7 @@ bool CGame::IsEqual(const T number, const N digit, int i)
while ((--i) >= 0) while ((--i) >= 0)
{ {
if (digit == number[i]) result = true; if (digit == number.at(i)) result = true;
} }
return result; return result;
} }

View File

@@ -0,0 +1,40 @@
// CUserInput.cpp
//
#include "CUserInput.h"
CUserInput::CUserInput(int nNumOfDigits)
{
m_nNumOfExpectedDigits = nNumOfDigits;
}
int CUserInput::Get()
{
std::wstring sDigits;
wchar_t cDigit;
int nDigit;
std::getline(std::wcin, sDigits);
if (sDigits == L"Q" || sDigits == L"q")
{
return -1;
}
if (sDigits.length() != m_nNumOfExpectedDigits)
{
return -2;
}
for (unsigned i = 0; i < m_nNumOfExpectedDigits; i++)
{
cDigit = sDigits.at(i);
if (!(bool)std::iswdigit(cDigit))
{
m_vUserInput.clear();
return -2;
}
nDigit = ((int)cDigit) - 48;
m_vUserInput.push_back(nDigit);
}
return 0;
}

View File

@@ -0,0 +1,18 @@
// CUserInput.h
//
#pragma once
#include "defines.h"
#include <iostream>
#include <string>
#include <vector>
#include <cwctype>
class CUserInput
{
public:
int m_nNumOfExpectedDigits;
std::vector<int> m_vUserInput;
CUserInput(int nNumOfExpectedDigits);
int Get();
};

View File

@@ -81,6 +81,7 @@
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -133,11 +134,14 @@
<ClCompile Include="bulls-and-cows.cpp" /> <ClCompile Include="bulls-and-cows.cpp" />
<ClCompile Include="CGame.cpp" /> <ClCompile Include="CGame.cpp" />
<ClCompile Include="CStep.cpp" /> <ClCompile Include="CStep.cpp" />
<ClCompile Include="CUserInput.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\..\MyFunctions\SetUserLocale.h" /> <ClInclude Include="..\..\..\MyFunctions\SetUserLocale.h" />
<ClInclude Include="CGame.h" /> <ClInclude Include="CGame.h" />
<ClInclude Include="CStep.h" /> <ClInclude Include="CStep.h" />
<ClInclude Include="CUserInput.h" />
<ClInclude Include="defines.h" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">

View File

@@ -27,6 +27,9 @@
<ClCompile Include="CStep.cpp"> <ClCompile Include="CStep.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="CUserInput.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="CGame.h"> <ClInclude Include="CGame.h">
@@ -38,5 +41,11 @@
<ClInclude Include="CStep.h"> <ClInclude Include="CStep.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="CUserInput.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="defines.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -3,15 +3,13 @@
#include <Windows.h> #include <Windows.h>
#include "..\..\..\MyFunctions\SetUserLocale.h" #include "..\..\..\MyFunctions\SetUserLocale.h"
#include "CGame.h" #include "CGame.h"
//#include <iostream>
int wmain(int argc, wchar_t* argv[]) int wmain(int argc, wchar_t* argv[])
{ {
if (!SetUserLocale()) return 1; if (!SetUserLocale()) return 1;
CGame game; CGame game;
game.Init();
game.Init(4);
game.Start(); game.Start();
return 0; return 0;

View File

@@ -0,0 +1,6 @@
#pragma once
#define VERSION 0.2
#define strGAMENAME L"Áûêè è Êîðîâû."
#define strGAMEVERSION L"Âåðñèÿ"
#define strGAMECOPYRIGHT L"Copyright (c) 2023 by W0LF aka 'dreamforce'"