C语言编写——抢30游戏

本文介绍了两个人玩的抢30游戏,分析了游戏的获胜策略,指出先抢到27的一方将赢得比赛,揭示了游戏的不公平性,偏向于后行动的一方。此外,还探讨了游戏规则改变为抢50和抢2时的不公平情况。代码示例展示了如何实现电脑与人的抢数过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由两个人玩“抢30”游戏,游戏规则是:第一个人先说“1”或“2”,第二个人要接着往下说一个或两个数,然后又轮到第一个人,再接着往下说一个或两个数。这样两人反复轮流,每次每个人说一个或两个数都可以,但是不可以连说三个数,谁先抢到30,谁得胜。

问题分析:

通过观察可知谁先抢说27谁就会赢。要抢到27,必须先抢到24。依次类推变为抢3的问题

只要第二个人控制抢到27 24 21 18 15 12 9 6 3则一定会赢

所以可知这个游戏是不公平的,偏向后开口的人,而且这些数字都能整模3

假设变为“抢50”游戏规则不变,47 44 41 38 35 32 29 26 23 20 17 14 11 8 5 2

变成抢2的游戏,也是不公平的,偏向先开口的人。而且这些数字模3都等于2

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu();
int people(int t);//人抢数
int computer(int s);//电脑抢数
int main()
{
    srand((unsigned)time(NULL));//用时间戳给rand初始值
    int tol = rand() % 30 + 1;//从1到30的某个数开始抢数
    menu();
    printf("          <%d>            \n", tol);
    //公平起见用产生的随机值决定谁先抢数
    if (rand() % 2 == 1)
    {
        tol = people(tol);//rand产生的值模2余1,则人先抢数
    }
    while (tol!=30)
    {
        //电脑和人谁先抢到30谁赢
        if ((tol = computer(tol)) == 30)
            printf("电脑赢\n");
        else if((tol=people(tol))==30)
            printf("人赢\n");
    }
    printf("          游戏结束            \n");
    return 0;
}
//人抢数
int people(int t)
{
    int a;
    while (1)
    {
        printf("人的抢数为:");
        scanf("%d", &a);
        if (a > t + 2 || a < t + 1)
            printf("请按抢数规则抢数,");
        else
            break;
    }
    return  a;
}
//电脑抢数
int computer(int s)
{
    int c;
    printf("电脑抢数为:");
    if ((s + 1) % 3 == 0)
        printf(" %d\n", ++s);
    else if ((s + 2) % 3 == 0)
    {
        s += 2;
        printf(" %d\n", s);
    }
    else
    {
        c = rand()%2 + 1;
        s += c;
        printf(" %d\n", s);
    }
    return s;
}
//菜单
void menu()
{
    printf("************************************\n");
    printf("          <抢30游戏>        \n");
    printf("    电脑与人一起抢数谁先抢到30谁赢        \n");
    printf("    游戏规则如下:                \n");
    printf("    1.人的抢数不能超过给定抢数+2的值    \n");
    printf("    2.人的抢数不能超过电脑抢数+2的值    \n");
    printf("    3.系统给定随机值<  >开始抢数游戏    \n");
    printf("          游戏开始            \n");
    printf("************************************\n");
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值