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 題目

上一頁 練習 31.1 參考程式 - 練習發展猜數字遊戲計算核心
回 C++ 入門指南 4.01 目錄
下一頁 練習 31.7 參考程式 - 練習猜數字遊戲的 Qt Quick 專案
回 C++ 教材
回程式語言教材首頁