用余数知识做游戏。
两个学生用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;
}