Final Cow and Bull game and new features

Here is my Bull and Cow game with many new extra features.

#pragma once

#include “CoreMinimal.h”

#include “Console/Cartridge.h”

#include “BullCowCartridge.generated.h”

struct FBullCowCount

{

int32 Bulls = 0;

int32 Cows = 0;

FString BullsCowsMarker = "";

};

UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))

class BULLCOWGAME_API UBullCowCartridge : public UCartridge

{

GENERATED_BODY()

public:

virtual void BeginPlay() override;

virtual void OnInput(const FString& Input) override;

void SetUpStartGameVariables();

void PrintLivesLeft();

void GameOver();

void MainMenu(const FString& Input);

void ProcessGuess(const FString& GuessedWord);

void PrintWelcomeMessage(const FString& Message);

TArray<FString> GetValidWords(const TArray<FString>& WordList) const;

bool IsIsoGram(const FString& CheckWord) const;

FBullCowCount NumberOfBullsCows(const FString& Checkword, const FString& HiddenW) const;

//int NumberOfCows(const FString& Checkword, const FString& HiddenW) const;

bool GuessedValid;

int32 GameState;

int32 HiddenWordCharactersLength = 4;

int32 NumberGuesses = 5;

TArray<FString> IsoGrams;

// Your declarations go below!

private:

FString HiddenWord;

FString GameMessage;

int32 Lives;

int32 HiddenWordLength;

int32 WordLength;

bool bGameOver;

bool bGameWon;

bool bMarkersOn;

};

// Fill out your copyright notice in the Description page of Project Settings.

#include “BullCowCartridge.h”

#include “HiddenWordList.h”

void UBullCowCartridge::BeginPlay() // When the game starts

{

Super::BeginPlay();

IsoGrams = GetValidWords(Words);

SetUpStartGameVariables();

NumberGuesses = 15;

GameState = 0;

HiddenWordCharactersLength = 5;

bMarkersOn = true;

// FBullCowCount Score;

PrintLine(TEXT("Bull And Cow Word Guessing  Game!"));

PrintLine(TEXT("\nTo start click onto the billboard."));

PrintLine(TEXT("To activate the terminal press \"Tab Key\""));

PrintLine(TEXT("then press the \"Enter Key\""));

}

void UBullCowCartridge::OnInput(const FString& Input) // When the player hits enter

{

if(GameState == 0)

{

    MainMenu(Input);

}

if(GameState == 1)

{

    if(Input == "End") { GameState = 0; }

    FString TypedWord = Input.ToLower();

    if(Lives > 0 && !bGameWon && !bGameOver )

    {

        ProcessGuess(TypedWord);

    }

    else

    {

        if(TypedWord != "y" && bGameOver)

        {

            FString message1 = FString::Printf(TEXT("\nYou Lost the game\nword was \"%s\"\nPress \"enter\" to go to main menu"), *HiddenWord); 

            GameMessage = message1;

        }

        

        if(TypedWord != "y" && bGameWon)

        {

            GameMessage = TEXT("\nYou have guessed the right word!\nPress \"enter\" to go to main menu");

        }

    }

    ClearScreen();

    PrintWelcomeMessage(GameMessage);

    //PrintLine(FString::Printf(TEXT(" hiddenword %s"),*HiddenWord));

    if(GuessedValid && !bGameOver && !bGameWon && TypedWord.Len() >= HiddenWord.Len())

    {

        FBullCowCount Score = NumberOfBullsCows(TypedWord, HiddenWord);

            PrintLine(FString::Printf(TEXT("Word typed   \"%s\""), *Input)); 

            if(bMarkersOn)

            {

                PrintLine(FString::Printf(TEXT("Bulls* CoWs- \"%s\""), *Score.BullsCowsMarker));

            }

            PrintLine(FString::Printf(TEXT("\nBulls: %i CoWs: %i\n"), Score.Bulls, Score.Cows)); 

    }

    if(!bGameOver && !bGameWon) { PrintLivesLeft(); }

}

}

void UBullCowCartridge::SetUpStartGameVariables()

{

Lives = NumberGuesses; 

bGameOver = false;

bGameWon = false;

bool bPickedWord = false;

do

{

    int32 Index = FMath::RandRange(0, IsoGrams.Num()-1);

    HiddenWord = IsoGrams[Index];

        

    HiddenWordLength = HiddenWord.Len();

    if(HiddenWordLength == HiddenWordCharactersLength) { bPickedWord = true; }

} while(!bPickedWord);

}

void UBullCowCartridge::PrintLivesLeft()

{

if(Lives == 1)

{

    PrintLine("This is your last guess. so guess right!"); 

}

else

{

    FString Message = FString::Printf(TEXT("You have got %i Lives Left"), Lives);

    PrintLine(Message);    

}

}

void UBullCowCartridge::PrintWelcomeMessage(const FString& Message2)

{

PrintLine(TEXT("Welcome to the cow bull game!"));

FString Message1 = FString::Printf(TEXT("The word has %i characters."), HiddenWordLength); 

PrintLine(Message1);

PrintLine(Message2);

}

void UBullCowCartridge::ProcessGuess(const FString& GuessedWord)

