永发信息网

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

答案:1  悬赏:20  手机版
解决时间 2021-01-24 03:32
  • 提问者网友:欲望失宠
  • 2021-01-23 23:34
单人纸牌游戏按如下规则进行:把拿掉了大王和小王的52张扑克牌分成13堆,从左往右摆开,每堆4张;翻开第1堆最上面的一张牌,如果它是i(1≤i≤13,其中1表示A,11表示J,12表示Q,13表示K),就把它放到第i堆的下面,此时,若第i堆中的牌已全部翻开,则游戏结束,否则接着翻开第i堆最上面的一张牌,游戏继续进行;当游戏结束时,统计已翻开牌的数目,若已翻开牌的数目超过48张,则认为本次游戏成功,否则就是不成功。 编写模拟这个游戏的程序。
最佳答案
  • 五星知识达人网友:躲不过心动
  • 2021-01-24 00:56
#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();
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