推饼(推牌九)C++

        麻将是我们生活中不可多得的娱乐方式,而麻将也衍生出了很多其他玩法,而我写的这款程序就是其中的推饼玩法。推饼也可以称之为推牌九麻将版,玩法也十分简单,一个庄家,三个农民。1-9每张牌个两张,共计18张牌,每名玩家摸两张,通过筛子决定先后次序,然后将两张牌之和求余10,通过比大小,来决定庄家和农民的胜负。当农民和庄家点数一样时,判庄家获胜,庄家获得农民押金;当农民取得豹子(两张牌一样)时,庄家给与农民双倍押金。玩法通俗易懂,并且没有人数限制,围观者可选择押注来支持农民。

        由于第一轮随机性过大,我们无法推算其概率,所以我们只能等到第二轮,并将第一轮出现的手牌输入其中(在牌库中减去),在来推算概率从而实现我们是否押注及押注对象。最后笔者提醒大家小玩怡情,大赌伤身,远离赌博,珍惜生活。

        由于使用的随机种子是当前时间,所以随机性并不是很高,一切后果概不负责。

#include <iostream>

using namespace std;

int judge(int a[4][2],int& xjy, int& djy, int& sjy) {//a[4][2]表示4家玩家的牌   庄家第一个起
    int zj = 0;//庄家点数
    int xj = 0;//下家点数
    int dj = 0;//对家点数
    int sj = 0;//上家点数
    
    zj = (a[0][0] + a[0][1]) % 10;
    xj = (a[1][0] + a[1][1]) % 10;
    dj = (a[2][0] + a[2][1]) % 10;
    sj = (a[3][0] + a[3][1]) % 10;
    if (a[0][0]!=a[0][1]) {
        if (a[1][0]!=a[1][1]) {
            if (zj < xj) {
                xjy++;
            }
        }
        else {
            xjy+=2;
        }
                
        if (a[2][0] != a[2][1]) {
            if (zj < dj) {
                djy++;
            }
        }
        else {
            djy+=2;
        }   
        if (a[3][0] != a[3][1]) {
            if (zj < sj) {
                sjy++;
            }
        }
        else {
            sjy += 2;
        }
    }
    else {
        if (a[1][0] == a[1][1]) {
            if (a[0][0]<a[1][0]) {
                xjy += 2; 
            }
        }
        if (a[2][0] == a[2][1]) {
            if (a[0][0] < a[2][0]) {
                djy += 2;
            }
        }
        if (a[3][0] == a[3][1]) {
            if (a[0][0] < a[3][0]) {
                sjy += 2;
            }
        }
    }
    return 0;
}

int judge1(int a[4][2], int& xjy, int& djy, int& sjy) {//a[4][2]表示4家玩家的牌  庄家第二个起
    int zj = 0;//庄家点数
    int xj = 0;//下家点数
    int dj = 0;//对家点数
    int sj = 0;//上家点数
    sj = (a[0][0] + a[0][1]) % 10;
    zj = (a[1][0] + a[1][1]) % 10;
    xj = (a[2][0] + a[2][1]) % 10;
    dj = (a[3][0] + a[3][1]) % 10;
    if (a[1][0] != a[1][1]) {
        if (a[2][0] != a[2][1]) {
            if (zj < xj) {
                xjy++;
            }
        }
        else {
            xjy += 2;
        }

        if (a[3][0] != a[3][1]) {
            if (zj < dj) {
                djy++;
            }
        }
        else {
            djy += 2;
        }
        if (a[0][0] != a[0][1]) {
            if (zj < sj) {
                sjy++;
            }
        }
        else {
            sjy += 2;
        }
    }
    else {
        if (a[2][0] == a[2][1]) {
            if (a[1][0] < a[2][0]) {
                xjy += 2;
            }
        }
        if (a[3][0] == a[3][1]) {
            if (a[1][0] < a[3][0]) {
                djy += 2;
            }
        }
        if (a[0][0] == a[0][1]) {
            if (a[1][0] < a[0][0]) {
                sjy += 2;
            }
        }
    }
    return 0;
}

