教你使用python做一个“罚点球”小游戏
作者:编程学习网 发布时间:2022-10-12 00:09:03
在学习了一点 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('玩家落败.')
这次的程序比我们之前写过的都要长,结构也更复杂,需要耐心去分析。
来源:https://juejin.cn/post/7105593481552199711


猜你喜欢
- 如下所示:str='abcdef'print(str.endswith('f'))print(str.sta
- 总有一些程序在windows平台表现不稳定,动不动一段时间就无响应,但又不得不用,每次都是发现问题了手动重启,现在写个脚本定时检测进程是否正
- 小程序模板消息即将被废弃掉,于是有了新接口wx.requestSubscribeMessage订阅消息文档步骤:1、获取用户openid 、
- 1.下载下载链接点击download,这里可能需要登录甲骨文的账号,登录一下即可2.解压下载好会得到一个安装包把它解压到一个能找到的目录下即
- 案例解析这个问题描述起来有点违反直觉,要执行一个文件难道不应该需要可执行权限吗?让我们先来看一个例子:# module1.pydef tes
- DatePart 的语法是 DatePart(interval, date),用以取 date 的某部分。 interval yyyy:da
- 这篇文章主要介绍了在SQL Server中处理空值时所涉及的3个问题:计数、使用空表值以及外键处理。用COUNT(*)处理空值大多数集合函数
- BrowserPlus 到底是什么,又能做什么?BrowserPlus 是 Yahoo! 最近刚发布一个 Web 扩展的平台:终端用户需安装
- PHP是一种面向对象的编程语言,它允许开发者使用面向对象的编程技术来构建复杂的应用程序。下面是一些关于PHP面向对象编程的讲解:类与对象类是
- 任何熟悉SQL和关系数据库的人都遇见过大量的连接类型。最简单的说,连接(join)会把两个表的内容组合到一个虚拟表或者recordset内。
- 一、SQL Server Row_number函数简介ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续
- 前言Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。由于 Tki
- 常见的协议http和httpshttp协议:超文本传输协议,是一个发布和接受HTML页面的方法,端口是80https 协议:http协议的加
- 世上无难事,只要找到 Homebrew 的正确安装方式。Homebrew 是什么Homebrew是 mac的包管理器,仅需执行相应的命令,就
- 计算信息熵的公式:n是类别数,p(xi)是第i类的概率假设数据集有m行,即m个样本,每一行最后一列为该样本的标签,计算数据集信息熵的代码如下
- 关于一些代码里的解释,可以看我上一篇发布的文章,里面有很详细的介绍!!!可以依次把下面的代码段合在一起运行,也可以通过jupyter not
- 系统用户administrator 密码改变后,注销重新登录,发现SQL Server没有随机启动。手动从服务管理器中启动,提示“由于登录失
- 1. 下载darknet源码在命令窗口(terminal)中进入你想存放darknet源码的路径,然后在该路径下输入依次输入以下命令:git
- keras 中fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1,
- 目录1.字典字典的相关操作获取字典的长度2.集合1.字典字典是python中的一种数据结构。它的内容由**键-值(key-value)**的