找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1541|回复: 9

[讨论]一个小程序21点

[复制链接]
发表于 2009-11-4 00:33:16 | 显示全部楼层 |阅读模式 IP:江苏扬州
今个闲着无聊 编了个21点的小程序 望大家多多指点啊!
#include <iostream>
#include <stdlib.h>
using namespace std;
class point21
{public:
void Sru();
void Cli();
void display();
private:
int a;
int b;
};
void point21::Sru()
{int i=1; char c;
b=0;a=0;
while(i==1)
{
cout<<"是否要牌(是<y/Y>,否<n/N>): "<<endl;
cin>>c;
if(c=='y'||c=='Y')
{a+=rand()%21;cout<<"您的luck num是:"<<a<<endl;}
if(rand()%2==1)
{b+=rand()%21;}
if(c=='n'||c=='N')
i=0;
void clear();
}
}
void point21::Cli()
{cout<<"您的luck num是:"<<a<<" "<<"电脑的luck num是:"<<b<<endl;
if(a>21&&b>21)a=b;
else if(a<=21&&b>21)a=21;
else if(a>21&&b<=21)b=21;
a=abs(21-a);
b=abs(21-b);
}
void point21::display()
{if(a<b){cout<<"您胜利"<<endl;}
else if(a>b){cout<<"您输了"<<endl;}
else {cout<<"平局"<<endl;}
}
int main()
{point21 D;int i=0;
cout<<"欢迎您来到21点游戏世界"<<endl;
do
{
D.Sru();
D.Cli();
D.display();
cout<<"您要继续吗? 继续请按1,退出请按0。"<<endl;
cin>>i;
}
while(i==1);
cout<<"欢迎再来"<<endl;
return 0;
}
我这个程序算不算是面向对象了啊?
发表于 2009-11-4 00:33:17 | 显示全部楼层 IP:江苏扬州
还不知道21点的规则
回复

使用道具 举报

发表于 2009-11-4 00:33:18 | 显示全部楼层 IP:江苏扬州
不会吧  就是要牌啊 根据自己的点数 来决定自己还要不要牌 最后把所有的牌的点数累加看谁离21最近 谁就胜啊 超出21就算输
回复

使用道具 举报

发表于 2009-11-4 00:33:19 | 显示全部楼层 IP:江苏扬州
#include <iostream>
#include <stdlib.h>
using namespace std;
//21点类
class point21
{public:
void Sru();
void Cli();
void display();
private:
int a;
int b;
};
//金钱类
class money
{public:
money(){M=50;}
int shift(int a,int b);
private:
int M;
};
//21点程序
void point21::Sru()
{int i=1; char c;
b=0;a=0;
while(i==1)
{
cout<<"是否要牌(是<y/Y>,否<n/N>): "<<endl;
cin>>c;
if(c=='y'||c=='Y')
{a+=rand()%10;cout<<"您的牌点是:"<<a<<endl;}
if(rand()%2==1)
{b+=rand()%10;}
if(c=='n'||c=='N')
i=0;
}
}
void point21::Cli()
{cout<<"您的牌点是:"<<a<<" "<<"电脑的牌点是:"<<b<<endl;
if(a>21&&b>21)a=b;
else if(a<=21&&b>21)a=21;
else if(a>21&&b<=21)b=21;
a=abs(21-a);
b=abs(21-b);
}
void point21::display()
{int x;
money c;
if(a<b)
{
cout<<"您胜利"<<endl;
cout<<"您还有 "<<c.shift(10,x=1)<<" 枚金币"<<endl;}
else if(a>b)
{
cout<<"您输了"<<endl;
cout<<"您还有 "<<c.shift(10,x=0)<<" 枚金币"<<endl;}
else {
cout<<"平局"<<endl;
cout<<"您还有 "<<c.shift(0,x=-1)<<" 枚金币"<<endl;}
}
//欢迎界面
void welcome()
{
cout<<" #########################"<<endl;
cout<<" # #"<<endl;
cout<<" # 21点 #"<<endl;
cout<<" # 欢迎您 #"<<endl;
cout<<" # #"<<endl;
cout<<" #########################"<<endl;
cout<<"游戏规则:"<<endl;
cout<<"在游戏中,每个玩家都争取拿到最接近21点的牌,<可以多次要牌,然后点数累加>;但是不能超过21点,超过为“爆牌”即失败,只有最接近21点的人才有可能得到胜利。"<<endl;
}
int money::shift(int a,int b)
{if(b==1)
M+=a;
else if(b==0)
M-=a;
return M;
}
int main()
{point21 D;char i;
welcome();
do
{
D.Sru();
D.Cli();
D.display();
cout<<"您要在来一局吗? 按1键继续,退出请按q。"<<endl;
cin>>i;
}
while(int(i)!='q');
cout<<"欢迎再来"<<endl;
return 0;
}
我的金币数总是被构造函数归值,不能达到累加的效果!望大家指点啊。
我总是想把金钱的处理和游戏的处理分开来,等要对金钱进行处理的时候再调用相关的函数。但是我发现总是不能如愿。
不知哪位高手能帮我修改一下,让我从中有所借鉴!谢谢。
回复

