{
settextcolor(RED);
outtextxy(200, 400, s1);
break;
}
n=(rand()%(b-1)+1);
showConputerTake(n);
a=a-n;
showTotal(a);
Sleep(2000);
InputBox(person, 10, "你要取走几根?",NULL,NULL,0,0,false);
sscanf(person, "%03d", &z);
while(z>=b || z<1 || z>a)
{
InputBox(person, 10, "数字不符,请重新输入",NULL,NULL,0,0,false);
sscanf(person, "%03d", &z);
}
showPersonTake(z);
a=a-z;
showTotal(a);
if(a==0)
{
settextcolor(RED);
outtextxy(200, 400, s);
}
}
}
}
2 分析
接下来对火柴游戏的问题进行具体的分析,从火柴总数目为25,每次最多可取得数目为5开始,到火柴总数目为m,每次最多可取得数目为n。只要解决了当火柴总数目为m,每次最多可取得数目为n的情况,那么一切问题都会迎刃而解。
2.1 基于火柴总数目为25,每次最多取得数目为5的假设分析
火柴总数目为25,每次最多可取得数目为5。每轮人机各取一次。
若双方每次都取最小数目,则一次循环取走的火柴数目为2。25除以2所得结果为12余数1,先手者拿最后一根败,当然,正常的结果肯定不是这样的,因为当火柴总数目逐步减少到6的时候,下一轮的选手便可以直接拿走5根火柴,只留下一根,让对方无可奈何的输掉比赛。
若双方每次都取最大数目,则火柴总数目25除以每次最多可取得数目5,所得结果为5,即当游戏结束2轮后,第三轮剩下5根火柴被先手的选手取走,游戏结束。当然,这种情况也是不可能发生的,因为剩下5根火柴的时候,先手的选手只要取走4跟,留下最后一根给后手的选手,便可以赢得比赛。
通过以上两次的分析我们可以发现,单单依靠这种猜测的方法是没办法解决这个火柴游戏的。因为比赛过程中火柴的总数目会发生改变,一旦火柴的总数目发生了改变,那么游戏者的对策也可能会发生改变,而这些改变是我们无法预测的。但是有一点我们可以确定,从上面的例子中可以看出,当每次最多可取得的火柴数目为5时,倘若最后剩下的火柴数目小于等于6且大于等于2的时候,这时候,这次轮到取火柴的游戏者其实就已经取得了胜利。 C语言火柴游戏的程序设计+流程图(4):http://www.youerw.com/jisuanji/lunwen_15150.html