약간의 Python 기초를 배운 후에 우리는 작은 페널티킥 게임을 만들 수 있습니다.대략적인 프로세스는 다음과 같습니다.
- 각 라운드에서 먼저 촬영할 방향을 입력하면 컴퓨터가 무작위로 저장할 방향을 결정합니다. 방향이 다르면 득점이 되고, 방향이 같으면 세이브를 하고 득점은 하지 않는다.
- 그 후 공격과 방어를 번갈아 가며 저장 방향을 선택하면 컴퓨터가 무작위 방향으로 쏘게 된다.
- 5라운드 이후 점수가 다를 경우 게임이 종료됩니다.
- 5라운드 이내에 한 팀이 다른 팀의 현재 득점에 도달하지 못하면 남은 골이 모두 득점되어 게임이 종료됩니다.
- 5번의 토론 끝에 특정 라운드에서 승자가 결정될 때까지 게임이 계속됩니다.
이를 구현하는 방법에는 여러 가지가 있으며 여기에서 제공하는 것은 참조일 뿐입니다. 당신은 당신이 좋아하는 방식으로 그것을 할 수 있으며 그것이 당신의 게임입니다.
먼저 방향 설정에 대해 알아보겠습니다. 내 생각은 비교적 간단합니다. 즉, 왼쪽, 가운데, 오른쪽의 세 방향이 문자열로 표시됩니다. 촬영 또는 저장 시 방향을 직접 입력합니다. 그래서 여기에서 입력을 사용하여 달성합니다. 어떤 학생들은 1~9까지의 숫자를 사용하여 여덟 방향을 가리키고 제자리에 머물며, 한 번에 숫자를 입력하는 것도 가능합니다. 그러나 골키퍼가 덤벼들 확률은 훨씬 적습니다.
컴퓨터가 임의로 선택하는 방향을 숫자로 표현한다면 앞서 말한 randint를 사용하면 됩니다. 하지만 여기서는 임의의 방법인 선택을 사용하겠습니다. 그 역할은 목록에서 요소를 무작위로 선택하는 것입니다.
따라서 자유투 프로세스는 다음과 같이 작성할 수 있습니다.
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라운드 후 동점이면 계속 플레이하게 된다.
그래서 우리는 한 라운드의 과정을 함수 킥으로 빼고 5회 루프 후에 while 루프를 추가합니다.
또한 이전 score_you 및 score_com이 점수 배열로 병합됩니다. 그 이유는 킥 함수에서 외부적으로 정의된 변수를 사용하기 위해서는 전역 변수의 개념을 사용해야 하기 때문입니다. 당분간 이런 말은 하지 않으려고 하는데 리스트에는 이 문제가 존재하지 않습니다.
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 编程学习圈,每日干货分享