使用道具 举报

发表于 2009-11-4 00:33:20 | 显示全部楼层 IP:江苏扬州
你在display()函数中的调用是因为有了一个局部变量,所以每次析构就完了, 你可以把他改成point21成员变量,就可以了
回复

使用道具 举报

发表于 2009-11-4 00:33:21 | 显示全部楼层 IP:江苏扬州
注意你的随机数,是伪随机数,要用种子才行,不然每次出的点数顺序一样。
还有,你怎么可以出现0呢?a+=rand()%10是错误的,改成a+=(rand()%9+1)差不多就这些吧,改后如下:
#include <iostream>
#include <stdlib.h>
#include <ctime>
using namespace std;
//金钱类
class money
{
public:
money(){M=50;}
int shift(int a,int b);
private:
int M;
};
//21点类
class point21
{
public:
void Sru();
void Cli();
void display();
private:
int a;
int b;
money c;
};
//21点程序
void point21::Sru()
{
char c;
b=0;a=0;
srand(unsigned(time(0)));
while(1)
{
cout<<"是否要牌(是<y/Y>,否<n/N>): "<<endl;
cin>>c;
if(c=='y'||c=='Y'){a+=(rand()%9+1);cout<<"您的牌点是:"<<a<<endl;}
if(rand()%2==1)
{b+=(rand()%9+1);}
if(c=='n'||c=='N')break;
}
}
void point21::Cli()
{
cout<<"您的牌点是:"<<a<<" "<<"电脑的牌点是:"<<b<<endl;
if(a>21&&b>21)a=b;
else if(a<=21&&b>21)a=21;
else if(a>21&&b<=21)b=21;
a=abs(21-a);
b=abs(21-b);
}
void point21::display()
{
int x;
if(a<b)
{
cout<<"您胜利"<<endl;
cout<<"您还有 "<<c.shift(10,x=1)<<" 枚金币"<<endl;
}
else if(a>b)
{
cout<<"您输了"<<endl;
cout<<"您还有 "<<c.shift(10,x=0)<<" 枚金币"<<endl;
}
else
{
cout<<"平局"<<endl;
cout<<"您还有 "<<c.shift(0,x=-1)<<" 枚金币"<<endl;
}
}
//欢迎界面
void welcome()
{
cout<<" #########################"<<endl;
cout<<" # #"<<endl;
cout<<" # 21点 #"<<endl;
cout<<" # 欢迎您 #"<<endl;
cout<<" # #"<<endl;
cout<<" #########################"<<endl;
cout<<"游戏规则:"<<endl;
cout<<"在游戏中,每个玩家都争取拿到最接近21点的牌,<可以多次要牌,然后点数累加>;但是不能超过21点,超过为“爆牌”即失败,只有最接近21点的人才有可能得到胜利。"<<endl;
}
int money::shift(int a,int b)
{
if(b==1)
M+=a;
else if(b==0)
M-=a;
return M;
}
int main()
{
point21 D;char i;
welcome();
do
{
D.Sru();
D.Cli();
D.display();
cout<<"您要在来一局吗? 按1键继续,退出请按q。"<<endl;
cin>>i;
}
while(int(i)!='q');
cout<<"欢迎再来"<<endl;
return 0;
}
回复

使用道具 举报

发表于 2009-11-4 00:33:22 | 显示全部楼层 IP:江苏扬州
谢谢提的宝贵意见 我会加油的 也希望有一天能和斑竹一样能帮助别人
回复

使用道具 举报

发表于 2009-11-4 00:33:23 | 显示全部楼层 IP:江苏扬州
注意你的随机数,是伪随机数,要用种子才行,不然每次出的点数顺序一样;
这个问题我也注意到了 ,但如何才能让它真是的随机呢。你指的种子是什么意识啊?是这个吗?#include <ctime>
回复

使用道具 举报

发表于 2009-11-4 00:33:24 | 显示全部楼层 IP:江苏扬州
你没看我的程序?srand((unsigned)time(0));
回复

使用道具 举报

发表于 2009-11-4 00:33:25 | 显示全部楼层 IP:江苏扬州
您的牌点是:208 电脑的牌点是:108
平局


呵呵,帮你找了个bug
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 21:31 , Processed in 0.347188 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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