点球小游戏 2

再次说明:一个编程问题会有很多种解法,我给的只是其中一种,而且未必是最好的一种。所以,你尽可去想自己的方法,然后实现它。

我们的点球游戏已经快完成了,现在要做的就是增加比赛提前结束的机制,让它更真实。(关于这个小游戏的前几课内容参见第 26 27 28 课)

我的思路是这样:比赛提前结束,就是落后一方的得分,加上他在5轮中剩下的轮数,仍然低于领先方现在的得分。虽然可以根据当前的轮数计算剩下的机会,但由于先踢和后踢的情况不同,这样计算会有些复杂,容易搞错。

所以我决定再增加一个list,里面记录双方剩余的轮数,初始均为5。

每踢一球,就把对应那一方的计数减1。

每踢一球,就判断输的那一方是否还有机会。

于是需要增加的代码就是:

在最开始

rest = [5, 5]

以玩家为例,每踢完一球的判断

if rest[0] > 0:

rest[0] -= 1

if score[0] < score[1] and score[0] + rest[0] < score[1]:

return True

if score[1] < score[0] and score[1] + rest[1] < score[0]:

return True

由于提前结束仅限于5轮内,所以要判断rest[0]>0。return可以让kick函数提前结束。电脑的判断与这个类似,只是要换成rest[1]。

因为需要有个方法提前结束循环,所以我让kick函数返回一个bool值,正常情况返回False,一旦提前结束就返回True。

之前的for循环也改成while,以便于提前结束循环。

i = 0

end = False

while(i < 5 and not end)

print '==== Round %d ====' % (i+1)

end = kick()

i += 1

完整代码如下,改动之处用颜色标出,注意点参考图片上的注释:

from random import choice

score = [0, 0]

rest = [5, 5]

direction = ['left', 'center', 'right']

def kick():

print '==== You Kick! ===='

print 'Choose one side to shoot:'

print 'left, center, right'

you = raw_input()

print 'You kicked ' + you

com = choice(direction)

print 'Computer saved ' + com

if you != com:

print 'Goal!'

score[0] += 1

else:

print 'Oops...'

print 'Score: %d(you) - %d(com)\n' % (score[0], score[1])

if rest[0] > 0:

rest[0] -= 1

if score[0] < score[1] and score[0] + rest[0] < score[1]:

return True

if score[1] < score[0] and score[1] + rest[1] < score[0]:

return True

print '==== You Save! ===='

print 'Choose one side to save:'

print 'left, center, right'

you = raw_input()

print 'You saved ' + you

com = choice(direction)

print 'Computer kicked ' + com

if you == com:

print 'Saved!'

else:

print 'Oops...'

score[1] += 1

print 'Score: %d(you) - %d(com)\n' % (score[0], score[1])

if rest[1] > 0:

rest[1] -= 1

if score[0] < score[1] and score[0] + rest[0] < score[1]:

return True

if score[1] < score[0] and score[1] + rest[1] < score[0]:

return True

return False

i = 0

end = False

while(i < 5 and not end):

print '==== Round %d ====' % (i+1)

end = kick()

i += 1

while(score[0] == score[1]):

print '==== Round %d ====' % (i+1)

kick()

i += 1

if score[0] > score[1]:

print 'You Win!'

else:

print 'You Lose.'

这次的程序比我们之前写过的都要长,结构也更复杂,需要耐心去分析。你可以按照自己的理解,去一步步完善这个游戏。

#==== Crossin的编程教室 ====#

面向零基础初学者的编程课

每天5分钟,轻松学编程

回复『 p 』查看课程目录

回复『 t 』查看习题列表

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2013-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏顶级程序员

为什么Python是入行人工智能的首选语言?

在所有编程语言里,Python并不算萌新,从1991年发布第一个版本,至今已经快30年了。

2204
来自专栏Alan's Lab

JS 变量提升

问到 JS 一些细节问题的时候发挥比较糟糕,有些是知道反应得太慢,有些是压根没接触过,还是积累的太少了。这篇的 JS 变量提升问题就是从没有接触过的,网上一搜一...

2692
来自专栏令仔很忙

设计模式总结之一三五

通过学习设计模式来提高写出的代码的可维护性、可复用性、可扩展性和灵活性。也就是说让系统能够达到“高内聚、低耦合”的状态。

1012
来自专栏老九学堂

程序员揭秘:火爆朋友圈的左右脑年龄测试,真相只是一个随机函数!

最近,老九的朋友圈已经被左右脑测试刷爆了,老九也去测试了一下,只需要进入相应入口并回答几个设定的问题后,就会出现左右脑两个年龄测试结果。 ? 有不少小伙伴晒出自...

3886
来自专栏编程

器—术—道:程序设计教材建设经验谈

《计算机教育》2017年第11期 封面文章 引 言 程序设计的境界有3种:器—术—道。在程序设计能力培养方面,一般由“器”入门,通过熟悉“术”,最终达到“道”的...

2209
来自专栏编舟记

我是怎样学习新编程语言的

学习新的编程语言的最终目的是解决实际问题。掌握编程语言的过程,在某种程度上近似学习一种新的工程实践。不仅解决问题固然可乐,学习的过程也同样充满了新鲜感,不过需要...

1223
来自专栏杨光的专栏

千亿关系链下的新增共同好友计算

本文介绍一种千亿关系链下的日新增共同好友挖掘算法 --NTE 算法。该算法基于分治的思想,将新增共好友计算问题,转换为更易于运算与实现的三角形计算问题。

1K0
来自专栏算法channel

动态规划中篇:爬楼梯

主要推送关于对算法的思考以及应用的消息。培养思维能力,注重过程,挖掘背后的原理,刨根问底。本着严谨和准确的态度,目标是撰写实用和启发性的文章,欢迎您的关注。 0...

4149
来自专栏阿凯的Excel

乘积求和及符合某个条件的乘积求和

如何得到两个数组的乘积求和呢??案例如下: ? 已知每个地市的销售单价和销售数量,需要知道整个表的销售总金额,怎么做??? 普通青年做法: ? 小编客观公正...

4479
来自专栏take time, save time

初级程序员面试不靠谱指南(一)

    “来到这英雄宴中的人物,就算本身武功不是甚高,见识也必广博,“太祖拳法”的精要所在,可说无人不知。乔峰一招打出,人人都是情不自禁的喝了一声采!这满堂大采...

3619

扫码关注云+社区

领取腾讯云代金券