求一用数据结构c++编写的纸牌游戏程序 80C

需求:

1、一副没有J、Q、K、A、大小王的扑克牌(40张牌),编号为1-40张牌。第一回合,从40张牌中给双方各随机抽取5张牌,抽出的牌在原数组里删除。第二回合,从剩下30张牌中给双方各随机抽取5张牌,抽出的牌在原数组里删除。第三回合,从剩下20张牌中给双方各随机抽取5张牌,抽出的牌在原数组里删除。第四回合,从剩下10张牌中给双方各随机抽取5张牌,抽出的牌在原数组里删除。四回合游戏结束后输出“请重新进行游戏”并结束程序。每回合结束记录用户获胜情况、计算机获胜情况和总的回合数。
2、存储结构可用顺序二叉树也可用二叉链表。
3、带有软件系统界面主函数main,功能完整(如:用户选择1开始游戏并随机抽取扑克牌;用户选择0退出执行程序;用户选择1后有两个选择,1为开始出本回合牌,2为不出牌;用户输入其他信息则输出错误信息并要求用户重新选择操作)。
4、主要代码及每个循环后请附上注释。

游戏规则:

1、两个人进行纸牌游戏,其中一个人为用户,另一个人为计算机。
2、每轮每人各发5张牌,各自以这5张牌建立二叉排序树。
3、A最小,2次小,9次大,10最大。
4、不用区分相同数字的花色,有可能一方抽到A,另一方也抽到A,这时候后出方手里的A就再也出不了;有可能一方抽到10,另一方也抽到10,这时候先出方获胜。
5、由用户先出,轮流出牌,每次只能出一张并且要比别人出的大(可出现第一手出10压制对手再出A)。
6、手中的牌没有别人的大则选择不出,最先出完的人获胜。

在这里先谢过啦!

2个回答

参考下这个:https://download.csdn.net/download/eler2008/666667
这种学生作业题都大同小异。

LYX1364_
兜伊美 资源我看了,不合要求。可以做一个符合要求的程序吗,直接采纳。万分感谢!
接近 2 年之前 回复

看看是否合适吧,但没有用二叉树,这个用起来有点麻烦
#include
#include
#include
#include
#include

using namespace std;

const int MAX_SIZE = 40;
const int PER_NUMBER = 5;
vector vec;
vector vec_use;
vector vec_com;
int use_count = 0;
int com_count = 0;

int use_out_card = 0;
int com_out_card = 0;

bool flag = true;

void GameInit();
void GameStart();
int SelectCard();
int Random();
void Output();
int ComputorCard();

void test();
int main()
{
com_out_card = 0;
GameInit();

while((use_count + com_count)< 4)
{
flag = true;

GameStart();
while(1)
{

Output();
SelectCard();//玩家选牌
if (!flag) //是否赢了
{
vec_use.clear();
vec_com.clear();
break;
}

ComputorCard();//电脑选牌
if (!flag)
{
vec_use.clear();
vec_com.clear();
break;
}

}
}
printf("win times computor:%d user:%d",com_count,use_count);
return 0;
}

void GameInit()
{

for(int i = 0; i < MAX_SIZE; i++)//初始化牌
{
vec.push_back(i);
}
}

void GameStart()
{
int index = 0;
for(int i = 0; i < PER_NUMBER; i++)//给玩家发牌
{
index = Random();
vec_use.push_back(vec[index] % 10 + 1);
vec.erase(vec.begin() + index);
}
for(int i = 0; i < PER_NUMBER; i++)//给电脑发牌
{
index = Random();
vec_com.push_back(vec[index] % 10 + 1);
vec.erase(vec.begin() + index);
}
}

int SelectCard()
{
int op;
while(1)
{

    printf("请选择出牌或者跳过:\n");
    printf("***tip:'1'  出牌  '2' 跳过    ***\n");
    cin>>op;
    cin.clear();
    cin.ignore();
    if(op == 1)
    {
        break;
    }
    else if(op == 2)
    {
        use_out_card = 0;
        return 0;
    }
    else
        printf("选择错误,请重新选择\n");
}
while(1)
{   
    printf("请选择出牌:\n"); 
    cin>>op;
    cin.clear();
    cin.ignore();
    if(op == 0) 
    {
        use_out_card = 0;
        return 0;   
    }                   
    for(int i = 0; i < vec_use.size(); i++)//选牌是否正确 
    {
        if(op == vec_use[i])
        {
            if(op <= com_out_card)
            {
                printf("选择错误,请重新选择! '0':跳过\n");
                break;
            }
            else
            {
                use_out_card = op;
                vec_use.erase(vec_use.begin() + i);
                if(vec_use.size() == 0)
                {
                    system("cls");
                    printf("you win\n");
                    com_out_card = 0;
                    use_out_card = 0;
                    use_count++;
                    flag = false;
                }

                return op;
            }
        }
        else if(i == vec_use.size() - 1)
        {
            printf("选择错误,请重新选择\n");
        }

    }
}   

}

int ComputorCard()
{
sort(vec_com.begin(),vec_com.end());
for(int i = 0; i < vec_com.size(); i++)//电脑选牌
{
if(vec_com[i] > use_out_card)
{

com_out_card = vec_com[i];
vec_com.erase(vec_com.begin() + i);
if(vec_com.size() == 0)
{
system("cls");
printf("you failed\n");
com_out_card = 0;
use_out_card = 0;
com_count++;
flag = false;
break;
}
break;
}
else
{
com_out_card = 0;
}

}
}
int Random()
{
int num = vec.size();
srand((unsigned)time(NULL));
return rand() % num;
}

void Output()
{
printf("*********************************\n");
printf("*********************************\n");
printf("***");
for(int i = 0; i < vec_com.size(); i++)
{
printf("%d ",vec_com[i]);
}
printf("***\n");

printf("**computor:  %d              ****\n",com_out_card);
printf("*********************************\n");
printf("*********************************\n");
printf("******card   number      ********\n");
printf("***");
for(int i = 0; i < vec_use.size(); i++)
{
    printf("%d  ",vec_use[i]);
}
printf("***\n");
printf("*********************************\n");
printf("*********************************\n");

}

struggle_saoyears
奋斗吧骚年666 #include <iostream> #include <vector> #include <time.h> #include <stdlib.h> #include <algorithm>
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问