int judge2(int a[4][2], int& xjy, int& djy, int& sjy) {//a[4][2]表示4家玩家的牌   庄家第三个起
    int zj = 0;//庄家点数
    int xj = 0;//下家点数
    int dj = 0;//对家点数
    int sj = 0;//上家点数
    dj = (a[0][0] + a[0][1]) % 10;
    sj = (a[1][0] + a[1][1]) % 10;
    zj = (a[2][0] + a[2][1]) % 10;
    xj = (a[3][0] + a[3][1]) % 10;
    if (a[2][0] != a[2][1]) {
        if (a[3][0] != a[3][1]) {
            if (zj < xj) {
                xjy++;
            }
        }
        else {
            xjy += 2;
        }

        if (a[0][0] != a[0][1]) {
            if (zj < dj) {
                djy++;
            }
        }
        else {
            djy += 2;
        }
        if (a[1][0] != a[1][1]) {
            if (zj < sj) {
                sjy++;
            }
        }
        else {
            sjy += 2;
        }
    }
    else {
        if (a[3][0] == a[3][1]) {
            if (a[2][0] < a[3][0]) {
                xjy += 2;
            }
        }
        if (a[0][0] == a[0][1]) {
            if (a[2][0] < a[0][0]) {
                djy += 2;
            }
        }
        if (a[1][0] == a[1][1]) {
            if (a[2][0] < a[1][0]) {
                sjy += 2;
            }
        }
    }
    return 0;
}

int judge3(int a[4][2], int& xjy, int& djy, int& sjy) {//a[4][2]表示4家玩家的牌  庄家第四个起
    int zj = 0;//庄家点数
    int xj = 0;//下家点数
    int dj = 0;//对家点数
    int sj = 0;//上家点数
        xj = (a[0][0] + a[0][1]) % 10;
        dj = (a[1][0] + a[1][1]) % 10;
        sj = (a[2][0] + a[2][1]) % 10;
        zj = (a[3][0] + a[3][1]) % 10;
        if (a[3][0] != a[3][1]) {
            if (a[0][0] != a[0][1]) {
                if (zj < xj) {
                    xjy++;
                }
            }
            else {
                xjy += 2;
            }

            if (a[1][0] != a[1][1]) {
                if (zj < dj) {
                    djy++;
                }
            }
            else {
                djy += 2;
            }
            if (a[2][0] != a[2][1]) {
                if (zj < sj) {
                    sjy++;
                }
            }
            else {
                sjy += 2;
            }
        }
        else {
            if (a[0][0] == a[0][1]) {
                if (a[3][0] < a[0][0]) {
                    xjy += 2;
                }
            }
            if (a[1][0] == a[1][1]) {
                if (a[3][0] < a[1][0]) {
                    djy += 2;
                }
            }
            if (a[2][0] == a[2][1]) {
                if (a[3][0] < a[2][0]) {
                    sjy += 2;
                }
            }
        }
    return 0;
}

