廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 5852 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
remyx
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x10
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[C/C++][求助] 想請教一個程式的寫法_C語言
C語言不太懂如何撰寫?

所以想請高手幫忙謝謝

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

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容



獻花 x0 回到頂端 [樓 主] From:臺灣教育部 | Posted:2014-01-09 20:26 |
ebolaman 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎

級別: 副版主 該用戶目前不上站
版區: 程式設計
推文 x38 鮮花 x458
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

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


My BOINC stats :

獻花 x0 回到頂端 [1 樓] From:台灣寬頻通訊顧問股份有限公司 | Posted:2014-01-13 16:16 |
remyx
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x10
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

我不太懂的地方是,亂數產生相加的部分
還有取亂數相加


[ 此文章被remyx在2014-01-18 08:32重新編輯 ]


獻花 x0 回到頂端 [2 樓] From:臺灣中華電信股份有限公司 | Posted:2014-01-18 00:18 |
ebolaman 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎

級別: 副版主 該用戶目前不上站
版區: 程式設計
推文 x38 鮮花 x458
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用 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);
}


[ 此文章被ebolaman在2014-01-18 21:04重新編輯 ]


My BOINC stats :

獻花 x0 回到頂端 [3 樓] From:台灣寬頻通訊顧問股份有限公司 | Posted:2014-01-18 20:56 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.014013 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言