首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >简单骰子游戏

简单骰子游戏
EN

Code Review用户
提问于 2013-09-29 05:47:23
回答 5查看 32.3K关注 0票数 12

在C++中是否有更有效的生成随机数的算法?

(这段代码正在Dev-C++上运行,但我不确定它是否能在Borland编译器上工作。)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
  Author: Arpit Agrawal
  Email: arpitagrawal294@gmail.com
  Description: Dice Roll Algorithm.
  Project Name: e-Roll.

*/


#include<iostream.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#include <stdio.h>  
#include <Windows.h>

void call();
void one();
void two();
void three();
void four();
void five();
void six();
void call();
int main()
{

    //gotoxy(30,15);
    cout<<"\n\n\n\n\t\tAuthor: Arpit Agrawal\n\t\tEmail: arpitagrawal294@gmail.com\n\t\tDescription: Dice Roll Algorithm.\n\t\tProject Name: e-Roll.\n\t\t" ; 
    cout<<"\n\n\t\tLoading. . . . . . . ";
    Sleep(3000);
    cout<<"\n\n\t\tPress r to roll or q to quit the game "<<endl;
    char ch;
    ch = getch();
    xm:
    if (ch=='r'){
    system("cls"); 
    call();  }
    else
    exit (0);
    cout<<endl<<endl<<"Press r to roll again q to quit!";
    ch = getch();
    goto xm;
    getch();
}



    void call()
    {
        srand (time(NULL));

        int n;
        n= rand();
        n = 1 + n % 6;

        switch (n)
        {
         case 1:
              one();
              break;
         case 2:
              two();
              break;
         case 3:
              three();
              break;
         case 4:
              four();
              break;
         case 5:
              five();
              break;
         case 6:
              six();
              break;
         default:
                 cout<<"NONUM";

        }       
    }  


        void one()
        {
        cout << " -----" << endl;
        cout << "|     |" << endl;
        cout << "|  O  |" << endl;
        cout << "|     |" << endl;
        cout <<  " -----" << endl;
        }
        void two()
        {
        cout << " -----" << endl;
        cout << "|    O|" << endl;
        cout << "|     |" << endl;
        cout << "|O    |" << endl;
        cout <<  " -----" << endl;
        }
        void three()
        {
        cout << " -----" << endl;
        cout << "|    O|" << endl;
        cout << "|  O  |" << endl;
        cout << "|O    |" << endl;
        cout <<  " -----" << endl;
        }
        void four()
        {
        cout << " -----" << endl;
        cout << "|O   O|" << endl;
        cout << "|     |" << endl;
        cout << "|O   O|" << endl;
        cout <<  " -----" << endl;
        }
        void five()
        {
        cout << " -----" << endl;
        cout << "|O   O|" << endl;
        cout << "|  O  |" << endl;
        cout << "|O   O|" << endl;
        cout <<  " -----" << endl;
        }
        void six()
        {
        cout << " -----" << endl;
        cout << "|O   O|" << endl;
        cout << "|O   O|" << endl;
        cout << "|O   O|" << endl;
        cout <<  " -----" << endl;
        }
EN

回答 5

Code Review用户

回答已采纳

发布于 2013-09-29 11:57:24

只在应用程序中调用srand()一次:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    srand (time(NULL));

应该是在main()启动之后。

这不会产生均匀分布的随机数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    n= rand();
    n = 1 + n % 6;

这是因为rand()返回来自[0,RAND_MAX)或[0,32767)的数字,该数字不能完全被6整除。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    1:  1/5462        Notice this is one more than the others.
    2:  1/5461
    3:  1/5461
    4:  1/5461
    5:  1/5461
    6:  1/5461

对于一个简单的应用程序来说,这可能不是一个问题,但值得注意。这样做的正确方法是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int dieRoll() // 1-6 evenly distributed.
{
     static int const max = RAND_MAX/6*6;

     int r = rand();
     while(r >= max) { r = rand();}

     return r%6+1;
}

最好不要使用goto:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xm:
if (ch=='r'){
system("cls"); 
call();  }
else
exit (0);
cout<<endl<<endl<<"Press r to roll again q to quit!";
ch = getch();
goto xm;

更喜欢(标准循环):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while (ch=='r') {
    system("cls"); 
    call();

    cout<<endl<<endl<<"Press r to roll again q to quit!";
    ch = getch();
}

