广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 5877 个阅读者
04:00 ~ 4:30 资料库备份中,需等较久的时间,请耐心等候
 
发表文章 发表投票 回覆文章
  可列印版   加为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.092799 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言