游戏-C++一道题目,求解答。

问题描述

C++一道题目,求解答。

问题是这样的:
两个人玩捡树枝游戏,树枝的数量由用户来输入。但是树枝的数量不能超过21,用投掷硬币来决定先后顺序。每个人能一次性拿一枝或者两枝。谁拿到最后一枝树枝谁就输。
请用C++写出来。

解决方案

 #include <time.h>
#include <iostream>
using namespace std;
int main()
{
    char player[2][40];
    int num,loop,loops,branch,start,branchTotal;
    int winCount[2]={0,0};

    cout<<"-------------树枝游戏---------------
";
    cout<<"请输入第一名玩家姓名:";
    cin>>player[0];
    cout<<"请输入第二名玩家姓名:";
    cin>>player[1];

    do
    {
        cout<<"请输入局数(不超过5局):";
        cin>>loop;
    } while (loop>5 || loop<1);

    do
    {
        cout<<"请输入每局树枝总数(不超过21枝)";
        cin>>branchTotal;
    } while (branchTotal>21 || branchTotal<1);

    loops=1;
    while(loops<=loop)
    {
        srand( (unsigned)time( NULL ) ); //根据时间生成随机数种子
        start = rand()%2;//随机产生谁先开始

        cout<<"

<游戏第"<<loops<<"局开始,每次只能拿走1-2个树枝>
";
        branch=branchTotal;
        while(branch>0)
        {
            cout<<"当前树枝总数:"<<branch<<"  ";
            do
            {
                cout<<"请"<<player[start]<<"取树枝:";
                cin>>num;
            } while ( num<1 || num>2 );
            branch-=num;

            if(branch<=0)
            {
                cout<<player[start]<<"本局获胜!
";
                winCount[start]++;
                break;
            }
            start=(start+1)%2;
        }

        loops++;
    }
    cout<<"--------游戏结束-----------
";
    cout<<loop<<"局,"<<player[0]<<"胜"<<winCount[0]<<"局; "<<player[1]<<"胜"<<winCount[1]<<"局

";
    if( winCount[0] > winCount[1])
    {
        cout<<"恭喜!最终"<<player[0]<<"获胜!
";
    }
    else if( winCount[0] < winCount[1])
    {
        cout<<"恭喜!最终"<<player[1]<<"获胜!
";
    }else
    {
        cout<<"平局!
";
    }

    return 0;
}

解决方案二:

逻辑弄反了,代码中谁拿最后一个谁赢。
如果谁拿最后一个谁输,就修改一下顺序即可:

            start=(start+1)%2;//这句放在if判断前
            if(branch<=0)
            {
                cout<<player[start]<<"本局获胜!
";
                winCount[start]++;
                break;
            }

解决方案三:

一道题目的解答

解决方案四:

这个题其实和经典的斐波那契数列是一个题吧:

 #include <iostream>
using namespace std;
int f(int n)
{
 if (n==0||n==1)    //注意主函数循环初值为0
  return 1;
 else
  return f(n-1)+f(n-2);
}
int main()
{
 int i,a[12];
 for (i=0;i < 12;i++)
 {
  a[i]=f(i);
  cout << a[i] << endl;
 }
 return 0;
}

解决方案五:

这是策略问题,如果总数是3的倍数,谁先拿谁输;不是3的倍数,谁先拿,只要他拿完保证剩下的仍是3的倍数,那他就会赢。
道理很简单,3个树枝,你先拿,不管你拿1个或2个,我肯定会赢。

解决方案六:

这个题目不难。鉴于一般大额悬赏的人都不结贴。。就不费那个劲了。给你提供个思路:
就是投硬币可以用随机数实现,比如产生rand()%2产生0,1随机数,规定1先拿。注意要使用随机数种子。
其他问题就很简单了。

解决方案七:

感谢shiter的解答。不过似乎不太完整。
树枝是由用户输入的。选择拿一根或者两根树枝也是用户自己选择的,属于交互方面的。抛硬币决定谁先谁后,是一个随机数。

请尽量多加注释,本人小白。

解决方案八:

ysuwood,请不吝赐教!如采纳,100C双手奉上!

解决方案九:

好像这个题目是和常胜将军是一样的只要有规律的拿,是一定会赢的,应该是凑的3倍数就稳赢了

时间: 2024-12-29 14:52:45

游戏-C++一道题目,求解答。的相关文章

c语言-数据结构C语言版10道实习题目求解答!!

