想請教一個程式的寫法_C語言

Home Home
引用 | 編輯 remyx
2014-01-09 20:26
樓主
推文 x0
C語言不太懂如何撰寫?

所以想請高手幫忙謝謝

寫一模擬丟骰子的遊戲程式,可以讓使用者決定要丟幾個骰子,並且讓使 ..

訪客只能看到部份內容,免費 加入會員



獻花 x0
引用 | 編輯 ebolaman
2014-01-13 16:16
1樓
  
1. 可以持續玩,代表整個邏輯包含在ㄧ個 while (...) 迴圈內
2. 大部分 "讓使用者決定"、"讓使用者猜出"、"告知使用者"、"使用者決定是否繼續玩"
都是 C 基本的輸入/輸出,用 scanf() 和 printf() 即可
3. 骰子用亂數決定,例如有 N 顆,則用 for() 或 while() 跑 N 次,每次用 rand() 來決定ㄧ個骰子的 1~6,並加總全部
4. 用基本的 if() 來判斷使用者猜的大、小和實際骰子總和,並印出不同顯示 (對/錯)
5. 直到使用者不想玩,則讓ㄧ數值為 0,讓 #1 while(...) 內條件為否,則跳出迴圈

獻花 x0
引用 | 編輯 remyx
2014-01-18 00:18
2樓
  
我不太懂的地方是,亂數產生相加的部分
還有取亂數相加

獻花 x0
引用 | 編輯 ebolaman
2014-01-18 20:56
3樓
  
下面是引用 remyx 於 2014-01-18 00:18 發表的 : 到引言文
我不太懂的地方是,亂數產生相加的部分
還有取亂數相加

1. 何謂亂數

亂數可以用簡單的 C 的函式 rand() 來達成

rand() 會產生 0~RAND_MAX 中(包含 0, RAND_MAX) 任何一個數值

2. RAND_MAX 是多少

RAND_MAX 是隨著 library 而定義的,每個程式編譯出來可能不一樣,
想知道在你寫程式的環境下 RAND_MAX 到底是多少,可用 printf 顯示看看

複製程式
#include "stdio.h"
#include "stdlib.h"


int main() {
    printf("%d", RAND_MAX);
}

3. 要怎麼產生隨機 1~6 的亂數

既然我們知道 rand() 產生 0~RAND_MAX,

假設 RAND_MAX 是 32767

那麼 rand() 就會產生 0~32767

該怎麼把這個範圍縮成 1~6 呢?

可以用取餘數的方式 (C 中運算子 %)

例如用 6 對 rand() 取餘數,如下表


可以看到 rand() 產生 0~32767 的值只要用 6 取餘數後,都會得到 0~5 的結果

如此ㄧ來再加上 1 就可以得到 1~6 的隨機數值

複製程式
#include "stdio.h"
#include "stdlib.h"


int main() {
    printf("%d", rand() % 6 + 1);
}

4. 為什麼每次執行以上的程式碼都會得到同個結果?

因為電腦沒辦法達到 "真實的亂數"

電腦是循序漸進的,給什麼輸入就會有什麼結果,

要求電腦作到給ㄧ個輸入,結果竟然是亂數的,是不可能的

5. #4 的解決辦法 Part 1

雖然沒辦法做到 "真實的亂數",但是可以做到 "假的亂數",稱之 "偽亂數"

意思就是可以讓結果弄得亂,雖然實際上不夠亂,但也亂到你猜不出來了

在執行程式ㄧ開始呼叫 C 函式 srand(seed)

seed 就是種子,給不同的種子,就會有不一樣的結果

先試試看在 srand() 括號內打隨便ㄧ個數字,然後跑程式很多次

你會發現不同的種子,都會有不同的結果

例如以下範例用 0 當作種子

複製程式
#include "stdio.h"
#include "stdlib.h"


int main() {
    srand(0);
    printf("%d", rand() % 6 + 1);
}

6. #4 的解決辦法 Part 2

那麼你大概可以猜出來,只要每次執行程式給不同的 seed

結果就會夠亂,有什麼在電腦內是不同時間內都會給不同的數值呢?

答案就在問題中了,"時間"

C 函式 time(NULL) 可以給你現在的時間,

所以以時間當種子,每次跑程式,種子也就不同,結果也就不同

改一下程式碼變成

複製程式
#include "stdio.h"
#include "stdlib.h"
#include "time.h"


int main() {
    srand(time(NULL));
    printf("%d", rand() % 6 + 1);
}

7. 怎麼亂數相加

也就是亂數產生結果 1~6 的程式碼

每跑ㄧ次,就把現在的結果加起來

設ㄧ個變數為 A = 0,每次亂數產生的結果 B

讓 A = A + B

跑很多次後,A 就是所有的亂數相加了

如以下程式碼 NUM = 3 就是跑 3 次

應該會看到結果介於 3(三次骰子 1 點) ~ 18 (三次骰子 6 點)

複製程式
#include "stdio.h"
#include "stdlib.h"
#include "time.h"


#define NUM     3


int main() {
    int a = 0;


    srand(time(NULL));


    for (int i = 0; i < NUM; ++i) {
        int b = rand() % 6 + 1;
        a += b;
    }


    printf("%d\n", a);
}


獻花 x0