让我们也压缩您的开关语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    switch (n) {
        case 1:   one();break;
        case 2:   two();break;
        case 3: three();break;
        case 4:  four();break;
        case 5:  five();break;
        case 6:   six();break;
        // We know the number will never be anything else
        // so don't need the default.
    }

不需要使用那么多std::endl。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    cout << " ----- \n"
         << "|O   O|\n"
         << "|     |\n"
         << "|O   O|\n"
         <<  " -----" << endl;

endl用于刷新输出。如果您只想要一个新行,请使用"\n“。

票数 14
EN

Code Review用户

发布于 2014-08-13 10:02:15

Function-naming

你的函数名是完全没用的。它们都应该是动词形式,因为它们执行一个动作,使函数的目的明确。您已经在call()中这样做了,尽管名称本身并不有用,因为函数是调用的。

根据他们正在做的事情,call()可以重命名为类似runGame()的东西,其余的可以重命名为displayDiceX() (用相应的数字替换X )。

main()函数

不同代码行之间没有分离(基于目的),条件语句中也没有任何缩进。不仅如此,您还使用了goto,它很有可能导致“意大利面代码”(这不是件好事)。尽量保持控制流尽可能容易遵循。

我很难一目了然地理解逻辑,但有一点是有意义的,那就是输出,甚至其中的一些也很奇怪。它不是技术上的“加载”,如果它是睡了一段时间,虽然我可以理解你想要达到的审美效果。另外,你真的需要输出你的电子邮件地址吗?这和这个项目有什么关系?

Function-indentation

我也不知道你为什么把这些函数缩进右边。您已经正确地对齐了main(),那么为什么其他的不对齐呢?乍一看,我认为所有这些都是main()的一部分,使我认为您缺少了函数定义。您还没有在这些"number“函数中缩进代码,尽管您在其他地方正确地完成了它。尽量让事情保持一致。

总体

总的来说,这看起来像C代码,一点也不像C++。为了学习的目的,保持简单是可以的,但是这可能需要大量的工作来使它看起来像一个理想的游戏实现。

如果您想更进一步,使它看起来更像C++,请考虑定义您自己的类,例如GameDie类。Game类将定义游戏规则,而Die类将表示一个骰子,并允许您创建骰子(Die对象)。Game类将处理大部分工作,main()只需要有一个可以调用public接口函数来运行游戏的Game对象。在main()中不需要做任何其他事情。

票数 11
EN

Code Review用户

发布于 2014-08-13 12:04:36

你的main()很乱而且很难读懂.我不会对while循环发表评论,因为其他人已经这样做了(我同意他的意见),但从风格上讲,为了使您的代码更具可读性,您希望有适当的缩进:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{

    //gotoxy(30,15);
    cout<<"\n\n\n\n\t\tAuthor: Arpit Agrawal\n\t\tEmail: arpitagrawal294@gmail.com\n\t\tDescription: Dice Roll Algorithm.\n\t\tProject Name: e-Roll.\n\t\t" ; 
    cout<<"\n\n\t\tLoading. . . . . . . ";
    Sleep(3000);
    cout<<"\n\n\t\tPress r to roll or q to quit the game "<<endl;
    char ch;
    ch = getch();
    xm:
    if (ch=='r') {
        system("cls"); 
        call();
    }
    else
        exit (0);

    cout<<endl<<endl<<"Press r to roll again q to quit!";
    ch = getch();
    goto xm;
    getch();
}

我不知道你的目标是什么,但这就是你的代码所做的。最后一个getch()永远不会因为goto xm语句而被执行,而且它真的是一团糟。只有在ch=='r'中才能执行这3行代码,所以在该块中使用它就更清楚了。

无论如何,做你想做的事情的最好的方法就是循环--即使它有效地和你的goto做同样的事情,它也是最清晰的。使用goto,您必须分析代码以确定您想要循环行为。当有人看while时,他们会自动知道它会根据while内的条件循环。

票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/31980

