起因
周六被小伙伴拖去游泳,美名其曰:锻炼身体。其实某人就是去泡澡的,哈哈。说正题吧,游完泳在体育场里闲逛,里面很大,转着转着看到一个保龄球馆,怀着对未知事物的好奇,决定和某人去尝试一下。我和S同学一人买了一局,按照说明,每一局分为10次,每一次有两次机会扔球。最后的比分就不说了,反正玩的很爽,最后也在边上一个厉害的大叔指点下,学会了基本的扔球姿势。
看到这你以为这是一篇叙事文?那就错了,起因是从这里开始的,我们的次数用完后,留在里面打台球(这里也有台球桌),看到不断有穿着队服一类东西的人进来,应该是来比赛的,同时又看到了赛道上面的牌子,有一个写着:289分。那分数是怎么计算的呢,怀着好奇心搜索起保龄球的积分规则来。在了解之后,我就在想一个问题:__如果是让我开发一个保龄球的游戏,那么计分程序要怎么写呢?__今天我们就从这里说起。。。
规则
先简述一下保龄球的规则,这里引用百度知道的别人的回答,每一局比赛有10格,每格有两次击球机会,我们这里关注它的得分情况,这里分为两种情况:
1-9格击球
每一格有3种可能:
第一次击球全部击倒:这种情况得分就是击倒的瓶数(10)+后两次击球击倒的总数
两次击球全部击倒:这样得分为击倒的瓶数(10)+后一次击球击倒的总数
两次击球没有全部击倒:得分为两次击倒总瓶数
第10格击球
这一格有两种可能:
前两次未能将瓶全部击倒:得分为击倒总瓶数+第9格的得分
前两次将瓶全部击倒,获得一次追加机会:得分为两次击倒总数(10)+追加时击倒的总瓶数+第9格分数
程序
规则也了解了,下面就到了写代码的时候了,为了方便,这里选择Python,版本为3.6
考虑到直观性,这里没有用交互式的程序,而是直接将击中情况抽象成矩阵(数组),算出最后总分。
输入的数据大概是这个样子:
[[0, 3], [2, 6], [3, 6], [0, 3], [3, 0], [9, 1], [6, 3], [6, 2], [4, 6], [4, 2]]
10x2的数组,代表前10格每格的击倒瓶数,如果一格内不需要第二次击球,也算作0。这里先写一个简单的数据生成函数。
import random
def top_10():
for i in range(10):
for j in range(2):
if j == 0 :
a[i][j] = random.randint(0,10)
else :
a[i][j] = random.randint(0,10-a[i][j-1])
return a
同时,我们注意到了,这个生成函数还少了点什么,没错,就是第十格的追加击球数。所以,这里再定义一个追加球生成函数
这里为了后面计算方便,也定义为[[x,y]]这种格式
def addto_num(a):
return [[random.randint(0,10),0]] if sum(a[9]) =&