【问题标题】:Using loops to compute dice poker outcome [closed]使用循环计算骰子扑克结果[关闭]
【发布时间】:2019-05-08 11:05:40
【问题描述】:

我有一个Dice poker 任务。我已经设法生成一个数组来保存滚动值的频率,但是我无法编写一个循环来确定手的值是多少。

希望就使用哪种循环组合来确定我拿着什么手得到一些建议。从那里,我应该能够将其转换为一个函数,并编写一个函数来将这只手与其他手进行比较。

#define _CRT_SECURE_NO_WARNINGS
#define handsz 5    //NO ACES IN THE POCKET WITH THIS GUY!
#define diesz 6     //All dice played will have 6 sides
#define ranks 7     //Seven ranks to hold

#include <stdio.h>  
#include <stdlib.h> 
#include <time.h>   

int roll_die(void); 

int main() {
    srand(time(NULL));

    int i;
    int player_hand[handsz] = { 0 };
    int donkeyvalue = 0;    
    int RandomNo;       

    for (i = 0; i < handsz; i++) {
        RandomNo = roll_die(donkeyvalue);  
        player_hand[i] = RandomNo;
    }

    int player_die_count[7] = { 0 }; 
    for (i = 0; i < handsz; i++) {
        player_die_count[player_hand[i]] = player_die_count[player_hand[i]] + 1;
    }
    return 0;
}

int roll_die(void) {
    return (1 + rand() % 6);
}

【问题讨论】:

  • 如果您解释一下规则,也许会是个好主意......
  • OT: ... roll_die(donkeyvalue); 当你有 int roll_die(void); 时似乎很奇怪
  • 将变量声明(将它们放在函数的第一行)与函数体的其余部分分开通常是个好主意
  • 我花了很多时间才让随机数函数起作用,但确实如此。我有显示和改变它的函数(上面不包括)。
  • @CacahueteFrito:抱歉暗示您以冒犯的方式更改了问题,您实际上恢复了最初由 jonrsharpe 编辑的原始文本,可能是因为您已经开始编辑不久以前。但是,将代码更改为括号宏、重新排序声明和类似的编辑是不行的,你可以在你的答案中提供这样的改进,但是问题中的代码不应该修改这个,因为它会使讨论、cmets 和其他答案不一致.

标签: c arrays loops


【解决方案1】:

从数组player_die_count,使用循环,可以确定:

  • 五种的数量
  • 四种的数量
  • 三种的数量
  • 对数

并且使用一个简单的公式,您可以确定您是否有顺子:

has_straight = (player_die_count[1] == 1 && player_die_count[2] == 1 &&
                player_die_count[3] == 1 && player_die_count[4] == 1 && 
                player_die_count[5] == 1) ||
               (player_die_count[2] == 1 && player_die_count[3] == 1 &&
                player_die_count[4] == 1 && player_die_count[5] == 1 &&
                player_die_count[6] == 1);

可以简化为:

has_straight = (player_die_count[2] * player_die_count[3] *
                player_die_count[4] * player_die_count[5]) == 1;

然后你可以从07计算付款人的手牌价值:

  • 五种:7分
  • 四种:6分
  • 满屋三种加一对:5分
  • :4分
  • 三样:3分
  • 两对:2分
  • 一对:1分
  • 胸围:0分

您可以通过根据最高骰子的值对不同组合进行排名来优化分数。 五个 6 击败 五个 5,等等。

这是一个完整的程序,可以使用rand() 或使用所有组合的顺序分布输出多次抽奖的得分和抽签情况:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define handsz 5
#define diesz  6     // All dice played will have 6 sides, numbered 1 to 6

static int roll_die(void) {
    return 1 + rand() % 6;
}

int main(int argc, char *argv[]) {
    int iter = 1;
    int use_random = 1;

    if (argc > 1) {
        iter = strtol(argv[1], NULL, 0);
        if (iter < 0) {
            use_random = 0;
            iter = -iter;
        }
    }

    srand(clock());

    for (int n = 0; n < iter; n++) {
        int player_hand[handsz];

        if (use_random) {
            for (int i = 0; i < handsz; i++)
                player_hand[i] = roll_die();
        } else {
            for (int i = 0, mm = n; i < handsz; i++, mm /= 6)
                player_hand[i] = 1 + mm % 6;
        }

        int player_die_count[7] = { 0 };
        for (int i = 0; i < handsz; i++) {
            player_die_count[player_hand[i]] += 1;
        }

        int pairs, threes, fours, fives, score;
        pairs = threes = fours = fives = score = 0;
        for (int i = diesz; i > 0; i--) {
            switch (player_die_count[i]) {
            case 5:
                fives = i * 11111;
                break;
            case 4:
                fours = i * 1111;
                break;
            case 3:
                threes = i * 111;
                break;
            case 2:
                pairs = pairs * 100 + i * 11;
                break;
            case 1:
                score = score * 10 + i;
                break;
            }
        }
        if (fives)
            score += 700000 + fives;
        else
        if (fours)
            score += 600000 + fours * 10;
        else
        if (threes && pairs)
            score += 500000 + threes * 100 + pairs;
        else
#ifndef NO_STRAIGHTS
        if (score == 54321 || score == 65432)
            score += 400000;
        else
#endif
        if (threes)
            score += 300000 + threes * 100;
        else
        if (pairs >= 100)
            score += 200000 + pairs * 10;
        else
        if (pairs)
            score += 100000 + pairs * 1000;

        printf("%d: %d %d %d %d %d\n",
               score, player_hand[0], player_hand[1],
               player_hand[2], player_hand[3], player_hand[4]);
    }
    return 0;
}

运行带有7776 参数的程序来检查简单的roll_die 函数提供的实际分布是​​非常有趣的。在我的系统上,伪随机分布有时会产生令人惊讶的结果:

chqrlie$ ./pokerdice 7776 |排序-nr |头-10 755555:5 5 5 5 5 744444:4 4 4 4 4 744444:4 4 4 4 4 722222:2 2 2 2 2 711111: 1 1 1 1 1 711111: 1 1 1 1 1 711111: 1 1 1 1 1 711111: 1 1 1 1 1 666665:6 6 6 5 6 666665:6 6 5 6 6

【讨论】:

  • 这很有帮助。谢谢你。以前,我的思维模式是分配直接结果,而不是使用任意值进行排名。
  • 这个游戏没有“顺子”,只找5、4、2对等。不过我会看看的。
  • @Barry:棘手的部分是相似牌的相对排名。
  • 为什么*/+&amp;&amp;/||的工作?它有效,但很奇怪。数学数学;逻辑的逻辑
  • @CacahueteFrito:只是为了好玩:如果您恰好拥有其中之一,那么您就有顺子:2345。我用两种方法修改了答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 2012-12-21
  • 2010-11-15
相关资源
最近更新 更多