python项目之杠子老虎鸡虫

python项目之杠子老虎鸡虫

本项目我们尝试用Python语言设计一个计算机程序来模拟“杠子老虎鸡虫”游戏。程序的文件名称为HitChopsticks.py,程序将使用import、def、if/elif/else、return等Python保留词,也会用到print( )、random.randrange( )等Python函数,还会使用到变量、数学运算表达式、逻辑条件表达式、字符串运算表达式、自定义函数、代码格式、注释等Python语言的一些特性。

通过该项目你可以获得以下能力:

窥视计算机的工作原理
问题分解并分而治之的技巧
缜密的逻辑推理
具体问抽象化的过程
用数字代码映射具体事物使之便于计算的技巧解决问题的步骤
数学问题(概率)的具体化和试验验证

解决问题的步骤

我们希望能设计一个函数,名称为play_one_round(玩一把),该函数有5个参数,player1_name参数为第一个玩家的姓名, player1_code参数为第一个玩家喊拳的代码, player2_name参数为第二个玩家的姓名, player2_code参数为第二个玩家喊拳的代码。最后一个参数为print_msg = True,形式参数的名称为print_msg,该参数的数据类型为逻辑型,默认值为True(真),表示需要输出信息,如果该参数的值为False(假),则表示不要输出信息。该函数可以判定对决结果,并将结果以数字形式返回给调用者,0表示平局,1表示第一个玩家获胜,2表示第二个玩家获胜。当第五个参数的是为True是,该函数可以用文字的形式输出对决的过程和输赢结论。
  还需要设计shout_out(name)函数实现喊拳的功能,该函数的唯一参数是一个字符串,可能取值为:“杠子”、“老虎”、“鸡”、“虫子”或“随机”,返回的值为一个数字,用来表示对应喊拳名称的数字代码,3代表“杠子”、2代表“老虎”、1代表“鸡”、0代表“虫子”;如果参数值为“随机”,返回一个0到3的随机数字,否则调用name_to_number函数返回对应的数字。有兴趣的同学可以尝试播放对应的喊声音效。
  name_to_number(name)函数用来实现将玩家的喊拳从字符串转换为数字代码的功能,该函数的唯一参数是一个字符串,可能取值为:“杠子”、“老虎”、“鸡”或“虫子”,返回的值为一个数字,用来表示对应喊拳名称的数字代码,3代表“杠子”、2代表“老虎”、1代表“鸡”、0代表“虫子”,如果参数的值不是“杠子”、“老虎”、“鸡”或“虫子”中的一个,则返回-1。
  设计number_to_name(number) 函数用来实现将玩家的喊拳从数字代码转换为字符型名称的功能,该函数的唯一参数是一个在数字,可能取值为:3、2、1、0,返回的值为一个字符串,用来表示数字代码对应的喊拳名称。如果参数的值不是3、2、1、0中的一个,则返回“所喊无效!”。play_one_round会利用该函数输出便于人阅读理解的信息。
  最后是设计probability_calculate()函数,该函数通过多次调用play_one_round实现概率事件的反复试验功能(第五个参数最好为False,因为我们主要关心输赢结果),它能累加试验的总次数、累加甲方获胜的次数、累加平局的次数、累加甲方失败的次数,计算三种事件的概率,我们相信随着试验次数的增加,比如十万次,试验的结果会接近理论计算的结果。 如果在probability_calculate()函数进行了128次对决,可能的输出结果如下: 甲乙随机比赛128次,验证对决结果的概率为:

甲方获胜的概率为:0.2578125
双方平局的概率为:0.4921875
甲方失败的概率为:0.25

项目模板

# “杠子老虎鸡虫”游戏小项目程序模板

# 该程序的关键点是把“虫子”、“鸡”、“老虎”、“杠子”映射为以下数字:
# 0 - 虫子
# 1 - 鸡
# 2 - 老虎
# 3 - 杠子

import random   # 包含random.randrange(start, stop)函数的模块

# 辅助函数
def name_to_number(name):
    # 用if/elif/else将name转换为对应数字代码,-1表示name无效

    # 添加你自己的代码后删除pass
    pass


def number_to_name(number):
    # 用if/elif/else将数字代码number转换为对应的字符名称,number无效时返回"所喊无效!"

    # 添加你自己的代码后删除pass
    pass


def shout_out(name):
    # name参数可以为“随机”、“杠子”、“老虎”、“鸡”或“虫子”,返回对应喊拳的数字代码

    # 添加你自己的代码后删除pass
    pass

def play_one_round(player1_name, player1_code, player2_name, player2_code, print_msg = True):
    #游戏的主要逻辑在该函数中实现

    # 添加你自己的代码后删除pass
    pass