问题描述 数据结构C语言版10道实习题目求解答!! 除有特别说明外,每个题目请以自然语言.形式化表述(伪码.流程图等).程序代码三种方式描述. 顺序结构线性表LA与LB的节点关键字为整数.LA与LB的元素按非递减有序,线性表空间足够大.试给出一种高效算法,将LB中的元素合并到LA中,使新的LA元素仍保持非递减有序.高效是指最大限度的避免移动元素. 请写一个算法将线性表(a1,a2,-,an)逆置为(an,an-1,-,a1). 在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,

c语言题目求解答~~~~~

问题描述 c语言题目求解答~~~~~ 自然数列1,2,3,4,5,......大家都很熟悉,现将自然数列写成一排,数字中间不留空格等任何分隔符号就成了如下这样123456789101112131415161718192021......这是一个很长很长的串,现要求在这个串中找到一个最先出现给定子串的位置.例如给定子串1112,这该子串最先出现在串中第12个字符位置为了能简化处理,我们保证评判时给定的子串在串中一定出现,且位置不大于10000. 输入格式 给定的子串(一行由数字字符构成的字符串,不

一道简单的Map题目求解答

问题描述 packageMap;importjava.util.HashMap;importjava.util.Map;classDog{Stringname;Dog(Stringname){this.name=name;}@Overridepublicbooleanequals(Objectarg0){//TODOAuto-generatedmethodstubif((arg0instanceofDog)&&(((Dog)arg0).name==name)){System.out.pri

一道c语言的题目,求解答

问题描述 一道c语言的题目,求解答 有函数原型为void f(int,int *);主函数中有变量定义:int a,*p=&a,b[10];则下列几种调用错误的是: A·f(a,p) B·f(*p,b) C·f(b,&a) D·f(*p,p) 我的想法是:子函数要接收一个整形变量,一个指针变量,那么B选项中b不是指针常量么? 求助大神们解答!谢谢! 答案是C 解决方案 C B中 b 是数组名,可以看作 const 的指针 C中第一个参数是b,但实际参数是 int 解决方案二: B 选项中的

继承与多态-C++一道关于继承的题目,求大神解答,感激不尽

问题描述 C++一道关于继承的题目,求大神解答,感激不尽 Dynamic_cast Total: 65 Accepted: 22 Time Limit: 1sec Memory Limit:256MB Description Three classes A, B and C are shown below: class A { public: virtual ~A() {}; }; class B: public A {}; class C: public B {}; You are to im

c++-一道C++经典里例题,求指点求解答啊

问题描述 一道C++经典里例题,求指点求解答啊 解决方案 思路一: 每三个数代表一个三角形, 如果两个三角形索引相连, 必然共用一条边, 也就是说第二个三角形的起点值不会大于第一个三角形的最大值, 由此判断来划分三角形. (此思路赖于输入, 如果题目中的输入你要是输入[0, 1, 2, 3, 2, 0, 4, 5, 6], 那这思路就不对了) typedef unsigned int UINT; const int INDEX_NUM = 3; vector<UINT> indexArr; v

point-JAVA题目,求解答,求代码!!!!

问题描述 JAVA题目,求解答,求代码!!!! 设计一个Point类,类中包含点的坐标x.y,同时,包含一个通过另一个点求两点之间距离的distance(Point p)方法.利用该类实现点(34)到点(56)的距离. 解决方案 坐等大神解答...... 解决方案二: public class Point { private int xValue; private int yValue; public Point(int xValue int yValue) { this.setxValue(x

zoj中的一道题目,编译错误,求大神指点?

问题描述 zoj中的一道题目,编译错误,求大神指点? 解决方案 1. vector(int) a(2 * n_case); ----> vector<int> a(2 * n_case); //n_case建议初始化一下 2.cout << output(n_case); //不知道楼主想输出什么?这个output函数是void的 解决方案二: vector(int)换成尖括号.后面有关a的错误都是因为这个造成的. 解决方案三: 是因为你的vector没用对, 楼上正解

算法-南邮ACM第1950道题目,求解答

问题描述 南邮ACM第1950道题目,求解答 描述 所有题目(Word.PDF格式):http://acm.njupt.edu.cn/acmhome/nuptacm/2013HW.zip 在2013"华为杯"南京邮电大学大学生团体歌唱大赛组织工作中,为了营造比赛现场活跃气氛,大赛组委会决定为每位观众发放相同数目的OLED多彩荧光棒.现在我被委派批量采购荧光棒,大赛组委会特别要求:留1个荧光棒备用,其他所有的荧光棒都要平均发放给观众.已知目前市场上OLED多彩荧光棒只能按整包出售,每整包