教你使用python做一个“罚点球”小游戏

 更新时间:2022年06月06日 11:25:16   作者:编程学习网  
这篇文章主要介绍了用python做一个“罚点球”小游戏,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在学习了一点 Python 基础之后,我们可以做一个罚点球的小游戏,大概流程是这样:

  • 每一轮,你先输入一个方向射门,然后电脑随机判断一个方向扑救。方向不同则算进球得分,方向相同算扑救成功,不得分。
  • 之后攻守轮换,你选择一个方向扑救,电脑随机方向射门。
  • 第5轮结束之后,如果得分不同,比赛结束。
  • 5轮之内,如果一方即使踢进剩下所有球,也无法达到另一方当前得分,比赛结束。
  • 5论之后平分,比赛继续进行,直到某一轮分出胜负。

实现方法有很多种,我这里提供的只是一种参考。你可以按照自己喜欢的方式去做,那样才是属于你的游戏。

先说一下方向的设定。我的想法比较简单,就是左、中、右三个方向,用字符串来表示。射门或者扑救的时候,直接输入方向。所以这里我用 input 来实现。有同学是用 1-9 的数字来表示八个方向和原地不动,每次输入一个数字,这也是可以的。不过这样守门员要扑住的概率可就小多了。

至于电脑随机挑选方向,如果你是用数字表示,就用我们之前讲过的 randint 来随机就行。不过我这里打算用 random 的一个方法:choice。它的作用是从一个 list 中随机挑选一个元素。

于是,罚球的过程可以这样写:

from random import choice
you = input('选择你要踢的方向:(左、中、右)')
print('你踢向了' + you)
direction = ['左', '中', '右']
com = chice(direction)
print ('电脑扑向了' + com)
if you != com:
    print ('进球得分!')
else:
    print ('被扑出去了...')

反之亦然,这里不赘述。

接下来,我们让它循环5次,并且记录下得分。暂时先不判断胜负。

用 score_you 表示你的得分,score_com 表示电脑得分。开始都为0,每进一球就加1。

from random import choice
score_you = 0
score_com = 0
direction = ['左', '中', '右']
for i in range(5):
    print('==== 第 %d 回合 - 玩家罚球 ====' % (i+1))
    you = input('选择你要踢的方向:(左、中、右)')
    print('你踢向了' + you)

    com = choice(direction)
    print('电脑扑向了' + com)

    if you != com:
        print('进球得分!')
        score_you += 1
    else:
        print('被扑出去了...')
    print('比分: %d(you) - %d(com)\n' % (score_you, score_com))

    print('==== 第 %d 回合 - 玩家扑救 ====' % (i+1))
    you = input('选择你要扑的方向:(左、中、右)')
    print('你扑向了' + you)

    com = choice(direction)
    print('电脑踢向了' + com)

    if you == com:
        print('扑出去了!')
    else:
        print('丢球了...')
        score_com += 1
    print('比分: %d(you) - %d(com)\n' % (score_you, score_com))

这段代码里有两段相似度很高,你可以想想是不是有办法可以用个函数把它简化。

在此基础之上,我们再加上胜负判断,如果5轮结束之后是平分,就继续踢。

所以我们把一轮的过程单独拿出来作为一个函数kick,在5次循环之后再加上一个while循环。

另外,这里把之前的 score_you 和 score_com 合并成了一个 score 数组。这里的原因是,要让 kick 函数里用到外部定义的变量,需要使用全局变量的概念。暂时想避免说这个,而用 list 不存在这个问题。

from random import choice
score = [0, 0]
direction = ['左', '中', '右']
def kick():
    print('==== 玩家罚球 ====')
    you = input('选择你要踢的方向:(左、中、右)')
    print('你踢向了' + you)

    com = choice(direction)
    print('电脑扑向了' + com)

    if you != com:
        print('进球得分!')
        score[0] += 1
    else:
        print('被扑出去了...')
    print('比分: %d(you) - %d(com)\n' % (score[0], score[1]))

    print('==== 玩家扑救! ====')
    you = input('选择你要扑的方向:(左、中、右)')
    print('你扑向了' + you)

    com = choice(direction)
    print('电脑踢向了' + com)

    if you == com:
        print('扑出去了!')
    else:
        print('丢球了...')
        score[1] += 1
    print('比分: %d(you) - %d(com)\n' % (score[0], score[1]))

