| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 630 人关注过本帖
标题:请高手们帮忙改下这个程序的错误,谢了
只看楼主 加入收藏
chenlou
Rank: 1
来 自:湖北黄冈武穴
等 级:新手上路
威 望:2
帖 子:49
专家分:0
注 册:2008-9-21
结帖率:100%
收藏
 问题点数:0 回复次数:8 
请高手们帮忙改下这个程序的错误,谢了
关于C++课程设计的编写
程序简介:一个对抗游戏,根据随机产生的数字决定双方的输赢。
设计要求:1.当双方进行对抗时,游戏者可根据自身的牌点决定是否继续下注,例如拿到A,把握增大,则在计算机的拍点出现之前加大赌注,但不超过5点。
2.将双方牌点的比较扩大为两张牌点之和,若出现一组对子,则对子牌点大于任何单牌,若双方均为对子,这比较牌点之和。

#include <iostream.h>
#include <stdlib.h>
#define MAX 13    //牌的最大点为13
class War
{
       int plyr[2], comp[2];//plyr玩者的牌点, comp计算机的牌点
       static int Score;//玩者的分数,当分数为0或50时游戏结束
       static int Loop;//出牌次数,游戏结束时给出总的出牌次数
public:
      int* Player();//返回玩者的牌点
       int* Computer();//返回计算机的牌点
       void Initialize();//给出玩者和计算机的牌点
       int CheckScore();//返回玩者分数
       void GameOver();
       War();//缺省构造函数,初始化对象
       static int Increase();//分数增加
       static int Decrease();//分数减少
       static int Loops();//出牌次数增加
};
int War::Score = 2; //初始分数
int War::Loop = 0;//比赛轮数
int War::Increase()//增分,每轮赢一分
{
       ++Score;
       return Score;
}
int War::Decrease()//减分,每轮输一分
{
       --Score;
       return Score;
}
int War::Loops()//双方出牌一次,为一轮
{
       Loop++;
       return Loop;
}
War::War()//构造函数,初始双方牌点为0
{
       plyr[2]=0;
       comp[2]=0;
}
int* War::Player()//返回玩者牌点
{
       return plyr;
}

