Scratch与数学的整合23
第23课 对策问题(一)
一、课程导入
我们在日常打比赛的时候以及玩游戏的时候,都要去思考:我怎样才能战胜别人?我怎样才能过去这关?这里的一系列讲究都属于对策问题。这种题虽然多种多样、题目相当灵活,但也非常有趣。
二、学习目标
1、思维目标:利用周期问题的知识来判断一些交替回答的比赛里,先手概率更大还是后手获胜概率更大?必胜的策略又是什么?
2、编程目标:拿今天所讲的例题来找规律,进而推断如何编写Scratch作品。
三、例题讲解
小明和小亮轮流取火柴,最多可取6根。一共有45根火柴,谁取到最后一根谁就获胜。问:小明要想取胜的话,他有什么策略?
分析:首先看第一句话:小明和小亮轮流取火柴,最多可取6根。首先我们要明确两个概念:轮流是你一次我一次交替来,最多是指上限。那么这两条规则就可以理解成:小明取完小亮取再接着小明取……反之同理;每次可取的数量在1——6根选择。由于1——6是一组随机数,随机数具有不确定性,∴我们可以采用速战速决的原则。每次最多能拿走多少根就拿走多少根,但前提是你得最后是获胜啊?。∴我们继续想,还记得第一次取是第奇数次,第二次取是第偶数次吗,奇数与偶数间是连续的数吗?∴我们把图画出来。如图1所示,最左边是

余3根,再往右一组是第二次后手取6根。后面每组都是取6根,全部的45被最大的括号括起来。我们检验一下:45÷6=7(次)……3(根),符合题意。那么小明和小亮一共取8次,但是8能被2整除,对谁来说获胜概率都是相等的,∴我们要转化思维:分类讨论。既然取到最后一根的一方获胜,问小明取胜有什么策略。那就必须让小亮取一次,再采用速战速决的原则一直重复下去取,直到最后一根不留。这就是小明想要取胜的策略。
四、流程图
1、首先来看判断甲、乙谁获胜概率大的流程图。如图2所示。程序开始。开始确定牌的张数。下一步将至少抽的牌数设为“回答”。接下来判断牌的总数÷一次最多抽多少张的余数=0是否成立,无论成不成立都接下来询问并回答先抽牌的人,但会直接跳到回答=甲或回答=乙的那一步,若余数=0则结果设为甲,否则回答设为乙,再下一步确认先手回答的内容,若回答甲则系统接着下一步执行“甲的概率更大”,若回答乙则系统接着下一步接着执行“乙的概率更大”。最后根据上一步执行的情况作答。程序结束。

图2
2、那如果是换成让你求第一组应该抽多少张卡片的话,又该怎样画流程图呢?如图3所示。首先程序开始。第一步确认卡片的总数。第二步将至少抽的卡片张数设为1张,最多抽的卡片张数设为“回答”张。第三步判断卡片的总数÷(一次最多可抽的张数+一次最少可抽的张数)的余数是否等于0,并构造赋值变量“应该抽的张数”。若判断为“否”则到第四步将“应该抽的张数”赋值给结果,若判断为“是”则将把判断那步求得的余数赋值给结果。第五步根据上一步的执行情况作答。最后程序结束。

图3
五、变量信息
1、我们让角色1执行“判断甲乙谁获胜概率大”的程序,让角色“画走路的女人”执行“求第一组应该抽多少张牌”的程序。用到的变量如下:
2、角色1要用到的变量:牌的总数、一次至少抽多少张牌、一次最多抽多少张牌、先手、获胜概率大者(此时舞台区的该角色未被变量信息的显示挡住)
“画走路的女人”用到的变量:卡片总数、一次最少可抽的张数、一次最多可抽的张数、应该抽的张数(此时舞台区的该角色未被变量信息的显示挡住)

图4
六、代码示例
1、先看角色1执行的代码
当绿旗被点击
首先制定规则:确定牌的总数、每次可抽牌数的范围。
询问一共有几张牌?
将牌的总数设为回答
询问每次最多抽出几张牌?
将一次最多抽多少张牌设为回答
将一次至少抽多少张牌设为1
接下来判断牌被分组后是否有余下的,而余下的就是接下来要判断的余数是否等于0。根据实际情况推断谁先手获胜的概率大。
如果牌的总数÷一次最多可抽的张数的余数=0那么
询问谁先抽牌?
将先手设为回答
如果先手=甲那么 (第1.1组判断)
将获胜概率大者设为甲
说:“甲获胜的概率更大”
如果先手=乙那么 (第1.2组判断)
将获胜概率大者设为乙
说:“乙获胜的概率更大”
否则
询问谁先抽牌
将先手设为回答
如果先手=甲那么 (第2.1组判断)
将获胜概率大者设为乙
说:“乙获胜的概率更大”
否则
如果先手=乙那么 (第2.2组判断)
将获胜概率大者设为甲
说:“甲获胜的概率更大”


2、再看“画走路的女人”执行的代码
当绿旗被点击
和“角色1”一样,判断之前都是先指定规则。
询问有多少张卡片
将卡片的总数设为回答
询问每次最多可抽多少张卡片
将一次最多可抽的张数设为回答
将一次最少可抽的张数设为1
前面说到了随机抽采用速战速决原则,那我们就判断卡片是如何按周期分组的,根据该原则确定每组有多少个就拿多少个来取,∴要列式判断。将余数作为最终结果。而没余数恰好相反。
如果卡片的总数÷(一次最多可抽的张数+一次最多少可抽的张数)的余数=0那么
将应该抽的张数设为:卡片的总数÷(一次最多可抽的张数+一次最多少可抽的张数)的余数
说:“连接连接如果作为先手抽卡片,必须抽余下的卡片,即张数为应该抽的张数张”
否则
将应该抽的张数设为:卡片的总数÷(一次最多可抽的张数+一次最多少可抽的张数)
说:“如果作为先手抽卡片,必须每次都把一组所有的卡片都抽走,即张数为应该抽的张数张”
七、知识拓展
有一类游戏在交替进行的情况下对决是允许放弃一手的:围棋(围空)。为什么呢?这与它的规则有某些联系:黑先白后一子一子交替下,我把你被我围住的你棋子提走,另外可以无限落子等等。对于无限落子而言,实际上是没有错,但从理论上讲却不然。我们画一下图(如图4所示)就知道了。为了方便,我拿四字棋的棋盘代替围棋棋盘。虽然棋盘不同,但道理都是一样的。先看左面这幅图,在黑子提走之前有且仅有一个格子是空的,下一手到白棋时他只能把棋子落在那里,同时他也会把棋盘上的所有黑棋全部提走(中间图所示)。为

什么会这样呢?是∵此时棋盘满了,理论上已经不能再落子了,而实际上还能落子(只要双方都还有时间就可以),而要实现再落子,唯一的方法就是我把你的全部子提走。这也就是说为什么每款三消游戏里闯关时如果没有了可消除的元素系统会自动刷新元素。再看右边这幅图,这个棋盘里有不相邻的两处禁止白棋落子,为什么禁止白棋落子?我们画一下辅助

线。通过画辅助线可知,所有的黑子构成了一个“封闭的图形”,只有白棋连落两子才会提走全部黑棋,而这又违反规则,那你这一子无论落在哪里都必然会被白棋提走,除非黑棋放弃一手。可黑棋未必下一回在落一子啊!谁都想赢,除非黑棋“手滑了”。∴围棋里放弃一手也是一种非常有必要的策略。