标题:[讨论]一个小程序21点
只看楼主
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
 问题点数:0 回复次数:20 
[讨论]一个小程序21点

今个闲着无聊 编了个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;
}
我这个程序算不算是面向对象了啊?

搜索更多相关主题的帖子: void int rand 
2006-07-21 15:21
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
得分:0 
还不知道21点的规则

2006-07-21 15:32
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
得分:0 
不会吧  就是要牌啊 根据自己的点数 来决定自己还要不要牌 最后把所有的牌的点数累加看谁离21最近 谁就胜啊 超出21就算输

[此贴子已经被作者于2006-7-21 15:48:12编辑过]



2006-07-21 15:46
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
得分:0 
[讨论]重新更该了一下 但出了点问题望赐教啊
#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;
}
我的金币数总是被构造函数归值,不能达到累加的效果!望大家指点啊。
我总是想把金钱的处理和游戏的处理分开来,等要对金钱进行处理的时候再调用相关的函数。但是我发现总是不能如愿。
不知哪位高手能帮我修改一下,让我从中有所借鉴!谢谢。

[此贴子已经被作者于2006-7-22 11:37:26编辑过]


2006-07-22 11:36
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
你在display()函数中的调用是因为有了一个局部变量,所以每次析构就完了, 你可以把他改成point21成员变量,就可以了

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-22 12:30
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 

注意你的随机数,是伪随机数,要用种子才行,不然每次出的点数顺序一样。
还有,你怎么可以出现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;
}


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-22 12:41
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
得分:0 
谢谢提的宝贵意见 我会加油的 也希望有一天能和斑竹一样能帮助别人

2006-07-22 15:17
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
得分:0 
注意你的随机数,是伪随机数,要用种子才行,不然每次出的点数顺序一样;
这个问题我也注意到了 ,但如何才能让它真是的随机呢。你指的种子是什么意识啊?是这个吗?#include <ctime>

2006-07-22 17:07
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 

你没看我的程序?srand((unsigned)time(0));


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-22 18:00
ysol
Rank: 1
等 级:新手上路
帖 子:107
专家分:0
注 册:2006-6-11
得分:0 
您的牌点是:208 电脑的牌点是:108
平局


呵呵,帮你找了个bug
2006-07-24 18:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-79568-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.104926 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved