永发信息网

使用C++编写模拟游戏的程序

答案:1  悬赏:20  手机版
解决时间 2021-01-24 03:32
单人纸牌游戏按如下规则进行:把拿掉了大王和小王的52张扑克牌分成13堆,从左往右摆开,每堆4张;翻开第1堆最上面的一张牌,如果它是i(1≤i≤13,其中1表示A,11表示J,12表示Q,13表示K),就把它放到第i堆的下面,此时,若第i堆中的牌已全部翻开,则游戏结束,否则接着翻开第i堆最上面的一张牌,游戏继续进行;当游戏结束时,统计已翻开牌的数目,若已翻开牌的数目超过48张,则认为本次游戏成功,否则就是不成功。 编写模拟这个游戏的程序。
最佳答案
#include <iostream>
#include <queue>
#include <time.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <conio.h>
using namespace std;
//黑桃(Spade)(S)0-12 梅花(Club)(C)100-112 红桃(Heart)(H)200-212 方块(Diamond)(D)300-312
vector<int>cards[13];//13堆牌
char Color[]="SCHD";
void ptCards(){
    int maxsz=0;
    for(int i=0;i<13;i++){
        int sz=cards[i].size();
        maxsz=max(maxsz,sz);
        printf(" [%2d] ",i+1);
    }
    puts("");
    for(int i=0;i<maxsz;i++){
        for(int j=0;j<13;j++){
            if(i>=cards[j].size()){
                printf("      ");
                continue;
            }
            int cur=cards[j][i];
            printf(" (%c)",Color[cur/100]);
            cur=cur%100+1;
            if(cur==1)
                printf("A ");
            else if(cur==10)
                printf("10");
            else if(cur==11)
                printf("J ");
            else if(cur==12)
                printf("Q ");
            else if(cur==13)
                printf("K ");
            else
                printf("%d ",cur);
        }
        puts("");
    }
}
void getCards(){
    int AllCards[52];//52张牌
    for(int i=0;i<4;i++)
        for(int j=0;j<13;j++)
            AllCards[i*13+j]=i*100+j;
    for(int i=0;i<52;i++){  //打乱顺序
        int t=rand()%(52-i)+i;
        swap(AllCards[i],AllCards[t]);
    }
    for(int i=0;i<13;i++)
        while(!cards[i].empty())
            cards[i].clear();
    for(int i=0;i<52;i++) //分发到13堆里
        cards[i%13].push_back(AllCards[i]);
}
int playOneStep(int k){
    if(cards[k].size()==0){
        printf("第%d堆没有卡片,游戏结束!\n",k+1);
        return -1;
    }
    int nxt=cards[k][0];
    cards[k].erase(cards[k].begin());
    return nxt%100;
}
void playGames(){
    int cur=0;
    int steps=0;
    while(cur!=-1 && steps<48){
        cur=playOneStep(cur);
        if(cur==-1) continue;
        printf("Step:%d    现在应该翻第%d堆的牌\n",++steps,cur+1);
        ptCards();
    }
    if(steps==48)
        printf("已超过48轮,本次游戏成功!!");
}
int main(){
    srand(time(0));
    getCards();
    printf("分牌完毕:\n");
    ptCards();
    playGames();
    getch();
} 再来一发有颜色的,这个仅限windows下运行
#include <iostream>
#include <queue>
#include <time.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <conio.h>
#include <windows.h>
#define RED 4
#define BLUE 1
#define GREEN 2
#define LIGHT 8
using namespace std;
//黑桃(Spade)(S)0-12 梅花(Club)(C)100-112 红桃(Heart)(H)200-212 方块(Diamond)(D)300-312
vector<int>cards[13];//13堆牌
char Color[]="SCHD";
void setText(int n){
    HANDLE hConsoleWnd;
    hConsoleWnd = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsoleWnd,n);
}
void setBack(int n){
    n|=LIGHT;
    n<<=4;
    n|=RED|BLUE|GREEN|LIGHT;
    setText(n);
}
void whiteText(){
    HANDLE hConsoleWnd;
    hConsoleWnd = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsoleWnd,15);
}

void ptCards(){
    int maxsz=0;
    for(int i=0;i<13;i++){
        int sz=cards[i].size();
        maxsz=max(maxsz,sz);
        printf(" [%2d] ",i+1);
    }
    puts("");
    for(int i=0;i<maxsz;i++){
        for(int j=0;j<13;j++){
            if(i>=cards[j].size()){
                setText(15);
                printf("      ");
                continue;
            }
            int cur=cards[j][i];
            printf(" ");
            if(cur/100>1) setBack(RED);
            else setBack(BLUE);
            printf("(%c)",Color[cur/100]);
            cur=cur%100+1;
            if(cur==1)
                printf("A");
            else if(cur==10)
                printf("10");
            else if(cur==11)
                printf("J");
            else if(cur==12)
                printf("Q");
            else if(cur==13)
                printf("K");
            else
                printf("%d",cur);
            setText(15);
            if(cur!=10)printf(" ");
        }
        puts("");
    }
    setText(15);
}
void getCards(){
    int AllCards[52];//52张牌
    for(int i=0;i<4;i++)
        for(int j=0;j<13;j++)
            AllCards[i*13+j]=i*100+j;
    for(int i=0;i<52;i++){  //打乱顺序
        int t=rand()%(52-i)+i;
        swap(AllCards[i],AllCards[t]);
    }
    for(int i=0;i<13;i++)
        while(!cards[i].empty())
            cards[i].clear();
    for(int i=0;i<52;i++) //分发到13堆里
        cards[i%13].push_back(AllCards[i]);
}
int playOneStep(int k){
    if(cards[k].size()==0){
        printf("第%d堆没有卡片,游戏结束!\n",k+1);
        return -1;
    }
    int nxt=cards[k][0];
    cards[k].erase(cards[k].begin());
    return nxt%100;
}
void playGames(){
    int cur=0;
    int steps=0;
    while(cur!=-1 && steps<48){
        cur=playOneStep(cur);
        if(cur==-1) continue;
        printf("Step:%d    现在应该翻第%d堆的牌\n",++steps,cur+1);
        ptCards();
    }
    if(steps==48)
        printf("已超过48轮,本次游戏成功!!");
}
int main(){
    srand(time(0));
    setText(15);
    getCards();
    printf("分牌完毕:\n");
    ptCards();
    playGames();
    getch();
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
2013年昆明的民用电是多少钱一度?
东尼烫染沙龙地址好找么,我有些事要过去
一路顺大酒店(乌兰察布四子王)地址好找么,我
2020年经纶学典课时作业二年级数学下册人教版
便宜美发店地址在什么地方,想过去办事
天地和宾馆(乌兰察布四子王)怎么去啊,我要去
培训中评估主要包括(  )。A.培训内容制定
顶尚堂头疗馆(恒冠步行街店)地址在什么地方,
如家旅馆(乌兰察布四子王)地址在什么地方,我
来分期月还还是每星期都还
【黑暗侵袭1结局】黑暗侵袭1结局什么意思啊
我想找一个看家护院的事,夫妻二人
瑞京宾馆(乌兰察布四子王)地址在什么地方,想
清朝是什么原因越来越走向灭亡?
家里养了小乌龟,它吃不吃稀饭?
推荐资讯
厚朴艺术院地址好找么,我有些事要过去
港澳通行证签证还有两天就到期了,之前有去过
财达家居地址在哪,我要去那里办事
梅江证件照地址有知道的么?有点事想过去
求一些类似《蓝度》的耽美修真文。
我们必须学会自主学习,才能适应新的学习生活
顶点人文茶楼地址好找么,我有些事要过去
绿色家园创意生活馆地址好找么,我有些事要过
【三楼】英语中三楼该怎么说到底是secondfloo
自己不是公安人员,但不是通过黑客技术获取ID
新城KTV地址在哪,我要去那里办事,
1+1娱乐吧地址在哪,我要去那里办事,
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?