博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Charpter 2】硬币游戏——代码分析与改进
阅读量:7191 次
发布时间:2019-06-29

本文共 2640 字,大约阅读时间需要 8 分钟。

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

转载于:https://www.cnblogs.com/wangao0728/p/7545218.html

你可能感兴趣的文章
Java培训机构如何选择才能避免被骗?
查看>>
解决浏览器background-image属性不支持css3动画
查看>>
stark组件(11):组合搜索
查看>>
8.:input表单选择器
查看>>
雄联盟工程师独家分享:如何使开发更有效率
查看>>
学习的原动力
查看>>
自动化测试基础篇--Selenium中JS处理滚动条
查看>>
V4L2 API详解 <二> Camera详细设置【转】
查看>>
自动化动态测试的战略优势
查看>>
css基础知识
查看>>
Java8新特性之三:Stream API
查看>>
python调用jar包
查看>>
【Prince2科普】Prince2的七大原则(5)
查看>>
windows下安装MongoDB和可视化工具Robomongo的使用
查看>>
linux内核挂载文件系统的两种方式
查看>>
30个免费下载高质量精美照片素材的网站
查看>>
Memcached深度分析
查看>>
字符编码
查看>>
【实验7】综合练习
查看>>
“System.FormatException”类型的未经处理的异常在 System.IdentityModel.dll 中发生 其他信息: 十六进制字符串格式无效。...
查看>>