#include "BullCowCartridge.h"
#include "Misc/FileHelper.h"
#include "Misc/Paths.h"
#include "ctime"
void UBullCowCartridge::BeginPlay() // When the game starts
{
Super::BeginPlay();
const FString WordListPath = FPaths::ProjectContentDir() / TEXT("WordLists/HiddenWordList.txt");
FFileHelper::LoadFileToStringArray(WordList, *WordListPath);
PopulateWords();
SetupGame();
//PrintLine(TEXT("The HiddenWord is: %s"), *HiddenWord); //Debug Line
}
void UBullCowCartridge::OnInput(const FString& PlayerInput) // When the player hits enter
{
ClearScreen();
if (bGameOver)
{
ClearScreen();
SetupGame();
}
else
{
CheckGuess(PlayerInput);
if (Lives == 0)
{
PrintLine(TEXT("You have lost, the hidden word was %s"), *HiddenWord);
EndGame();
}
}
}
void UBullCowCartridge::SetupGame()
{
srand(time(NULL));
// do
// {
// HiddenWord = Words[rand() % Words.Num()];
// }
// while (HiddenWord.Len() < 4 || HiddenWord.Len() > 8 || !IsIsogram(HiddenWord));
HiddenWord = Isograms[rand() % Isograms.Num()];
Lives = HiddenWord.Len();
bGameOver = false;
bGameWon = false;
bMulligan = true;
PrintLine(TEXT("Welcome to the Bull Cow Game!"));
PrintLine(TEXT("You have %i guesses for the secret isogram"), HiddenWord.Len());
PrintLine(TEXT("*An isogram has no repeating characters*"));
PrintLine(TEXT("Guess the %i letter word and press enter:"), HiddenWord.Len());
// Debug
PrintLine(TEXT("The HiddenWord is: %s"), *HiddenWord);
PrintLine(TEXT("%i"), Isograms.Num());
}
void UBullCowCartridge::EndGame()
{
bGameOver = true;
if (bGameWon)
{
PrintLine(TEXT("You guessed correctly!!!"));
}
PrintLine(TEXT("\nPress enter to play again"));
Isograms.Remove(HiddenWord);
if (Isograms.Num() <= 0)
{
PopulateWords();
}
}
void UBullCowCartridge::PopulateWords()
{
for (FString Word : WordList)
{
if (Word.Len() >= 4 && Word.Len() <= 8 && IsIsogram(Word))
{
Isograms.Emplace(Word);
}
}
}
void UBullCowCartridge::CheckGuess(const FString& Guess)
{
if (Guess == HiddenWord)
{
bGameWon = true;
EndGame();
return;
}
if (Guess == TEXT(""))
{
PrintLine(TEXT("Please type a guess and press enter"));
return;
}
if (Guess.Len() != HiddenWord.Len() || !IsIsogram(Guess))
{
PrintLine(TEXT("ERROR!\nGuess was not %i characters long"), HiddenWord.Len());
PrintLine(TEXT("or has repeating characters"));
if (bMulligan)
{
PrintLine(TEXT("This is your one mulligan"));
bMulligan = false;
}
else
{
if (--Lives > 0)
{
PrintLine(TEXT("Your guess was wrong"));
PrintLine(TEXT("Guess again, %i guess(es) remaining"), Lives);
}
}
return;
}
if (--Lives > 0)
{
PrintLine(TEXT("Your guess was wrong"));
TArray<int32> BullCow = IsBullOrCow(Guess, HiddenWord);
PrintLine(TEXT("You have %i Bulls and %i Cows"), BullCow[0], BullCow[1]);
PrintLine(TEXT("Guess again, %i guess(es) remaining"), Lives);
}
}
bool UBullCowCartridge::IsIsogram(const FString& Word) const
{
for (int32 Index = 0; Index < Word.Len() - 1; Index++)
{
for (int32 Compare = Index + 1; Compare < Word.Len(); Compare++)
{
if (Word[Index] == Word[Compare])
{
return false;
}
}
}
return true;
}
TArray<int32> UBullCowCartridge::IsBullOrCow(const FString& Guess, const FString& Word) const
{
TArray<int32> Counter = {0, 0};
for (int32 Index = 0; Index < Guess.Len(); Index++)
{
if (Guess[Index] == Word[Index])
{
Counter[0]++;
}
for (int32 Compare = Index + 1; Compare < Guess.Len(); Compare++)
{
if (Guess[Index] == Word[Compare])
{
Counter[1]++;
}
}
for (int32 Compare = Index - 1; Compare >= 0; Compare--)
{
if (Guess[Index] == Word[Compare])
{
Counter[1]++;
}
}
}
return Counter;
}
Here is my code so far. My get valid words function I chose not to make it a TArray like in the videos since I’ve called the list in other places and I thought it would be better as a member variable. I also made the Wordlist a member variable so that I could call it without passing it.