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 功能:猜數字遊戲的實作檔 作者:張凱慶 */