【2017.9.20】硬币游戏—— 代码分析与改进

时间:2022-09-13 16:55:30

软件工程作业2——硬币游戏:代码分析与改进

任务: 

  • Python 程序阅读理解
  • 学习Python 编码风格指南中译版(Google SOC), 改进Python程序
  • 如何设计游戏规则,使得慈善事业可持续。 地铁口放置硬币箱(初始值500硬币),顾客可取、可放。请设计一组规则,使得该钱箱永远有钱取(尽量符合实际)
  • 参考:地铁口钱箱

作业步骤:

  • step 1:fork 老师的仓库

  +硬币游戏:http://git.oschina.net/juking2017/Game.git 将其 fork 到自己的码云仓库。(点击页面右上角的fork就可以了)

  • step2:将自己仓库Game clone 到本地D盘SE
1  $ git clone http://git.oschina.net/yiyanXU/Game.git 
  • step3:运行Python 程序

  首先安装Python软件,去官网下载即可。一般是默认的,安装成功之后,但是在运行的时候会出现问题,因此,还要安装pip.同学分享了一个安装链接http://blog.csdn.net/qy20115549/article/details/52179800,按照这个教程,就可以安装好了。

【2017.9.20】硬币游戏—— 代码分析与改进

   双击IDLE打开之后,单击Flie —open,自己之前克隆下的Game里的SRC文件夹中的GameMain.py ;如下图所示:

【2017.9.20】硬币游戏—— 代码分析与改进

  单击run后结果如下图所示:(每次run后图都有所变化,里面的数据是随机的)

【2017.9.20】硬币游戏—— 代码分析与改进

【2017.9.20】硬币游戏—— 代码分析与改进

  python编码风格中,关于缩进的要求是,空4个,tab和空格不能同时使用,也可以说是不能使用tab。原代码是空格空的不对,修改之后,如下图所示:

 【2017.9.20】硬币游戏—— 代码分析与改进

  • step5:将修改之后的文件commit 并 push 到自己远端的仓库。

【2017.9.20】硬币游戏—— 代码分析与改进

   最后我的码云上的界面是这样的:

【2017.9.20】硬币游戏—— 代码分析与改进

  

 钱箱使用规则

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

将Threshold 调整为 4,得到下图结果

【2017.9.20】硬币游戏—— 代码分析与改进

可以看到图形随着时间而变化很大,变得不持续了。可以看到取硬币的人变多了之后,箱子里的钱变少了。

我上网搜了一下关于地铁口的慈善,投放硬币的,报道最后零钱箱里面一天下来,还是有很多硬币,放硬币的人比拿的人多。

代码是符合现实规律的。但是我代码具体没有做修改,只修改了风格。

 

 附:


1.修改风格之后的程序代码:

 1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 import random
4 import numpy as np
5 import matplotlib.pyplot as plt
6 from matplotlib import mlab
7 from matplotlib import rcParams
8
9
10 # 初始参数设置
11 Box_sum =500 # 箱子中剩余硬币数量,初始值
12 People_Flag= random.randint(1,10) # flag 模拟人们取硬币或放硬币的概率 1~10
13 Threshold = 2.5 # 阈值,可调: 1~Threshold 为取硬币,Threshold+1 ~10 为放硬币
14 Max_TakeCoin=5 # 最多可取硬币数量
15 Max_DonateCoin=1 # 最多可放硬币数量
16
17 delata=0 # 取、放硬币数量
18 Box_per_remain= [500] # 每次箱子中硬币余额,list
19
20
21 # 算法模拟
22 for x in range(1,5000): # 循环次数表示参与人数
23 flag= random.randint(1,10) # flag 模拟人们取硬币或放硬币的概率
24 if flag > Threshold:
25 # 放硬币
26 delta=random.randint(1,Max_DonateCoin)
27 delta=random.randint(1,delta) # 模拟了人们捐款可能性,有偏少的倾向
28 Box_sum =Box_sum + delta
29 Box_per_remain.append(Box_sum)
30 else:
31 # 取硬币
32 delta=random.randint(1,Max_TakeCoin)
33 delta=random.randint(delta,Max_TakeCoin) # 模拟了人 取硬币的可能性,偏多的倾向
34 if Box_sum < delta:
35 Box_sum =0 # 如果不够取,则取光
36 else:
37 Box_sum =Box_sum - delta
38 Box_per_remain.append(Box_sum)
39
40 print(Box_per_remain)
41
42
43 # 绘图区
44 fig = plt.figure()
45
46 ## 1. 标题、X、Y 轴 label
47 plt.title('Subway testing')
48 plt.xlabel('Time')
49 plt.ylabel('Money remained')
50
51 x= np.arange(len(Box_per_remain))
52
53 ## 2. data
54
55 plt.plot(x,Box_per_remain,color='r')
56 plt.bar(x,Box_per_remain,alpha=.5,color='g')
57
58 plt.show()

2. 我的远端仓库的链接

https://gitee.com/yiyanXU/Game