一、游戏规则
- 你和另外九名玩家进行一次射击游戏
- 游戏按轮进行,每轮游戏中未被淘汰的玩家依次选择一名玩家进行射击,若命中,则该被击中玩家淘汰
- 经过若干轮后,最后未被淘汰的一名玩家获胜
- 现在你将扮演玩家0,玩家1~9由电脑控制,各玩家选择你进行射击的概率和各玩家的命中率如下表所示:
试玩链接:shooting_game.py
二、程序编写
1.为了按照既定的概率判断某个动作(选哪个人、是否命中),考虑使用随机数来完成操作
- 由于整数的处理比小数更高效,此处可以把概率的小数
放大一百倍
,所以这样初始化各位玩家的属性:
player_0 = {"hp":1, "p_ch0":0, "p_kill":60}
player_1 = {"hp":1, "p_ch0":10, "p_kill":50}
player_2 = {"hp":1, "p_ch0":15, "p_kill":45}
player_3 = {"hp":1, "p_ch0":20, "p_kill":40}
player_4 = {"hp":1, "p_ch0":25, "p_kill":35}
player_5 = {"hp":1, "p_ch0":30, "p_kill":30}
player_6 = {"hp":1, "p_ch0":35, "p_kill":25}
player_7 = {"hp":1, "p_ch0":40, "p_kill":20}
player_8 = {"hp":1, "p_ch0":45, "p_kill":15}
player_9 = {"hp":1, "p_ch0":50, "p_kill":10}
players = [player_0,player_1,player_2,player_3,player_4,player_5,player_6,player_7,player_8,player_9]
- 为了方便处理,使用了
列表嵌套字典
的结构,其中p_ch0
和p_kill
分别表示玩家选择玩家0进行射击的概率
和各玩家的命中率
2.由于程序中存在大量按照概率判断事件是否发生的操作,可以考虑把它们写成函数
def p_judge(p):
"““依据概率判断事件是否发生“““"
p_rand = random.randint(0,100)
if p_rand <= p: # 发生
return 1
else: # 不发生
return 0
- 如图,定义了一个形参为p的函数
p_judge
,然后生成一个1~100
(概率放大一百倍)间的随机整数- 如果随机数小于等于这个概率p,那么表示事件发生,返回1
- 如果随机数大于这个概率p,那么表示事件不发生,返回0(有点布尔的感觉)
3.为了防止玩家1~9进行射击(全部由电脑控制)时输出太快,使用如下语句使程序每输出一段字符串都暂停一段时间
import time
time.sleep(1)
4.最后为了判断玩家0是否胜出(其余玩家全部淘汰),如果逐一判断其他9个玩家字典的"hp"键的值是否为0,会造成语句过长,所以此处选择直接统计淘汰玩家的人数,若达到9且玩家0未被淘汰,那么说明玩家0胜出
(这里提一下,编码时我一时大意,把初始化计数变量m
和初始化轮次计数变量i
一起写到了程序的最开始,导致后面测试的时候发现m的值高达三十多…正确的做法是在每轮的末尾再初始化m的值,使其统计的值为每轮
淘汰的人数,而不是多轮之后
被淘汰的玩家的数量之和
)
三、整个游戏的python代码如下所示
import random # 用于生成随机数
import time # 用于让程序暂停一段时间
# 初始化各位玩家的属性
player_0 = {"hp":1, "p_ch0":0, "p_kill":60}
player_1 = {"hp":1, "p_ch0":10, "p_kill":50}
player_2 = {"hp":1, "p_ch0":15, "p_kill":45}
player_3 = {"hp":1, "p_ch0":20, "p_kill":40}
player_4 = {"hp":1, "p_ch0":25, "p_kill":35}
player_5 = {"hp":1, "p_ch0":30, "p_kill":30}
player_6 = {"hp":1, "p_ch0":35, "p_kill":25}
player_7 = {"hp":1, "p_ch0":40, "p_kill":20}
player_8 = {"hp":1, "p_ch0":45, "p_kill":15}
player_9 = {"hp":1, "p_ch0":50, "p_kill":10}
# 定义玩家列表,方便后续处理
players = [player_0,player_1,player_2,player_3,player_4,player_5,player_6,player_7,player_8,player_9]
# 初始化计数变量
i = 1
def p_judge(p):
"““依据概率判断事件是否发生“““"
p_rand = random.randint(0,100)
if p_rand <= p: # 发生
return 1
else: # 不发生
return 0
# 游戏主循环
while player_0["hp"] == 1:
print("\n\n第",i,"轮:")
while True: # 玩家0指定目标
target = int(input(" 选择目标:"))
# 判断玩家输入是否合法
if target < 1 or target >9:
print(" 请在1-9号之间选择。")
elif players[target]["hp"] == 0:
print(" 该玩家已经被淘汰了。")
else:
break
if p_judge(player_0["p_kill"]) == 0: # 判断玩家是否击中目标
print(" 哦豁,没有击中目标…")
else:
print(" 成功击中",target,"号。")
players[target]["hp"] = 0
for player in players[1:10]: # 其他玩家射击
if player["hp"] == 1: # 跳过淘汰的玩家
print("\n ",players.index(player),"号开始射击:")
time.sleep(1)
if p_judge(player["p_ch0"]) == 1: # 判断是否击中玩家0(导致游戏结束)
print(" 他向你瞄准了!")
time.sleep(1)
if p_judge(player["p_kill"]) == 0:
print(" Fortunately,他没有击中你。")
time.sleep(1)
else:
print(" 你被击中啦!游戏结束。")
exit(0)
else:
while True:
target = players[random.randint(1,9)]
if target["hp"] == 1 and target != player:
print(" 他瞄准了",players.index(target),"号")
time.sleep(1)
break
if p_judge(player["p_kill"]) == 0:
print(" 但他没有击中。")
time.sleep(1)
else:
print(" 他击中了",players.index(target),"号")
time.sleep(1)
players[players.index(target)]["hp"] = 0
print("\n结算情况:") # 每轮之后,输出结算情况
time.sleep(1)
m = 0 # 初始化记取淘汰玩家数的变量
print(" 1 2 3 4 5 6 7 8 9 ")
print(" ",end = "") # 输出空格以与上方对齐
for player in players[1:10]:
if player["hp"] == 1:
print("V",end = " ")
else:
print("X",end = " ")
m += 1
print("\n 一共有",m,"人淘汰。")
time.sleep(1)
if m == 9:
print("\n\n恭喜获胜!")
exit(0)
i += 1
四、运行结果
第 1 轮:
选择目标:9
成功击中 9 号。
1 号开始射击:
他瞄准了 2 号
但他没有击中。
2 号开始射击:
他瞄准了 4 号
他击中了 4 号
3 号开始射击:
他瞄准了 5 号
但他没有击中。
5 号开始射击:
他瞄准了 6 号
但他没有击中。
6 号开始射击:
他瞄准了 3 号
但他没有击中。
7 号开始射击:
他瞄准了 3 号
他击中了 3 号
8 号开始射击:
1 2 3 4 5 6 7 8 9
V V X X V V V V X
一共有 3 人淘汰。
第 2 轮:
选择目标:8
哦豁,没有击中目标…
1 号开始射击:
他瞄准了 8 号
他击中了 8 号
2 号开始射击:
他瞄准了 6 号
但他没有击中。
5 号开始射击:
他瞄准了 7 号
但他没有击中。
6 号开始射击:
他瞄准了 7 号
但他没有击中。
7 号开始射击:
他向你瞄准了!
Fortunately,他没有击中你。
结算情况:
1 2 3 4 5 6 7 8 9
V V X X V V V X X
一共有 4 人淘汰。
第 3 轮:
选择目标:3
该玩家已经被淘汰了。
选择目标:5
成功击中 5 号。
1 号开始射击:
他瞄准了 6 号
他击中了 6 号
2 号开始射击:
他瞄准了 7 号
但他没有击中。
7 号开始射击:
他瞄准了 1 号
但他没有击中。
结算情况:
1 2 3 4 5 6 7 8 9
V V X X X X V X X
一共有 6 人淘汰。
第 4 轮:
选择目标:1
哦豁,没有击中目标…
1 号开始射击:
他瞄准了 2 号
他击中了 2 号
7 号开始射击:
他瞄准了 1 号
但他没有击中。
结算情况:
1 2 3 4 5 6 7 8 9
V X X X X X V X X
一共有 7 人淘汰。
第 5 轮:
选择目标:1
哦豁,没有击中目标…
1 号开始射击:
他瞄准了 7 号
但他没有击中。
7 号开始射击:
他向你瞄准了!
Fortunately,他没有击中你。
结算情况:
1 2 3 4 5 6 7 8 9
V X X X X X V X X
一共有 7 人淘汰。
第 6 轮:
选择目标:1
哦豁,没有击中目标…
1 号开始射击:
他瞄准了 7 号
他击中了 7 号
结算情况:
1 2 3 4 5 6 7 8 9
V X X X X X X X X
一共有 8 人淘汰。
第 7 轮:
选择目标:1
成功击中 1 号。
结算情况:
1 2 3 4 5 6 7 8 9
X X X X X X X X X
一共有 9 人淘汰。
恭喜获胜!
五、结束语
感谢每一个坚持看到这里的小伙伴!
把自己的思路说出来并让人明白并不容易,而我也正在努力做到这一点。
本人正在读高三,用来学python的时间不多,难免有错误和偏颇之处,还请各位多多包涵,不吝指教。
如果觉得这篇文章有用的话,请点一个小小的赞吧~