int main()
{
    int xjy = 0;//下家获胜次数    庄家先摸牌
    int djy = 0;//对家
    int sjy = 0;//上家

    int xjy1 = 0;//下家获胜次数     庄家二摸  上家先摸
    int djy1 = 0;//对家
    int sjy1 = 0;//上家

    int xjy2 = 0;//下家获胜次数     庄家三摸   对家先摸
    int djy2 = 0;//对家
    int sjy2 = 0;//上家

    int xjy3 = 0;//下家获胜次数     庄家四摸   下家先摸
    int djy3 = 0;//对家
    int sjy3 = 0;//上家

    int zj = 0; //庄家先起牌执行的次数
    int xj = 0; //下家先起牌执行的次数
    int dj = 0; //对家先起牌执行的次数
    int sj = 0; //上家先起牌执行的次数
    srand(time(0));
    int x = 0; //减掉的牌
    int p = 0; //发牌顺序
    int q = 0; //随机的牌
    int aa[9] = { 0 }; 
    int b[4][2] = { 0 };
    for (int j = 0; j < 9; j++) {
        aa[j] = 2;
    }
    cout << "请输入8个数字:" << endl;//输出
    for (int i = 0; i < 8;i++) {
        cin >> x;           //输入
        aa[x-1] -= 1;
    }
    for (int i = 0; i < 10000;i++) {
        int a[9];
        memcpy(a,aa,9*sizeof(int));
        p = rand()%4;
        if (p==0) {
            for (int j = 0; j < 4; j++) {  //摸牌的四种情况,庄家先起的情况
                for (int k = 0; k < 2;k++) {  //一家摸两张牌
                    while (1) {
                        q = rand() % 9;
                        if (a[q] != 0) { //判断牌是否还有
                            b[j][k] = q+1;
                            a[q]--;
                            break;
                        }
                    }
                    for (int z = 0; z < p * p * p + 3;z++) {}//延迟作用
                }
            }
            judge(b,xjy, djy, sjy);
            zj++;
        }
        else if (p == 1) {
            for (int j = 0; j < 4; j++) {  //摸牌的四种情况,下家先起的情况
                for (int k = 0; k < 2; k++) {  //一家摸两张牌
                    while (1) {
                        q = rand() % 9;
                        if (a[q] != 0) { //判断牌是否还有
                            b[j][k] = q + 1;
                            a[q]--;
                            break;
                        }
                    }
                    for (int z = 0; z < p * p * p + 3; z++) {}//延迟作用
                }
            }
            judge3(b,xjy3, djy3, sjy3);
            xj++;
        }
        else if (p == 2) {
            for (int j = 0; j < 4; j++) {  //摸牌的四种情况,对家先起的情况
                for (int k = 0; k < 2; k++) {  //一家摸两张牌
                    while (1) {
                        q = rand() % 9;
                        if (a[q] != 0) { //判断牌是否还有
                            b[j][k] = q + 1;
                            a[q]--;
                            break;
                        }
                    }
                    for (int z = 0; z < p * p * p + 3; z++) {}//延迟作用
                }
            }
            judge2(b, xjy2, djy2, sjy2);
            dj++;
        }
        else {
            for (int j = 0; j < 4; j++) {  //摸牌的四种情况,上家先起的情况
                for (int k = 0; k < 2; k++) {  //一家摸两张牌
                    while (1) {
                        q = rand() % 9;
                        if (a[q] != 0) { //判断牌是否还有
                            b[j][k] = q + 1;
                            a[q]--;
                            break;
                        }
                    }
                    for (int z = 0; z < p * p * p + 3; z++) {}//延迟作用
                }
            }
            judge1(b,xjy1, djy1, sjy1);
            sj++;
        }
    }
    cout << zj << " " << sj << "  " << dj << "  " << xj << endl;   //输出
    cout << "庄家一摸下家赢:" << (double)xjy / zj << endl;
    cout << "庄家一摸对家赢:" << (double)djy / zj << endl;
    cout << "庄家一摸上家赢:" << (double)sjy / zj << endl;
    cout << endl;
    cout << "庄家二摸下家赢:" << (double)xjy1 / sj << endl;
    cout << "庄家二摸对家赢:" << (double)djy1 / sj << endl;
    cout << "庄家二摸上家赢:" << (double)sjy1 / sj << endl;
    cout << endl;
    cout << "庄家三摸下家赢:" << (double)xjy2 / dj << endl;
    cout << "庄家三摸对家赢:" << (double)djy2 / dj << endl;
    cout << "庄家三摸上家赢:" << (double)sjy2 / dj << endl;
    cout << endl;
    cout << "庄家四摸下家赢:" << (double)xjy3 / xj << endl;
    cout << "庄家四摸对家赢:" << (double)djy3 / xj << endl;
    cout << "庄家四摸上家赢:" << (double)sjy3 / xj << endl;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值