zoukankan      html  css  js  c++  java
  • 【Charpter 2】硬币游戏——代码分析与改进

      今天我们需要完成一个作业叫做“硬币游戏”,通过改进Python程序,按照自己设计的游戏规则来对老师给出的程序进行修改。

    【Step 1】Fork老师的Game项目

    【Step 2】Clone该项目到自己本地主机中的D:SE中

    【Step 3】运行项目中的.py文件,可以得到如图1的结果:

    图1

      ★注意,文件中包含了两个第三方库,直接运行会导致出错,我们在cmd中利用pip指令进行python的第三方库的安装

    pip install numpy
    pip install matplotlib
    

      简单对这两个库进行一下说明,numpy库提供一个ndarray对象,提供了方便的矩阵运算;matplotlib库是一个Python工具箱,用于科学计算的数据可视化,用来将得到的数据进行绘图可视化。

      对于游戏规则,我们先对原规则进行阐述:

        硬币箱使用规则

    1. 在地铁口放置钱箱,内放500枚硬币。
    2. 如需要零钱,可以取其中1~5枚硬币,如果不足所需,则取光。( 取钱倾向多取)
    3. 善良的人可以往其中放置1枚硬币。(放钱倾向少放)

      根据图1中的折线图,我们可以看出,随着投放时间的延长,可使用硬币数呈递减趋势,说明该规则存在问题

      针对游戏规则,我们可以得到两处可以修改的地方。

      ①初始硬币书;②投放硬币与取硬币的人数比例;③取硬币的上限。

    【修改规则一】

      改修初始值为700

    Box_sum =700 

    图2

       之后我们可以相对于500进行左右加减,本人尝试了从0开始,以步长为100进行赋值,发现,只有Money Remained的总数变化,但是随着时间的递增,并不会出现不能持续的情况。所以初始硬币数的改变并不会影响可持续性。

    【修改规则二】

    修改阈值控制变量Threshold的值:

    Threshold = 4.5
    

      其中1~Threshold 为取硬币,Threshold+1 ~10 为放硬币,那么此时我们可以控制存、取硬币的人数的比例,此时为1:1,结果如图3:

    图3

      同样的,修该Threshold的值,我们尝试来修改比例,看看其他结果。

      结果发现,当Threshold大于等于3.5时就会出现不持续现象。

    【修改规则3】

    图4

    图5

      图4、 图5分别是调整了Max_TakeCoin的值,图4为4,图5为3,且此时的Threshold的值为3.5,由第二个修改规则我们可以得到此时的情况Max_TakeCoin为5时应该是不能持续存取硬币的,但是当Max_TakeCoin为3时,我们发现却可以持续进行,不过整体趋势下降。

      由此我们可以看出,当Max_TakeCoin的值发生改变时,同样可以影响该游戏的可持续性。

     

      ★以下给出该游戏规则对应的Python代码:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    import random
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import mlab
    from matplotlib import rcParams
    
    
    # 初始参数设置
    Box_sum =500         # 箱子中剩余硬币数量,初始值
    People_Flag= random.randint(1,10)       # flag 模拟人们取硬币或放硬币的概率 1~10 
    Threshold = 3.5       #  阈值,可调: 1~Threshold 为取硬币,Threshold+1 ~10 为放硬币
    Max_TakeCoin=3       #  最多可取硬币数量
    Max_DonateCoin=1     #  最多可放硬币数量
    
    delata=0                # 取、放硬币数量
    Box_per_remain= [500]   # 每次箱子中硬币余额,list
    
    
    # 算法模拟
    for x in range(1,5000):  # 循环次数表示参与人数
        flag= random.randint(1,10) # flag 模拟人们取硬币或放硬币的概率 
        if flag > Threshold:
            # 放硬币
            delta=random.randint(1,Max_DonateCoin)
            delta=random.randint(1,delta)          # 模拟了人们捐款可能性,有偏少的倾向
            Box_sum =Box_sum + delta
            Box_per_remain.append(Box_sum)
        else:
            # 取硬币
            delta=random.randint(1,Max_TakeCoin)
            delta=random.randint(delta,Max_TakeCoin) # 模拟了人 取硬币的可能性,偏多的倾向
            if Box_sum < delta:
                Box_sum =0                           # 如果不够取,则取光
            else:
                Box_sum =Box_sum - delta
            Box_per_remain.append(Box_sum)
    
    print(Box_per_remain)
    
    
    # 绘图区
    fig = plt.figure()
    
    ## 1. 标题、X、Y 轴 label
    plt.title('Subway testing')
    plt.xlabel('Time')
    plt.ylabel('Money remained')
    
    x= np.arange(len(Box_per_remain))
    
    ## 2. data
    
    plt.plot(x,Box_per_remain,color='r')
    plt.bar(x,Box_per_remain,alpha=.5,color='g')
    
    plt.show()
    

      最后给出本人码云的远端仓库链接 https://gitee.com/Yukine0728/Game

  • 相关阅读:
    FastDFS学习总结(2)--Tracker与Storage配置详解
    FastDFS学习总结(1)--FastDFS安装和部署
    Git学习总结(6)——作为一名程序员这些代码托管工具你都知道吗?
    Git学习总结(6)——作为一名程序员这些代码托管工具你都知道吗?
    ActiveMQ学习总结(8)——消息队列设计精要
    ActiveMQ学习总结(8)——消息队列设计精要
    vnc
    Apache HTTP服务器 2.0版本文档
    SSH登录很慢
    source insight技巧
  • 原文地址:https://www.cnblogs.com/wangao0728/p/7545218.html
Copyright © 2011-2022 走看看