# 验证概率理论
def result_probability():
    #变量声明及初始化
    play_times = 0           # 对决总次数
    player1_win_times = 0    # 甲方获胜次数
    player1_loss_times = 0   # 甲方失败次数
    tie_times = 0            # 双方平局次数

    # 第1次对决
    result = play_one_round("甲", shout_out("随机"), "乙", shout_out("随机"), False)
    play_times = play_times + 1
    if result == 0:
        tie_times = tie_times + 1
    elif result == 1:
        player1_win_times = player1_win_times + 1
    else:
        player1_loss_times = player1_loss_times + 1

    # 第2次对决
    result = play_one_round("甲", shout_out("随机"), "乙", shout_out("随机"), False)
    play_times = play_times + 1
    if result == 0:
        tie_times = tie_times + 1
    elif result == 1:
        player1_win_times = player1_win_times + 1
    else:
        player1_loss_times = player1_loss_times + 1

    # 第3次对决
    result = play_one_round("甲", shout_out("随机"), "乙", shout_out("随机"), False)
    play_times = play_times + 1
    if result == 0:
        tie_times = tie_times + 1
    elif result == 1:
        player1_win_times = player1_win_times + 1
    else:
        player1_loss_times = player1_loss_times + 1

    # 第4次对决
    result = play_one_round("甲", shout_out("随机"), "乙", shout_out("随机"), False)
    play_times = play_times + 1
    if result == 0:
        tie_times = tie_times + 1
    elif result == 1:
        player1_win_times = player1_win_times + 1
    else:
        player1_loss_times = player1_loss_times + 1

    #你可以在这里添加更多的对决来验证概率理论计算的结果


    player1_win_prob  = player1_win_times / play_times    # 甲方获胜概率
    tie_prob  = tie_times / play_times                    # 双方平局概率
    player1_loss_prob  = player1_loss_times / play_times  # 甲方失败概率
    print("") # 输出空白行
    print("甲乙随机比赛"+str(play_times)+"次,验证对决结果的概率为:")
    print("甲方获胜的概率为:" + str(player1_win_prob))
    print("双方平局的概率为:" + str(tie_prob))
    print("甲方失败的概率为:" + str(player1_loss_prob))


# 以下为测试代码,请在你提交的程序中保留以下代码

# 测试name_to_number()函数
print(name_to_number('虫子'))
print(name_to_number('鸡'))
print(name_to_number('老虎'))
print(name_to_number('杠子'))
print(name_to_number('豹子'))

# 测试number_to_name()函数
print(number_to_name(0))
print(number_to_name(1))
print(number_to_name(2))
print(number_to_name(3))
print(number_to_name(10))

# 测试shout_out()函数
print(shout_out("随机"))
print(shout_out("虫子"))
print(shout_out("鸡"))
print(shout_out("老虎"))
print(shout_out("杠子"))
print(shout_out("棍子"))


# 测试play_one_round()函数
result1 = play_one_round("计算机", 1, "玩家", 1)
print(result1)
result2 = play_one_round("张太红", 2, "白涛", 3)
print(result2)
result3 = play_one_round("甲", 3, "乙", 1)
print(result3)
result4 = play_one_round("A", 2, "B", 1)
print(result4)
print(play_one_round("A", 4, "B", 1))
print(play_one_round("张太红", shout_out("随机"), "白涛", shout_out("随机")))
print(play_one_round("张太红", shout_out("老虎"), "白涛", shout_out("虫子")))
print(play_one_round("计算机", shout_out("随机"), "糊涂玩家", shout_out("豹子"), False))
print(play_one_round("计算机", shout_out("随机"), "糊涂玩家", shout_out("豹子")))

# 测试result_probability()函数
result_probability()

# 请别忘记对照评分标准核对你最终完成的程序

下面是完整的代码

# “杠子老虎鸡虫”游戏小项目程序模板

# 该程序的关键点是把“虫子”、“鸡”、“老虎”、“杠子”映射为以下数字:
# 0 - 虫子
# 1 - 鸡
# 2 - 老虎
# 3 - 杠子

import random   # 包含random.randrange(start, stop)函数的模块

# 辅助函数
def name_to_number(name):
    # 用if/elif/else将name转换为对应数字代码,-1表示name无效
    if name == "虫子":
        return 0
    elif name == "鸡":
        return 1
    elif name == "老虎":
        return 2
    elif name == "杠子":
        return 3
    else :
        return -1

def number_to_name(number):
    # 用if/elif/else将数字代码number转换为对应的字符名称,number无效时返回"所喊无效!"
    if number == 0:
        name = "虫子"
    elif number == 1:
        name = "鸡"
    elif number == 2:
        name = "老虎"
    elif number == 3:
        name = "杠子"
    else:
        name = "所喊无效"
    return name

def shout_out(name):
    # name参数可以为“随机”、“杠子”、“老虎”、“鸡”或“虫子”,返回对应喊拳的数字代码
    if name == "随机":
        number = random.randrange(0, 3)
    else:
        number = name_to_number(name)
    return number