复制
相关文章
腾讯如何捕获和分析游戏崩溃
2022年MTSC大会已于12月顺利召开,腾讯互娱测试专家、腾讯 WeTest CrashSight平台技术负责人管旭东为大家带来了干货分享《腾讯如何捕获和分析游戏崩溃》,以下为本次分享的干货内容。   1. 背景简介 崩溃捕获和分析不是一个新话题,自从有软件开始,崩溃就是最严重的问题之一,崩溃率也是评估一个软件质量的重要指标。解决崩溃问题是一个刚需。从PC时代到移动时代,已经有不少崩溃捕获和分析的工具,那么腾讯游戏建设的一套新的崩溃分析系统,到底解决了哪些新问题和新挑战呢? 总结来说有三点: 1.对游戏
WeTest质量开放平台团队
2022/12/15
1.1K0
腾讯如何捕获和分析游戏崩溃
如何监控app的崩溃
当我们的app上线到应用市场之后,它发生了什么崩溃其实我们是不知道的。今天我们介绍一个方法来监控和收集用户手机上的异常崩溃同时上报给我们自己。
PhoenixZheng
2018/08/07
1.4K0
Windbg分析程序崩溃实践
本故事纯属虚构。 初入职场的小木,负责维护一个博客系统,后端采用C++编写,部署在Windows服务器上。刚刚熟悉完产品的小木,接到了后台服务的报警,服务器后端偶尔会程序崩溃。刚开始小木还有点慌张,脑子里面浮现出各种问题,这个是程序的bug吗?茫茫的代码如何寻找问题?log能看到线索吗?当冷静下来后,小木忽然想起前几天看的两篇文章<<Windbg调试----Windbg入门>>和<<Windows程序Dump收集>>,还没动手过呢,正好练习练习。
河边一枝柳
2021/08/06
1.2K0
iOS 中各种奇怪的崩溃
注意,本文所有崩溃的原因都是同一个 EXC_BAD_ACCESS (code=1, address=0x11f645b98) image-20210423232626879 第一个堆栈:字典扩容 im
酷酷的哀殿
2021/04/26
1.7K1
iOS  中各种奇怪的崩溃
MySQL 崩溃恢复过程分析
本文我们一起来看看,MySQL 在崩溃恢复过程中都干了哪些事情,Redo 日志又是怎么大显身手的。
csch
2022/12/20
1.2K0
MySQL 崩溃恢复过程分析
02.Android崩溃Crash库之App崩溃分析
目录总结 01.抛出异常导致崩溃分析 02.RuntimeInit类分析 03.Looper停止App就退出吗 04.handleApplicationCrash 05.native_crash如何监控 06.ANR是如何监控的 07.回过头看addErrorToDropBox 前沿 上一篇整体介绍了crash崩溃库崩溃重启,崩溃记录记录,查看以及分享日志等功能。 项目地址:https://github.com/yangchong211/YCAndroidTool 欢迎star,哈哈哈 01.抛出异常导致崩
杨充
2020/09/07
3K0
Docker 中的 PostgreSQL 崩溃恢复记录
在 Docker 中运行的 PostgreSQL 数据库突然无法启动, 错误日志类似这样:
beginor
2020/12/18
1.8K0
KVC中setValuesForKeysWithDictionary 崩溃问题
KVC 是键值编码,一个非正式的 Protocol ,提供一种机制来间接访问对象属性,KVO 就是基于 KVC 实现的关键技术之一 在字典数组转模型数组时,使用这个setValuesForKeysWi
LeeCen
2018/10/11
9660
KVC中setValuesForKeysWithDictionary 崩溃问题
iOS如何获取崩溃日志
在日常测试iOS中会经常遇到App崩溃的情况,然后给研发提bug。如果就提bug就有一两句话描述,研发很难精准排查问题,所以作为测试人员需要提供崩溃日志或者崩溃堆栈辅助研发排查问题。
测试加
2022/12/05
3.3K0
iOS如何获取崩溃日志
使用windbg抓取崩溃文件和分析的过程
        在软件编程中,崩溃的场景比较常见的。且说微软技术再牛X,也是会出现崩溃的场景。网上有一段Win98当着比尔盖茨蓝屏的视频非常有意思。(转载请指明出于breaksoftware的csdn博客)         我们身边的很多软件都引入了dump生成和收集机制。但是一般情况下,它们都是生成minidump。因为minidump文件相对来说很小,方面我们收集上来进行分析。但是Minidump保存了很少的信息,在一些场景下,可能不能协助我们准确快速定位问题。