{

    GuessedValid = true;

    int32 GuessedWordLength = GuessedWord.Len();

    if(GuessedWordLength == HiddenWordLength)

    {

            if(HiddenWord == GuessedWord)

            {

                //guess right

                GameMessage = TEXT("\nYou have guessed the right word!\n\nPress \"enter\" to go to main menu");

                bGameWon = true;  

                GameState = 0;

                return;         

            }

           if(!IsIsoGram(GuessedWord))

           {

                GameMessage = TEXT("\nYou did not type a Isogram");   

                GuessedValid = false;

                return;

            }

                //wrong guess

                GameMessage = TEXT("\nWrong Word Sorry");

                 --Lives;

                 

                 if(Lives == 0)

                 {

                    bGameOver = true;

                    FString message1 = FString::Printf(TEXT("\nYou Lost the game\nword was \"%s\"\nPress \"enter\" to go to main menu"), *HiddenWord); 

                    GameMessage = message1;

                    GameState = 0;

                    return;

                 }

    }

    else

    {

            FString Message = FString::Printf(TEXT("\nYou did not type %i characters"), HiddenWordLength);

            GuessedValid = false;

            GameMessage = Message;

            return;

    }

}

TArray UBullCowCartridge::GetValidWords(const TArray& WordList) const

{

TArray<FString> ValidWords;

for(FString Word : WordList)

{

    if(Word.Len() >= 4 && Word.Len() <= 8 && IsIsoGram(Word))

    {

        ValidWords.Emplace(Word);

    }

}

return ValidWords;

}

bool UBullCowCartridge::IsIsoGram(const FString& CheckWord) const

{

int32 WordLength = CheckWord.Len();

for(int32 Z = 0; Z < WordLength - 1; Z++)

{

     for(int32 B = Z+1; B < WordLength; B++)

     {

            if(CheckWord[Z] == CheckWord[B])

            {

                return false;

            }

     }

}

return true;

}

FBullCowCount UBullCowCartridge::NumberOfBullsCows(const FString& CheckWord, const FString& HiddenW) const

{

FBullCowCount Count;

bool bChanged;

int32 WordLength = CheckWord.Len();

for(int32 Z = 0; Z < WordLength; Z++)

{

    if(CheckWord[Z] == HiddenW[Z])

    {

     Count.Bulls++;   

     Count.BullsCowsMarker = Count.BullsCowsMarker + "*";

     continue;

    }

        

    for(int32 B = 0; B < WordLength; B++)

    {

        bChanged = false;

        if(CheckWord[Z] == HiddenW[B])

        {

        Count.Cows++; 

        Count.BullsCowsMarker = Count.BullsCowsMarker + "-";

        bChanged = true;

        break;   

        }                    

    }

    if(!bChanged)

    {

        Count.BullsCowsMarker = Count.BullsCowsMarker + " ";

    }

    

}

return Count;

}

/*

int UBullCowCartridge::NumberOfCows(const FString& CheckWord, const FString& HiddenW) const

{

int32 WordLength = CheckWord.Len();

int32 Counter = 0;

for(int32 Z = 0; Z < WordLength; Z++)

{

    for(int32 B = 0; B < WordLength; B++)

    {

            if(B != Z)

            {

                if(CheckWord[Z] == HiddenW[B])

                {

                 Counter++; 

                 break;   

                }                   

            }

    }

}

return Counter;

}

*/

void UBullCowCartridge::MainMenu(const FString& InputPressed)

{

ClearScreen();

PrintLine(TEXT("Main Menu!"));

PrintLine(TEXT("\"1\" To Start Game and press \"Enter\""));

PrintLine(TEXT("\"2\" To change difficulty and press \"Enter\""));



if(InputPressed == "1")

{

    SetUpStartGameVariables();

    GameState = 1;

}

if(InputPressed == "2")

{

    HiddenWordCharactersLength++;

    if(HiddenWordCharactersLength > 8)

    {

        HiddenWordCharactersLength = 4;

    }

    

    switch(HiddenWordCharactersLength)

    {

        case 4:

            NumberGuesses = 10;

        break;

        case 5:

            NumberGuesses = 15;

        break;

        case 6:

            NumberGuesses = 20;

        break;

        case 7:

            NumberGuesses = 25;

        break;    

        case 8:

            NumberGuesses = 30;

        break;                 

    }

}

if(InputPressed == "3")

{

    if(NumberGuesses <= 50)

    {

    NumberGuesses+=5;

    }

}

if(InputPressed == "4")

{

    if(NumberGuesses >= 5)

    {

        NumberGuesses -=5;

    }

}

if(InputPressed == "5")

{

    if(bMarkersOn)

    {

        bMarkersOn = false;

    }

    else

    {

        bMarkersOn = true;

    }

}

if(NumberGuesses < 50)

{

    PrintLine(TEXT("\"3\" to increase quesses and press \"Enter\""));

}



if(NumberGuesses >= 6)

{

    PrintLine(TEXT("\"4\" to decease quesses and press \"Enter\""));

}



PrintLine(TEXT("\"5\" to toggle Marker ON and OFF"));

PrintLine(FString::Printf(TEXT("\nHidden Word Length %i"), HiddenWordCharactersLength));

PrintLine(FString::Printf(TEXT("Number of guessess %i"), NumberGuesses));

if(bMarkersOn)

{

    PrintLine(TEXT("Tip marker is ON"));

}

else

{

    PrintLine(TEXT("Tip marker is OFF"));

}

}

1 Like

Incredible work!