C++ 入門指南 4.01
練習 31.2 31.3 31.4 31.5 31.6 參考程式 - 練習發展猜數字遊戲計算核心
// 引入標準程式庫中的 cstdlib 及 ctime
#include <cstdlib> // srand(), rand()
#include <ctime> // time()
// 引入標準程式庫中的 algorithm
#include <algorithm> // random_shuffle
// 引入 Guess 類別的標頭檔
#include "guess.h"
// Encrypt 的建構函數
Guess::Guess(int p) {
// 呼叫 setter 設定變數成員
SetMemberVariables(p);
}
// setter
void Guess::SetMemberVariables(int d) {
// 設定數字字串
string str = "0123456789";
// 設定擬隨機數的種子
srand(time(0));
// 攪亂數字字串的順序
random_shuffle(str.begin(), str.end(), [](int x) { return rand() % x; });
// 取得答案字串
answer = str.substr(0, d);
// 設定猜測數字數量
digit = d;
// 猜測次數設定為 0
times = 0;
// A 、 B 值設定為 0
A = 0;
B = 0;
}
// 回傳猜測數字數量
int Guess::GetDigit() {
return digit;
}
// 回傳答案字串
string Guess::GetAnswer() {
return answer;
}
// 回傳 A 、 B 值
string Guess::GetAB() {
return to_string(A) + "A" + to_string(B) + "B";
}
// 回傳猜測次數值
int Guess::GetTimes() {
return times;
}
// 將猜測次數加一
void Guess::AddTimes() {
times += 1;
}
// 計算 A 、 B 值
void Guess::ABCounter(string guess) {
// A 、 B 值歸零
A = 0;
B = 0;
// 逐數字檢查
for (int i = 0; i < digit; i++) {
// 判斷猜測數字是否在答案字串中
if (guess.find(answer[i]) != std::string::npos) {
// 相同位置 A 遞增,反之 B 遞增
if (guess[i] == answer[i]) {
A += 1;
}
else {
B += 1;
}
}
}
}
// 尋找是否有重複數字
bool Guess::FindNumber(string guess) {
// 計算數字數量
int count = 0;
// 外層迴圈取得使用者猜測數字
for (int i = 0; i < digit; i++) {
// 內層迴圈逐數字判斷使用者猜測數字是否跟答案數字一樣
for (int j = 0; j < digit; j++) {
if (guess[i] == guess[j]) {
count += 1;
}
}
// cout 大於 1 表示有重複數字
if (count > 1) {
// 有重複數字回傳 true
return true;
}
// 下一輪外層迴圈開始前將 count 歸零
count = 0;
}
// 沒有檢查到重複數字回傳 false
return false;
}
// 進行遊戲的相關檢測工作
bool Guess::Test(string guess) {
// 猜測數量遞增
AddTimes();
// 計算 A 、 B 值
ABCounter(guess);
// A 達標回傳 true ,反之回傳 false
if (A == digit) {
return true;
}
else {
return false;
}
}
/*《程式語言教學誌》的範例程式
http://kaiching.org/
檔名:guess.cpp
功能:猜數字遊戲的實作檔
作者:張凱慶 */
回到練習 31.2 題目
回到練習 31.3 題目
回到練習 31.4 題目
回到練習 31.5 題目
回到練習 31.6 題目