现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一根火柴谁输。请编写程序进行人机对弈,要求人先取,计算机后取;计算机一方为“常胜将军”。
我们知道,如果想让计算机剩下一根火柴,则问题转化为有20根火柴,计算机最后一次取完。经过分析,我们发现,如果计算机所取的和上一次,人所取的火柴和为5,则可以使最后留下,一根火柴,代码如下:
- #include <stdio.h>
-
-
int main(int argc, char *argv[])
-
{
-
int computer,people,spare = 21;
-
printf("------------------------\n");
-
printf("--you not win the game!\n");
-
printf("------------------------\n");
-
printf("game begin:\n");
-
-
while(1){
-
printf("---还有火柴 %d 根----\n",spare);
-
printf("people:");
-
scanf("%d",&people);
-
if(people<1 || people>4 || people>spare){
-
printf("你违规了,你取火柴数有问题!\n");
-
continue;
-
}
-
spare -= people;
-
-
if(spare == 0){
-
printf("\ncomputer win! game over!\n");
-
break;
-
}
-
computer = 5 - people;
-
spare -= computer;
-
printf("computer: %d\n",computer);
-
-
if(spare == 0){
-
printf("\npeople win! game over!\n");
-
break;
-
}
-
}
-
-
return 0;
-
}
程序执行结果如下:
peng@ubuntu:~/src/test/c/suanfa/miaoqu$ ./a.out
------------------------
--you not win the game!
------------------------
game begin:
---还有火柴 21 根----
people:1
computer: 4
---还有火柴 16 根----
people:3
computer: 2
---还有火柴 11 根----
people:5
你违规了,你取火柴数有问题!
---还有火柴 11 根----
people:4
computer: 1
---还有火柴 6 根----
people:3
computer: 2
---还有火柴 1 根----
people:2
你违规了,你取火柴数有问题!
---还有火柴 1 根----
people:1
computer win! game over!
阅读(1652) | 评论(0) | 转发(0) |