用余数知识做游戏。

这位同学,经过我的研究,我得出了以下结论:

两个学生用n张卡玩游戏。两个人轮流拿卡,每人一次至少拿1张。最多带m卡,不要留。拿到最后一张牌就赢了。

获胜的最佳方式是:

轮到你拿卡时,你总是拿卡“剩余卡数除以(m+1)的余数”获胜。这样拿不到牌就输了!

如果你学过C语言,请看下面这个表达式。

num = rest cards %(m+1);

我给你写了个C程序,电脑先赢。可以参考一下。

================================================================

/*************************************************************

*纸牌游戏人机游戏程序

*

* =附件:取牌游戏规则=

*

*两个学生用38张牌玩游戏。

*两人轮流取牌,每人每次至少取1张,最多取4张,不允许不取。

*拿到最后一张牌就赢了。

*

*雷磊

*嗨@leilei.name

* qq:20739111

*/

# include & ltstdio.h & gt

#define CARDS_MAX 38 //定义卡片总数。

#define GET_MAX 4 //定义一次取卡的最大数量。

#define MAN 1 //定义者的代码

#定义计算机0 //定义计算机的代码名。

char LeftCards = CARDS _ MAX//初始化本地面板

char CurrentPlayer =计算机;//为计算机操作初始化

char BestMove//最好的方法

void ChangePlayer(){

CurrentPlayer = 1 -当前播放器;//换收卡人,要么0,要么1。

}

//可以根据取卡数取卡的函数。

char MakeOneMove(char num){

if(num & lt;= GET_MAX) {

left cards = left cards-num;

change player();

返回1;//返回成功取卡。

}

返回0;//无法取回卡。

}

//函数让计算机得到卡(这是关键)

void ComputerThink(){

字符数;

num = left cards %(GET _ MAX+1);

if(num == 0){

best move = 1;//如果拿不到最好的牌数,就拿一张。也可以设置一个随机数。

}

否则{

BestMove = num

}

MakeOneMove(best move);

}

//显示当前剩余的牌数。

char ShowCards(){

Printf ("%d张卡片\n\n ",left cards);

}

int main(){

字符数;

Printf("取卡游戏开始:\ n ");

while(1){

ShowCards();

if(LeftCards == 0){

if(CurrentPlayer == COMPUTER){

Printf("恭喜你,你赢了!\ n ");

}否则{

Printf("对不起,再接再厉!\ n ");

}

打破;

}

if(CurrentPlayer == COMPUTER){

computer think();

Printf("电脑带%d张卡\n ",best move);

}否则{

Printf("请拿卡(1-%d):",GET _ MAX);

scanf("%d ",& ampnum);

if(MakeOneMove(num)){

Printf("你拿了%d张卡\n ",num);

}

}

}

返回0;

}