Python实战:从零构建足球点球大战模拟程序

Hazel
Hazel
发布时间:2026-10-15 | 6人浏览过
原创

本文详细介绍如何使用Python编写一个足球点球大战小游戏。教程涵盖从基础的方向输入、随机扑救逻辑,到利用列表管理得分与剩余轮数,再到实现进球数判定提前结束比赛的完整流程。通过封装函数和优化循环结构,帮助开发者掌握Python基础语法在实际交互程序中的应用。

游戏流程概述

在掌握Python基础语法后,我们可以尝试开发一个互动性较强的点球射门小游戏。该游戏的核心流程大致如下:

  • 游戏采用攻守轮换机制。首先,玩家输入射门方向,系统随机生成一个扑救方向。若双方方向不一致,则判定为进球并得分;若方向一致,则判定为扑救成功,玩家不得分。
  • 随后进行攻守角色互换。此时玩家需选择一个方向进行扑救,系统则随机生成射门方向。
  • 比赛设定为5轮制。当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 函数内部直接修改外部定义的普通变量时涉及全局变量(global)的复杂概念,使用列表(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轮内剩余的射门机会数,仍小于领先方的当前得分时,比赛立即结束。虽然可以根据当前轮次计算剩余机会,但由于先踢和后踢的顺序不同,直接计算较为复杂且易出错。

因此,我决定引入一个新的列表 rest,用于记录双方剩余的轮数,初始值均设为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 循环,以便根据 kick 函数的返回值提前跳出循环:

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 相关产品和应用

全部下载

专题列表