方亮
2019/01/16
2.4K0
内存不足导致 nginx 崩溃的原因分析
最近在 Centos7 上搭建 nginx 作为 web 服务器使用,但是使用过程中,nginx 总是莫名其妙的崩掉,使用命令 dmesg 检查错误信息如下:
sylan215
2020/03/02
3.3K0
如何方便的收集app崩溃日志
很多人可能没了解过这个东西可以干嘛用, 其实它的作用是可以传入一个 Handler来捕获那些没有被捕获的异常, 比如 app 层面的 crash。 下面提供了一段源码,可以用来捕获并把异常写入到文件中, 当然如果要上报的话也只需要把对应的字符串上报到统计系统就行。
PhoenixZheng
2018/08/07
6600
逆转时间,起死回生——程序报错崩溃后,如何倒回到崩溃的位置?
假设我们有一段程序,从 Redis 中读取数据,解析以后提取出里面的 name 字段:
青南
2020/06/18
7580
教你如何查看Pod崩溃前的日志
当pod处于crash状态的时候,容器不断重启,此时用kubelet logs可能出现一直捕捉不到日志
用户1107783
2023/09/11
1K0
教你如何查看Pod崩溃前的日志
PFMEA中的原因如何分析?
我们确定了失效模式,要能解决问题,还得找到原因才行,PFMEA中的原因如何分析呢?
用户9972271
2022/11/22
6760
为Xcode6添加Empty Application选项
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/48183735
用户1451823
2018/09/13
4170
为Xcode6添加Empty Application选项
记移动平台崩溃卡顿的收集分析分享
首先说一下项目背景,公司最近在做一个移动平台APP的开发,贴向于游戏方向,用户量也相对较大,加上项目中几个功能排期比较赶,导致开发中出来了不少问题,主要问题就是APP运行过程中的奔溃、卡顿、异常等问题。之前老的定位手段效率很低,有的问题需要定位一两天才能解决,确实影响了用户体验。后来在帖子上发现了几个平台专门处理此类问题,【感兴趣的可以看:https://blog.csdn.net/zhuobattle/article/details/50848745】,最后根据帖子中的好评选择了网易云捕,不得不说确实是一款牛逼的质量跟踪软件,分享给大家。
小勇DW3
2019/04/22
7610
让站长崩溃的骚操作,你中过招吗?
那些让站长们抓狂的瞬间! 许多站长在运营网站时都会遇到一个尴尬的问题:业务受到了黑客、黑产影响,却没有专人来维护网站的安全! 建站时前端页面干净漂亮,但后端没有设置检测过滤和检测SQL语句,被一个SQL注入导出了数据库中所有用户的数据... 莫名其妙服务器内存满了,原来是使用了"root"这样的用户名或弱口令,被爆破登录到服务器植入了挖矿程序,结果干扰了正常业务运行,发现时已经好几天没订单了... 网站上忽然被挂上“澳门XX”广告、恶意篡改了网页内容,原来是网站后台暴露在公网,又使用“1995081
腾讯云DNSPod团队
2022/09/06
1.3K0
让站长崩溃的骚操作,你中过招吗?
c++的queue在多线程下崩溃原因分析
我们知道c++的queue和map等数据结构是线程并发不安全的,为此我们常封装实现了线程安全的priority_queue,姑且叫做 thread_safe::priority_queue。(关于c++并发编程这块儿推荐经典书籍《C++并发编程实战》)。本以为封装后就可以放心在多线程中使用了,结果崩溃了,且还是偶发的。
杨永贞
2022/06/30
1.2K0
c++的queue在多线程下崩溃原因分析
国民级应用:微信是如何防止崩溃的?
导读 | 微信作为月活过10亿的国民级应用,经常面临特殊节点消息量暴增的问题,服务很容易出现过载。但微信的服务一直比较稳定,是如何做到的呢?本文邀请到了腾讯WXG后开开发工程师alexccdong
腾讯云开发者
2023/01/11
2.5K0
国民级应用:微信是如何防止崩溃的?

相似问题

如何在xcode6中导入崩溃报告?

24

多维数组使Xcode6崩溃

12

Xcode6: UITapGesture正在使用(lldb)崩溃

11

WinDbg中的崩溃分析

12

如何分析opera崩溃日志

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文