今天我们需要完成一个作业叫做“硬币游戏”,通过改进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 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