def play_one_round(player1_name, player1_code, player2_name, player2_code, print_msg = True):
    #游戏的主要逻辑在该函数中实现
    print_m = ""
    res_ben = 0
    de_code = 0
    play1 = number_to_name(player1_code)
    play2 = number_to_name(player2_code)
    de_code = player1_code - player2_code
    if (player1_code < 0) or (player1_code > 3):
        player1_code = -1
    if (player2_code < 0) or (player2_code > 3):
        player2_code = -1
    if (de_code == 1) or (de_code == -3):
        print_m = player1_name + "获胜!"
        res_ben = 1
    elif (de_code == 0) or (de_code == 2 ) and (player1_code != -1) and (player2_code != -1):
        print_m = player1_name + "和" + player2_name + "打成平手!"
        res_ben = 0
    elif (de_code == -1) or (de_code == 3):
        print_m = player2_name + "获胜!"
        res_ben = 2
    if print_msg == True:
        if player1_code == -1:
            print(player1_name + "所喊无效!")
        elif player2_code == -1:
            print(player2_name + "所喊无效!")
        else:
            mess1 = player1_name + "喊的为:" + play1
            mess2 = player2_name + "喊的为:" + play2
            print(mess1)
            print(mess2)
            print(print_m)
            return res_ben
    elif print_msg == False:
        return res_ben

# 验证概率理论
def result_probability():
    #变量声明及初始化
    play_times = 0           # 对决总次数
    player1_win_times = 0    # 甲方获胜次数
    player1_loss_times = 0   # 甲方失败次数
    tie_times = 0            # 双方平局次数

    # 第1次对决
    result = play_one_round("甲", shout_out("随机"), "乙", shout_out("随机"), False)
    play_times = play_times + 1
    if result == 0:
        tie_times = tie_times + 1
    elif result == 1:
        player1_win_times = player1_win_times + 1
    else:
        player1_loss_times = player1_loss_times + 1

    # 第2次对决
    result = play_one_round("甲", shout_out("随机"), "乙", shout_out("随机"), False)
    play_times = play_times + 1
    if result == 0:
        tie_times = tie_times + 1
    elif result == 1:
        player1_win_times = player1_win_times + 1
    else:
        player1_loss_times = player1_loss_times + 1

    # 第3次对决
    result = play_one_round("甲", shout_out("随机"), "乙", shout_out("随机"), False)
    play_times = play_times + 1
    if result == 0:
        tie_times = tie_times + 1
    elif result == 1:
        player1_win_times = player1_win_times + 1
    else:
        player1_loss_times = player1_loss_times + 1

    # 第4次对决
    result = play_one_round("甲", shout_out("随机"), "乙", shout_out("随机"), False)
    play_times = play_times + 1
    if result == 0:
        tie_times = tie_times + 1
    elif result == 1:
        player1_win_times = player1_win_times + 1
    else:
        player1_loss_times = player1_loss_times + 1

    #你可以在这里添加更多的对决来验证概率理论计算的结果

    player1_win_prob  = player1_win_times / play_times    # 甲方获胜概率
    tie_prob  = tie_times / play_times                    # 双方平局概率
    player1_loss_prob  = player1_loss_times / play_times  # 甲方失败概率
    print("") # 输出空白行
    print("甲乙随机比赛"+str(play_times)+"次,验证对决结果的概率为:")
    print("甲方获胜的概率为:" + str(player1_win_prob))
    print("双方平局的概率为:" + str(tie_prob))
    print("甲方失败的概率为:" + str(player1_loss_prob))


# 以下为测试代码,请在你提交的程序中保留以下代码

# 测试name_to_number()函数
print(name_to_number('虫子'))
print(name_to_number('鸡'))
print(name_to_number('老虎'))
print(name_to_number('杠子'))
print(name_to_number('豹子'))

# 测试number_to_name()函数
print(number_to_name(0))
print(number_to_name(1))
print(number_to_name(2))
print(number_to_name(3))
print(number_to_name(10))

# 测试shout_out()函数
print(shout_out("随机"))
print(shout_out("虫子"))
print(shout_out("鸡"))
print(shout_out("老虎"))
print(shout_out("杠子"))
print(shout_out("棍子"))


# 测试play_one_round()函数
result1 = play_one_round("计算机",1,"玩家",1)
print(result1)
result2 = play_one_round("张太红", 2, "白涛", 3)
print(result2)
result3 = play_one_round("甲", 3, "乙", 1)
print(result3)
result4 = play_one_round("A", 2, "B", 1)
print(result4)
print(play_one_round("A", 4, "B", 1))
print(play_one_round("张太红", shout_out("随机"), "白涛", shout_out("随机")))
print(play_one_round("张太红", shout_out("老虎"), "白涛", shout_out("虫子")))
print(play_one_round("计算机", shout_out("随机"), "糊涂玩家", shout_out("豹子"), False))
print(play_one_round("计算机", shout_out("随机"), "糊涂玩家", shout_out("豹子")))

# 测试result_probability()函数
result_probability()

# 请别忘记对照评分标准核对你最终完成的程序
  • 16
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值