今天我们需要完成一个作业叫做“硬币游戏”,通过改进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工具箱,用于科学计算的数据可视化,用来将得到的数据进行绘图可视化。
对于游戏规则,我们先对原规则进行阐述:
硬币箱使用规则
- 在地铁口放置钱箱,内放500枚硬币。
- 如需要零钱,可以取其中1~5枚硬币,如果不足所需,则取光。( 取钱倾向多取)
- 善良的人可以往其中放置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 randomimport numpy as npimport matplotlib.pyplot as pltfrom matplotlib import mlabfrom 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 轴 labelplt.title('Subway testing')plt.xlabel('Time')plt.ylabel('Money remained')x= np.arange(len(Box_per_remain))## 2. dataplt.plot(x,Box_per_remain,color='r')plt.bar(x,Box_per_remain,alpha=.5,color='g')plt.show()
最后给出本人码云的远端仓库链接 https://gitee.com/Yukine0728/Game