int* War::Computer()//返回计算机的牌点
{
       return comp;
}
void War::Initialize()//随机产生双方牌点
{
   //    srand ( time (NULL) );
       plyr[0] = rand()%MAX+2;//牌点为2-14,14点为A
       plyr[1] = rand()%MAX+2;
       comp[0] = rand()%MAX+2;
       comp[1] = rand()%MAX+2;
}
int War::CheckScore()//返回玩者分数
{
       return Score;
}
void War::GameOver()//游戏结束时的相关信息
{
       cout << endl << "游戏结束! 谢谢参与." << endl;
       cout << "你用了 " << War::Loops() << " 轮." << endl;
}
void main()
{
       War Play;
       int x;
       cout << endl << "准备开始!" << endl << endl;

       Play.Initialize();//随机产生双方牌点
       Play.Loops();//轮次增加
       //玩家两张牌
       if((Play.Player())[0]==(Play.Player())[1])
       {
           cout <<"你的牌是两张:";
           if((Play.Player())[0] == 11)
           cout << "J" << endl;
           else if((Play.Player())[0] == 12)
           cout << "Q" << endl;
           else if ((Play.Player())[0] == 13)
           cout << "K" << endl;
           else if ((Play.Player())[0] == 14)
           cout << "A" << endl;
           else
           cout << (Play.Player())[0] << endl << endl ;
       }
       else
       {
           cout << "你的牌是一张";
           if((Play.Player())[0] == 11)
           cout << "J" ;
           else if((Play.Player())[0] == 12)
           cout << "Q" ;
           else if ((Play.Player())[0] == 13)
           cout << "K" ;
           else if ((Play.Player())[0] == 14)
           cout << "A" ;
           else
           cout << (Play.Player())[0] ;//第一张牌
           cout << "和一张";
           if((Play.Player())[1] == 11)
           cout << "J" << endl;
           else if((Play.Player())[1] == 12)
           cout << "Q" << endl;
           else if ((Play.Player())[1] == 13)
           cout << "K" << endl;
           else if ((Play.Player())[1] == 14)
           cout << "A" << endl;
           else
           cout << (Play.Player())[1] << endl <<endl;//第二张牌
       }
          //计算机的两张牌
          if((())[0]==(())[1])
       {
           cout <<"计算机的牌是两张:";
           if((())[0] == 11)
           cout << "J" << endl;
           else if((())[0] == 12)
           cout << "Q" << endl;
           else if ((())[0] == 13)
           cout << "K" << endl;
           else if ((())[0] == 14)
           cout << "A" << endl;
           else
           cout << (())[0] << endl;
       }
       else
       {
           cout << "计算机的牌是一张";
           if((())[0] == 11)
           cout << "J" ;
           else if((())[0] == 12)
           cout << "Q" ;
           else if ((())[0] == 13)
           cout << "K" ;
           else if ((())[0] == 14)
           cout << "A" ;
           else
           cout << (())[0] ;//第一张牌
           cout << "和一张";
           if((())[1] == 11)
           cout << "J" << endl;
           else if((())[1] == 12)
           cout << "Q" << endl;
           else if ((())[1] == 13)
           cout << "K" << endl;
           else if ((())[1] == 14)
           cout << "A" << endl;
           else
           cout << (())[1] << endl <<endl;//第二张牌
       }
       //比较玩家和计算机的点数
       if ((Play.Player())[0]==(Play.Player())[1] && (())[0]!=(())[1])    //判断双方牌点的大小,决定分数的增减
           Play.Increase();
       else if ((Play.Player())[0]!=(Play.Player())[1] && (())[0]==(())[1])
           Play.Decrease();
       else if((Play.Player())[0]+(Play.Player())[1]>(())[0]+(())[1])
            Play.Increase();
       else if((Play.Player())[0]+(Play.Player())[1]<(())[0]+(())[1])
            Play.Decrease();
       else
           cout << "势均力敌!" << endl;
    //返回分数
    Play.CheckScore();
    cout << endl << "你的分数是: " << Play.CheckScore() << endl;
    switch (Play.CheckScore())
    {
        case 0:
        case 52:
                Play.GameOver();  break;//分数为0或52则游戏结束
           default:
                   cout << endl <<"继续 1 [退出 0]" << endl;//选择游戏是否继续进行
                   cin >> x;
                   if (x == 1)    main(); //若是递归调用主函数
           break;    //否则退出系统
    }
}
但这个程序有点问题,就是在最后输入0的时候会弹出错误方框:

错误框.rar (14.04 KB)
搜索更多相关主题的帖子: 编写程序 include 计算机 课程 游戏 
2008-09-22 21:17
wangweiliang
Rank: 1
来 自:湖北
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-9-20
收藏
得分:0 
main()
我想应该是main()函数递归调用出了问题,为什么不再写一个成员函数,实现主函数中的功能
2008-09-23 23:35
chenlou
Rank: 1
来 自:湖北黄冈武穴
等 级:新手上路
威 望:2
帖 子:49
专家分:0
注 册:2008-9-21
收藏
得分:0 
嗯,应该是main()
嗯,的确应该再增加一个成员函数,实现main()的功能,main()函数太长。其实,这是我根据另外一个人发的帖子改的,当时没想过加个成员函数,确实应该加个。
2008-09-24 00:24
wangweiliang
Rank: 1
来 自:湖北
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-9-20
收藏
得分:0 
要结束程序只要做一个很小的动,即在switch后加一个exit(0)
switch (Play.CheckScore())
    {
        case 0:
        case 52:
                Play.GameOver();  break;//分数为0或52则游戏结束
           default:
                   cout << endl <<"继续 1 [退出 0]" << endl;//选择游戏是否继续进行
                   cin >> x;
                   if (x == 1)    main(); //若是递归调用主函数
           break;    //否则退出系统
    }
  exit(0);
