【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

原文地址:https://www.cnblogs.com/wangao0728/p/7545218.html