Python实战:决策类小游戏的简单编程

一、游戏规则

  • 你和另外九名玩家进行一次射击游戏
    • 游戏按轮进行,每轮游戏中未被淘汰的玩家依次选择一名玩家进行射击,若命中,则该被击中玩家淘汰
    • 经过若干轮后,最后未被淘汰的一名玩家获胜
    • 现在你将扮演玩家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_ch0p_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的时间不多,难免有错误和偏颇之处,还请各位多多包涵,不吝指教。

如果觉得这篇文章有用的话,请点一个小小的赞吧~

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值