2008-09-24 13:13
chenlou
Rank: 1
来 自:湖北黄冈武穴
等 级:新手上路
威 望:2
帖 子:49
专家分:0
注 册:2008-9-21
收藏
得分:0 
真的耶!
真的很巧妙啊,呵呵。你是怎么想到这点的?可是为什么这里要加一个退出exit(0)函数呢,而下面这个又不用加呢?
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#define MAX 13    //牌的最大点为13
class War
{
      int plyr, comp;//plyr玩者的牌点, comp计算机的牌点
       static int Score;//玩者的分数,当分数为0或50时游戏结束
       static int Loop;//出牌次数,游戏结束时给出总的出牌次数
public:
      int Player();//返回玩者的牌点
       int Computer();//返回计算机的牌点
       void Initialize();//给出玩者和计算机的牌点
       int CheckScore();//返回玩者分数
       void GameOver();
       War();//缺省构造函数,初始化对象
       static int Increase();//分数增加
       static int Decrease();//分数减少
       static int Loops();//出牌次数增加
};
int War::Score = 26; //初始分数
int War::Loop = 0;//比赛轮数
int War::Increase()//增分,每轮赢一分
{
       ++Score;
       return Score;
}
int War::Decrease()//减分,每轮输一分
{
       --Score;
       return Score;
}
int War::Loops()//双方出牌一次,为一轮
{
       Loop++;
       return Loop;
}
War::War()//构造函数,初始双方牌点为0
{
       plyr, comp = 0;
}
int War::Player()//返回玩者牌点
{
       return plyr;
}

int War::Computer()//返回计算机的牌点
{
       return comp;
}
void War::Initialize()//随机产生双方牌点
{
   //    srand ( time (NULL) );
       plyr = rand()%MAX+2;//牌点为2-14,14点为A
       comp = rand()%MAX+2;
}
int War::CheckScore()//返回玩者分数
{
       return Score;
}
void War::GameOver()//游戏结束时的相关信息
{
       cout << endl << "游戏结束! 谢谢参与." << endl;
       cout << "你用了 " << War::Loops() << " 轮." << endl;
}
void main()
{
       War Play;
       int x;
       cout << endl << "准备开始!" << endl << endl;

       Play.Initialize();//随机产生双方牌点
       Play.Loops();//轮次增加
        
       cout << "你的牌是一张";
       if(Play.Player() == 11)
           cout << "J" << endl;
       else if(Play.Player() == 12)
           cout << "Q" << endl;
       else if (Play.Player() == 13)
           cout << "K" << endl;
       else if (Play.Player() == 14)
           cout << "A" << endl;
       else
           cout << Play.Player() << endl;
       cout << "计算机有一张";
       if(() == 11)
           cout << "J" << endl;
       else if(() == 12)
           cout << "Q" << endl;  
       else if (() == 13)
           cout << "K" << endl;
       else if (() == 14)
           cout << "A" << endl;
       else
           cout << () << endl;
       if (Play.Player() > ())    //判断双方牌点的大小,决定分数的增减
           Play.Increase();
       else if (Play.Player() < ())
           Play.Decrease();
       else
           cout << "势均力敌!" << endl;
    Play.CheckScore();//返回分数
    cout << endl << "你的分数是: " << Play.CheckScore() << endl;
    switch (Play.CheckScore())
    {
        case 0:
        case 52:
                Play.GameOver();  break;//分数为0或52则游戏结束
           default:
                   cout << endl <<"继续 1 [退出 0]" << endl;//选择游戏是否继续进行
                   cin >> x;
                   if (x == 1)    main(); //若是递归调用主函数
break;    //否则退出系统
    }
}
2008-09-24 13:56
wangweiliang
Rank: 1
来 自:湖北
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-9-20
收藏
得分:0 
在visual c++ 6.0中编绎一下会发现程序没有得到你想要的结果
2008-09-24 23:23
chenlou
Rank: 1
来 自:湖北黄冈武穴
等 级:新手上路
威 望:2
帖 子:49
专家分:0
注 册:2008-9-21
收藏
得分:0 
是我所想要的结果
这个是实现单张牌比点的程序,我再次运行了一下,确实是正确的,出现了正确的结果,在没有exit(0)函数情况下,出现了正确的结果。
2008-09-24 23:39
hhuccpj
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-9-26
收藏
得分:0 
把最后一句break改为exit(x==0)也就可以了

LZ程序的格式写的很不好哦
2008-09-26 18:46
chenlou
Rank: 1
来 自:湖北黄冈武穴
等 级:新手上路
威 望:2
帖 子:49
专家分:0
注 册:2008-9-21
收藏
得分:0 
谢谢提醒
程序格式确实需要改善提高!
2008-09-26 20:40
快速回复:请高手们帮忙改下这个程序的错误,谢了
数据加载中...
 
   



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

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