欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

34 A Place for Everything

程序员文章站 2022-06-11 12:09:44
...

学习用C++开发你的第一个游戏(英文)

34 A Place for Everything34 A Place for Everything

// FBullCowGame.h
#pragma once
# include <string>

using FString = std::string;
using int32 = int;

// all values intialised to zero
struct FBullCowCount
{
	int32 Bulls = 0;
	int32 Cows = 0;
};

class FBullCowGame {
public:
	FBullCowGame();	// constructor

	int32 GetMaxTries() const;
	int32 GetCurrentTry() const;
	int32 GethiddenWordLenght() const;
	bool IsGameWon() const;
	bool CheckGuessValidity(FString) const; // ToDo make a more rich return value.

	void Reset(); //ToDo make a more rich return value.
	FBullCowCount SubmitGuess(FString);

	// Please try and ignore this and focus on the interface above
private:
	// see constructor for initialisation
	int MyCurrentTry;
	int32 MyMaxTries;
	FString MyHiddenWord;
};
// FBullCowGame.cpp
#include "FBullCowGame.h"

using int32 = int;

void FBullCowGame::Reset()
{
	constexpr int32 MAX_TRIES = 8;
	const FString HIIDEN_WORD = "donkey";

	MyCurrentTry = 1;
	MyMaxTries = MAX_TRIES;
	MyHiddenWord = HIIDEN_WORD;
	return;
}

// receives a VALID guess, incriments turn, and returns count
FBullCowCount FBullCowGame::SubmitGuess(FString Guess)
{
	// incriment the turn number
	MyCurrentTry++;

	// setup a return variable
	FBullCowCount BullCowCount;

	// loop through all letters in the guess
	int32 HiddenWordLength = MyHiddenWord.length();
	for (int32 MHWChar = 0; MHWChar < HiddenWordLength; MHWChar++)
	{
		// compare letter aginst the hidden word
		for (int32 GChar = 0; GChar < HiddenWordLength; GChar++)
		{
			// if they match then
			if(Guess[GChar] == MyHiddenWord[MHWChar])
			{
				//if they're in the same place
				if (MHWChar == GChar)
				{
					BullCowCount.Bulls++;// incriment bulls
				}
				else
				{
					BullCowCount.Cows++; // must be a cow
				}

			}
		}
	}
	return BullCowCount;
}

FBullCowGame::FBullCowGame()
{
	Reset();
}

int32 FBullCowGame::GetMaxTries() const
{
	return MyMaxTries;
}

int32 FBullCowGame::GetCurrentTry() const
{
	return MyCurrentTry;
}

int32 FBullCowGame::GethiddenWordLenght() const
{
	return MyHiddenWord.length();
}

bool FBullCowGame::IsGameWon() const
{
	return false;
}

bool FBullCowGame::CheckGuessValidity(std::string) const
{
	return false;
}

// Main.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
This is the console executable, that makes use of the BullCow class
This acts as the view in a MVC pattern, and is responsible for all
user interaction. For game logic see the FBullCow class.
*/
# include <iostream>
# include <string>      // 引入string 库
# include "FBullCowGame.h"

using FText = std::string;
using int32 = int;

void PrintIntro();
void PlayGame();
FText GetGuess();
bool AskToPlayAgain();
FBullCowGame BCGame;	// instantiate a new game

// 程序的入口
int main()
{
	bool bPlayAgain = false;
	do
	{
		PrintIntro();

		PlayGame();

		bPlayAgain = AskToPlayAgain();
	} while (bPlayAgain);

    return 0;
}

void PlayGame()
{
	BCGame.Reset();
	int32 MaxTries = BCGame.GetMaxTries();

	// 可猜测的循环次数
	// Todo change from For to While loop once we are validating tries
	for (int32 cout = 1; cout <= MaxTries; ++cout)
	{
		 FText Guess = GetGuess();	// ToDo make loop checking valid

		 // Submit valid guess to the game
		 FBullCowCount BullCowCount = BCGame.SubmitGuess(Guess);
		 // Print numbe of bulls and cows
		 std::cout << "Bulls = " << BullCowCount.Bulls;
		 std::cout << ".Cows = " << BullCowCount.Cows << std::endl;
		 std::cout << std::endl;
	}
	// ToDo summary game
}

// 介绍游戏
void PrintIntro()
{
	//constexpr int WORLD_LENGTH = 9; // 定义一个变量让单词的长度可变

	std::cout << "Welocm to Bulls and Cows, a fun word game." << std::endl;
	std::cout << "Can you guess the " << BCGame.GethiddenWordLenght();
	std::cout << " letter isogram I'm thinking of?\n";
	std::cout << std::endl;
	return;
}

// 让玩家猜一个
FText GetGuess()
{
	int32 CurrentTry = BCGame.GetCurrentTry();
	std::cout << "Try" << CurrentTry << ".输入你猜测的结果: ";
	FText Guess = "";
	std::getline(std::cin, Guess);

	return Guess;
}

bool AskToPlayAgain()
{
	std::cout << "你想再玩一次吗?(Y/N)";
	FText Response = "";
	std::getline(std::cin, Response);
	return (Response[0] == 'y')|| (Response[0] == 'Y');
}