mirror of
https://gitflic.ru/project/w0lf/bulls-and-cows-cpp.git
synced 2026-03-28 16:02:46 +03:00
Added the ability to set the number of digits in the guessed number.
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
40
bulls-and-cows-cpp/CUserInput.cpp
Normal file
40
bulls-and-cows-cpp/CUserInput.cpp
Normal 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;
|
||||||
|
}
|
||||||
18
bulls-and-cows-cpp/CUserInput.h
Normal file
18
bulls-and-cows-cpp/CUserInput.h
Normal 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();
|
||||||
|
};
|
||||||
@@ -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">
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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;
|
||||||
|
|||||||
6
bulls-and-cows-cpp/defines.h
Normal file
6
bulls-and-cows-cpp/defines.h
Normal 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'"
|
||||||
Reference in New Issue
Block a user