鱼C论坛

 找回密码
 立即注册
查看: 4614|回复: 9

急需求解 用C++编译一个小游戏(骰子游戏)

 关闭 [复制链接]
发表于 2011-6-20 12:39:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 marlon 于 2011-6-23 20:44 编辑

老师布置的作业,现在想写,但是没得头绪,急求解。
最好是详细的思路!
要求:投掷两个骰子,将得到的两个点数相加,如果第一次投掷和为7、11,则游戏者赢;如果和为2、3、12,则输;如果和为4、5、6、8、9、10,那么此和为游戏者的点数,如果想赢得胜利,必须继续投掷骰子,直到取得自己的点数(也就是第一次投掷出的4、5、6、8、9、10)为止,如果投掷出的和为7,则为输。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-20 15:33:54 | 显示全部楼层
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<string>
using namespace std;

class RandomNum{
public:
        RandomNum(int low=2,int high=12):lower(low),higher(high){
                srand(time(NULL));
        };
        int getNum()const{
                return rand()%(higher-lower+1)+lower;
        }
private:
        int lower,higher;
};
class Game{
        int first_number,cur_number;
        RandomNum MyRandom;
public:
        void play(){
                int result = first();
                switch(result){
                case 1: Win();break;
                case -1: Lose();break;
                case 0: second();
                }
        }
private:
        int first(){
                GetNumber();
                if(cur_number==7 || cur_number==11) return 1;
                else if(cur_number==2 || cur_number==3 || cur_number==12)
                        return -1;
                else{
                        first_number = cur_number;
                        return 0;
                }
        }
        void echo()const{
                cout<<"你得到的点数是: "<<cur_number<<endl;
        }
        void again(){
                echo();
                cout<<"请继续摇骰子"<<endl;
        }
        void Win()const{
                echo();
                cout<<"你赢了!"<<endl;
        }
        void Lose()const{
                echo();
                cout<<"你输了!"<<endl;
        }
        void second(){
                do{
                        again();
                        GetNumber();
                }while(cur_number!=7&&cur_number!=first_number);
                if(cur_number==7) Lose();
                else Win();
        }
        void GetNumber(){
                cout<<"请按回车键摇骰子:";
                cin.get();
                cur_number = MyRandom.getNum();
        }
};
int main(){
        Game g;
        g.play();
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-20 15:54:26 | 显示全部楼层

谢谢!
可不可以再帮帮忙啊,给点注释,我是新手,不怎么看的懂。
而且还有一个要求给看掉了“为提高可读性,课声明胜负类型:typedef enum(WIN,LOSE,TIE) GameStatus;”
win:赢,lose:输,tie:平.
再次感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-20 16:28:45 | 显示全部楼层
本帖最后由 marlon 于 2011-6-20 16:29 编辑

一开始,我也查过这个程序的相关信息,得知要用到“随机函数”,可是看了半天,不知道怎么用进去,看了阁下的代码,茅塞顿开,又长知识了,继续感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-20 17:05:11 | 显示全部楼层
注释自己加吧
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<string>
using namespace std;

class RandomNum{
public:
        RandomNum(int low=2,int high=12):lower(low),higher(high){
                srand(time(NULL));
        };
        int getNum()const{
                return rand()%(higher-lower+1)+lower;
        }
private:
        int lower,higher;
};
class Game{
                typedef enum{WIN,LOSE,TIE} GameStatus;
        int first_number,cur_number;
        RandomNum MyRandom;
public:
        void play(){
                GameStatus result = first();
                switch(result){
                case WIN: Win();break;
                case LOSE: Lose();break;
                case TIE: second();
                }
        }
private:
        GameStatus first(){
                GetNumber();
                if(cur_number==7 || cur_number==11) return WIN;
                else if(cur_number==2 || cur_number==3 || cur_number==12)
                        return LOSE;
                else{
                        first_number = cur_number;
                        return TIE;
                }
        }
        void echo()const{
                cout<<"你得到的点数是: "<<cur_number<<endl;
        }
        void again(){
                echo();
                cout<<"请继续摇骰子"<<endl;
        }
        void Win()const{
                echo();
                cout<<"你赢了!"<<endl;
        }
        void Lose()const{
                echo();
                cout<<"你输了!"<<endl;
        }
        void second(){
                do{
                        again();
                        GetNumber();
                }while(cur_number!=7&&cur_number!=first_number);
                if(cur_number==7) Lose();
                else Win();
        }
        void GetNumber(){
                cout<<"请按回车键摇骰子:";
                cin.get();
                cur_number = MyRandom.getNum();
        }
};
int main(){
        Game g;
        g.play();
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-20 17:22:49 | 显示全部楼层
仰望天上的光 发表于 2011-6-20 17:05
注释自己加吧

呵呵呵。。。。。。。
好的,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-21 10:06:22 | 显示全部楼层
我XX,这样都行?孩纸,自己的工作不可偷懒哦:lol。那位大哥啊?还能不能帮小弟做一下?:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-21 12:21:23 | 显示全部楼层

return rand()%(higher-lower+1)+lower;
麻烦你,请你帮忙解释一下这段代码,可以吗?谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-21 21:55:20 | 显示全部楼层
一般情况:
higher=12
lower=2
higher-lower+1=12-2+1=11
rand()%(higher-lower+1)这个余数范围是[0,10]
return rand()%(higher-lower+1)+lower范围是[0+2,10+2],也就是【2,12】。这个范围就是抛出的2个骰子点数之和的范围。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-23 20:45:35 | 显示全部楼层
忙了很久,加上耽误的时间,终于把这个“作业“完成了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 12:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表