for i in range(5):
    print('==== 第 %d 轮 ====' % (i + 1))
    kick()

while score[0] == score[1]:
    i += 1
    print('==== 第 %d 轮 ====' % (i + 1))
    kick()

if score[0] > score[1]:
    print('玩家获胜!')
else:
    print('玩家落败.')

到这里我们的点球游戏已经快完成了,现在要做的就是增加比赛提前结束的机制,让它更真实。

我的思路是这样:比赛提前结束,就是落后一方的得分,加上他在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 '==== 第 %d 轮 ====' % (i+1)
   end = kick()
   i += 1

完整代码如下:

from random import choice

score = [0, 0]
rest = [5, 5]
direction = ['左', '中', '右']

def kick():
    print('==== 玩家罚球 ====')
    you = input('选择你要踢的方向:(左、中、右)')
    print('你踢向了' + you)

    com = choice(direction)
    print('电脑扑向了' + com)

    if you != com:
        print('进球得分!')
        score[0] += 1
    else:
        print('被扑出去了...')
    print('比分: %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 = input('选择你要扑的方向:(左、中、右)')
    print('你扑向了' + you)

    com = choice(direction)
    print('电脑踢向了' + com)

    if you == com:
        print('扑出去了!')
    else:
        print('丢球了...')
        score[1] += 1
    print('比分: %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('==== 第 %d 轮 ====' % (i + 1))
    end = kick()
    i += 1

while score[0] == score[1]:
    i += 1
    print('==== 第 %d 轮 ====' % (i + 1))
    kick()

if score[0] > score[1]:
    print('玩家获胜!')
else:
    print('玩家落败.')

这次的程序比我们之前写过的都要长,结构也更复杂,需要耐心去分析。

到此这篇关于用python做一个“罚点球”小游戏的文章就介绍到这了,更多相关python罚点球游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用python中的matplotlib绘制方程图像代码

    用python中的matplotlib绘制方程图像代码

    今天小编就为大家分享一篇用python中的matplotlib绘制方程图像代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python yaml文件数据按原有的数据顺序dump问题小结

    python yaml文件数据按原有的数据顺序dump问题小结

    这篇文章主要介绍了python yaml文件数据按原有的数据顺序dump,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • Python使用eval函数解析和执行字符串

    Python使用eval函数解析和执行字符串

    在Python中,eval函数是一个非常强大的函数,它可以将字符串作为代码进行解析和执行,本文主要介绍了如何使用eval函数解析和执行字符串,需要的可以了解下
    2024-01-01
  • python循环某一特定列的所有行数据(方法示例)

    python循环某一特定列的所有行数据(方法示例)

    在Python中,处理表格数据(比如CSV文件、Excel文件等)时,我们通常会使用pandas库,因为它提供了丰富的数据结构和数据分析工具,下面,我将以处理CSV文件中的某一特定列的所有行数据为例,给出详细、完整的代码示例,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • Python Plotly库安装及使用教程

    Python Plotly库安装及使用教程

    这篇文章主要介绍了包括安装、导入库、Plotly的基本结构、常见图表类型、样式定制以及如何与Pandas数据框结合使用,通过示例代码和解释,帮助读者快速掌握Plotly的使用技巧,需要的朋友可以参考下
    2025-03-03
  • Python如何使用标准库tmpfile库创建临时文件

    Python如何使用标准库tmpfile库创建临时文件

    这篇文章主要介绍了Python如何使用标准库tmpfile库创建临时文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • python爬虫实战项目之爬取pixiv图片

    python爬虫实战项目之爬取pixiv图片

    最近决定写个P站的爬虫,实际操作起来确实遇到了些新问题,通过解决也有所收获,下面这篇文章主要给大家介绍了关于python爬虫实战项目之爬取pixiv图片的相关资料,需要的朋友可以参考下
    2022-07-07
  • Python利用atexit模块实现优雅处理程序退出

    Python利用atexit模块实现优雅处理程序退出

    Python的atexit模块提供了一种方便的方式来注册这些退出时执行的函数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • Python实战之屏幕录制功能的实现

    Python实战之屏幕录制功能的实现

    屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文 主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助
    2025-03-03
  • Python unittest单元测试框架及断言方法

    Python unittest单元测试框架及断言方法

    这篇文章主要介绍了Python unittest单元测试框架及断言方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论