python 免费空间游戏如何解决游戏操作中产生的不便

游戏中的随机概率_python_动态网站制作指南
游戏中的随机概率
来源:人气:2089
o/2015-07/game-random/
这段时间公司开发的上线测试,许多玩家在抽卡时抱怨脸黑,很难抽到所需要的卡牌,而又有一部分玩家反应运气好能连着抽到紫卡,检查了下随机相关逻辑代码,并没有找出问题所在,玩家运气好与坏只是觉得真有可能是概率原因。
测试开服了几天之后,需要开放某个限时抽卡活动,在内部测试时,我们发现玩家反应的问题在限时抽卡中格外明显,尤其是其中最主要的一张稀有卡牌,猜测因为限时抽卡库配置的种类较少,然后就拿该活动来检查了下我们游戏随机机制问题。
5%概率?20次出现一次?
大部分游戏策划使用权值来配置随机概率,因为权值有个好处就是可以在增加随机物品时,可以不对之前的配置进行更改,比如:白卡 30,蓝卡 10,紫卡 10,转为概率即是:白卡 60%,蓝卡 20%,紫卡 20%。
而上述限时抽卡的例子中,我们的权值配置是5和95,模拟50000次随机(使用系统随机函数,如C的rand函数,Python的random库)得到如下结果:
上图绘制的是权值为5的卡牌的随机状态,红色的图是分布图,X轴是出现的次数,Y轴是相同卡牌再次出现的间隔。绿色的图是分布概率图,X轴是间隔数,Y轴是概率。按策划的想法,5%概率应该等同于20次出现一次,那上图很明显并不满足20次出现一次出现规则,实际间隔从近到远呈下坡形状分布,就是说相邻的概率最大,间隔最大超过160,这与玩家所吐槽的抽卡体验是一致的。但50000次随机总共出现了2508次,从统计的意义上来说又是符合5%概率的。所以这个问题,究其原因就是所谓的概率是统计意义上的还是分布意义上的问题。
最原始的实现
我用列表里取元素的方式来模拟20次出现一次,为了方便比较异同,直接随机的方式我也贴上相关代码。
pool = [0]*5 + [1]*95
result = [random.choice(a) for i in xrange(N)]
上面是直接随机的方式,只保证5%概率。
result = []
for i in xrange(N):
if not pool:
pool = [0]*1 + [1]*19
random.shuffle(pool)
result.append(pool[-1])
del pool[-1]
上面是打乱列表,然后依次取元素的方式,保证20次出现一次,而5%概率则是隐含在内的,生成效果如下图。
该图明显跟第一个实现的图不一样,上图表明了间隔基本上是落在[0, 40]的区间内,并且均匀分布在20那条蓝色对称线附近。这个才是最终想要的随机的效果。红色的线是正态分布曲线,是不是很相似?后面我会讲到。
眼尖的会发现在第一个实现中我用的pool是[0]*5 + [1]*95,而第二个实现中我用的是[0]*1 + [1]*19。
这里20次出现一次并不等同于100次出现五次,也是从分布的意义上来说的,100次出现五次是存在5次连续出现的可能。
针对策划的配置,我们需要进行预处理,怎么处理?GCD啊~,5和95的最大公约数是5,所以在第二个实现的代码中我直接使用了1和19。
但这里有个问题,一般策划配置的随机库中肯定有多个物品。权值如果配置的比较随意的话,很可能就导致GCD为1,这样想要实现XX次出现一次就不可行了。比如刚才的权值配置5和95,再加一个权值为11的话,就只能实现111次出现5次。
所以这两种依赖列表的随机方式并不适用,一是需要维护的列表内存会比较大,二是对策划配置方式有过多约束。
更通用更优美的实现
20次出现一次是以20为标准周期,当然不能每次都是间隔20出现,这样就太假了,根本没有随机感受可言,为了模拟随机并可以控制一定的出现频率,我选择正态分布来进行伪随机分布生成,原因是分布会更自然一些。
关于正态分布这里就不详细描述了,只需关心分布的两个参数即可,位置参数为$\mu$、尺度参数为$\sigma$。根据正态分布,两个标准差之内的比率合起来为95%;三个标准差之内的比率合起来为99%。
用上面的例子来定下参数,$\mu=20, \sigma=20/3$,这样每次按正态分布随机,就能得到一个理想的随机分布和概率区间。
C语言标准函数库中只有rand,如何生成符合正态分布的随机数可以参见。这里我直接使用Python中random库中的normalvariate函数,当然gauss函数也是一样的,上说gauss函数会快些,上说gauss是非线程安全函数,所以会快。我自己简单测试了下,在单线程情况下,gauss是会快些,但只是快了一点点而已。
首先,我直接生成权值为5的卡牌的间隔,检验下正态分布的随机效果。
NN = int(N*0.05)
mu, sigma = 20, 20/3.
delta = [int(random.normalvariate(mu, sigma)) for i in xrange(NN)]
这图是不是比第二个实现的图更好看一些,分布也更平滑一些呢。OK,接下来就是替换旧的随机算法了。
细节和优化
刚才说了随机库中会有很多物品,都需要按照各自的权值随机,并各自出现频率符合正态分布。下面我们来说说细节。
wtp = [1.*x/sum(wt) for x in wt]
result = []
p = [random.normalvariate(1./x, 1./x/3.) for x in wtp]
for i in xrange(N):
minp = 1.e9
for j, pp in enumerate(p):
if pp & minp:
result.append(minj)
for j, pp in enumerate(p):
p[j] -= minp
p[minj] = random.normalvariate(1./wtp[minj], 1./wtp[minj]/3.)
这里我使用了统一的随机种子,随机测试了500万次后,所得的结果与多个随机种子差别不大。
简单解释下代码:初始化对所有物品按权值进行正态分布随机,每次取位置最小值的物品(也就是最先出现的),然后其它物品均减去该值,被取出的物品再单独进行一次正态分布随机,再次循环判断位置最小值。
这里,每次都需要对所有物品进行求最小值和减法,都是需要遍历的运算,我们可以有如下优化。
例如:(1,3,4) -& 取1减1, (0,2,3) -& 随机1, (1,2,3),其实我们只是为了保持各物品之间位置的相对顺序即可,将对其它物品的减法变成对自己的加法,操作量级立马从$O(N)$缩为$O(1)$ 。
如上面的例子:(1,3,4) -& 取1, (0,3,4) -& 随机1加1, (2,3,4),这样的操作不会改变物品序列的正确性。
熟悉最小堆的朋友,将查找最小值优化到$O(1)$应该也没啥问题吧。
wtp = [1.*x/sum(wt) for x in wt]
result = []
p = [(random[i].normalvariate(1./x, 1./x/3.), i) for x in wtp]
heapq.heapify(p)
for i in xrange(N):
minp, minj = heapq.heappop(p)
result.append(minj)
heapq.heappush(p, (random[minj].normalvariate(1./wtp[minj], 1./wtp[minj]/3.)+minp, minj))
问题分析和算法实现就到这了,替换进我的游戏里看看什么效果,我已经迫不及待了。
物品测试权值序列[10, 30, 50, 110, 150, 200, 250, 500],随机测试500万次。
第一个实现是只符合统计要求,不符合分布要求。
第二个实现中对权值序列进行了GCD,可以看到只有绿色是符合分布要求的,而蓝色和青色退化成第一种实现。
当然,实现20次出现一次这样的分布伪随机还有其它方法,比如保存一个,每随机一次就加到计数器上,当计数器的值大于或等于1,即必然出现。但这种实现需要计数器,每个玩家每个随机库每个物品都需要这么一个计数器字段,空间上实在太大了。
关于随机种子,除非是全服竞争类资源,不然最好每个玩家有各自的随机种子,否则会造成体验上的误差,比如抽卡、关卡掉落等这些只针对玩家自身的系统随机。服从正态分布的全局随机序列,不同玩家任意取走序列中一段或者一些值,就可能导致对于每个玩家而言,各自取出的随机序列不再服从正态分布。
我只能感叹Python的库太强大了,matplotlib绘制出来的图形也挺漂亮的,感兴趣的童鞋可以查阅。
更多内容请移步
优质网站模板Python游戏后台开发招聘-乐想天地招聘-拉勾网
Python游戏后台开发
经验3-5年 /
大专及以上 /
分享到微信
微信扫一扫,用小程序打开分享
Python游戏后台开发 /
查看原职位详情
职位描述:
我公司福利:岗位基本工资+项目奖金+交通补助300元/月+午餐补助300元/月+外地户口住房补500元/月+生日福利300元+节假日福利+月聚餐+五险一金+年终奖
岗位职责:
1、熟悉项目结构,理清项目各个模块的功能;
2、将游戏开发基类研究透彻,明白当前游戏开发中用户信息,以及各种信息如何获得;
3、熟悉当前的游戏代码逻辑,能够在当前游戏上进行功能性的修改;
4、按照当前的游戏架构,能够根据需求和游戏规则,完成新游戏服务端的开发。并保证代码严谨性与高可用性。
岗位职责:
1、游戏服务器开发经验3年以上,熟悉socket与http的原理,了解并使用过至少一种Python Web框架;
2、熟悉数据库操作,有PostgreSQL实际项目使用、优化经验,了解 NoSQLs(Redis,mongoDB等);
3、了解或使用过 Twisted、Tornado、Gevent异步框架;
4、熟悉Linux,Nginx,MySQL 等的安装、配置、调试;
5、了解网站分布式架构,MySQL 主从,集群;
6、熟悉设计模式,掌握面向对象开发思想,熟悉常用的数据结构和算法;
7、学习能力强,有良好的编程习惯,注重代码效率,能够编写规范,优质与高效的代码;
8、从事休闲小游戏开发,(例如QQ斗地主游戏)有多年经验者优先。
- 东四环中路大成国际中心写字楼
职位发布者:
行政人事经理
1个月内职位发布者回复聊天的占比
回复率--& 用时--
7日内职位发布者简历处理的效率
处理率100%& 用时3天
1个月内职位发布者最活跃时段统计
--点最活跃
不需要融资
推荐公司:
推荐城市:
在拉勾,发现新的职业机会
我们已将激活邮件发送至:
,请点击邮件内的链接完成验证。
简历已经成功投递出去了,请静候佳音!
快来领取每日奖励,轻松提升投递次数& &
请选择你要投出去的简历:
在线简历:
在线简历还不完善,请完善后选择投递
附件简历:
暂无附件简历
你的简历中:
学历、工作年限、期望工作城市
与该职位要求不匹配,确认要投递吗?
投递失败:今日你已投递
10 个职位,投递数达到上限。
快来领取每日奖励,轻松提升投递次数。
请上传标准格式的word简历
操作说明:
打开需要上传的文件 - 点击文件另存为 - 选择.docx - 保存
支持word、pdf、ppt、txt、wps格式文件
文件大小需小于10M
注:若从其它网站下载的word简历,请将文件另存为.docx格式后上传
简历上传成功!
你可以将简历投给你中意的公司了。
上传文件大小超出限制
单个附件不能超过10M,请重新选择附件简历!
你还没有可以投递的简历呢
请上传附件简历或填写在线简历后再投递吧~
请选择你要投出去的简历:
在线简历:
在线简历还不完善,请完善后选择投递
附件简历:
暂无附件简历
详情描述:
还可输入 500 字
你的举报已经成功提交,拉勾网会尽快核实举报内容,对违规职位绝不姑息。
你已经举报过该职位,不能重复举报。
不想结识该职位的Leader吗?
你已成功收藏该职位
3月9日当天可进入“”页快速投递简历使用 Python 和 Asyncio 编写在线多人游戏(三)
在这个系列中,我们基于多人游戏
来制作一个异步的 Python 程序。上一篇文章聚焦于上,而本系列第 1 部分则涵盖了如何。
4、制作一个完整的游戏
4.1 工程概览
在此部分,我们将回顾一个完整在线游戏的设计。这是一个经典的贪吃蛇游戏,增加了多玩家支持。你可以自己在 () 亲自试玩。源码在 GitHub 的这个。游戏包括下列文件:
- 处理主游戏循环和连接。
- 主要的 Game 类。实现游戏的逻辑和游戏的大部分通信协议。
- Player 类,包括每一个独立玩家的数据和蛇的展现。这个类负责获取玩家的输入并相应地移动蛇。
- 基本数据结构。
- 游戏设置,在注释中有相关的说明。
- 客户端所有的 html 和 javascript代码都放在一个文件中。
4.2 游戏循环内窥
多人的贪吃蛇游戏是个用于学习十分好的例子,因为它简单。所有的蛇在每个帧中移动到一个位置,而且帧以非常低的频率进行变化,这样就可以让你就观察到游戏引擎到底是如何工作的。因为速度慢,对于玩家的按键不会立马响应。按键先是记录下来,然后在一个游戏循环迭代的最后计算下一帧时使用。
现代的动作游戏帧频率更高,而且通常服务端和客户端的帧频率是不相等的。客户端的帧频率通常依赖于客户端的硬件性能,而服务端的帧频率则是固定的。一个客户端可能根据一个游戏&嘀嗒&的数据渲染多个帧。这样就可以创建平滑的动画,这个受限于客户端的性能。在这个例子中,服务端不仅传输物体的当前位置,也要传输它们的移动方向、速度和加速度。客户端的帧频率称之为 FPS(每秒帧数(frames per second)),服务端的帧频率称之为 TPS(每秒滴答数(ticks per second))。在这个贪吃蛇游戏的例子中,二者的值是相等的,在客户端显示的一帧是在服务端的一个&嘀嗒&内计算出来的。
我们使用类似文本模式的游戏区域,事实上是 html 表格中的一个字符宽的小格。游戏中的所有对象都是通过表格中的不同颜色字符来表示。大部分时候,客户端将按键的码发送至服务端,然后每个&滴答&更新游戏区域。服务端一次更新包括需要更新字符的坐标和颜色。所以我们将所有游戏逻辑放置在服务端,只将需要渲染的数据发送给客户端。此外,我们通过替换通过网络发送的数据来减少游戏被破解的概率。
4.3 它是如何运行的?
这个游戏中的服务端出于简化的目的,它和例子 3.2 类似。但是我们用一个所有服务端都可访问的 Game 对象来代替之前保存了所有已连接 websocket 的全局列表。一个 Game 实例包括一个表示连接到此游戏的玩家的 Player 对象的列表(在 self._players 属性里面),以及他们的个人数据和 websocket 对象。将所有游戏相关的数据存储在一个 Game 对象中,会方便我们增加多个游戏房间这个功能&&如果我们要增加这个功能的话。这样,我们维护多个 Game 对象,每个游戏开始时创建一个。
客户端和服务端的所有交互都是通过编码成 json 的消息来完成。来自客户端的消息仅包含玩家所按下键码对应的编号。其它来自客户端消息使用如下格式:
[command, arg1, arg2, ... argN ]
来自服务端的消息以列表的形式发送,因为通常一次要发送多个消息 (大多数情况下是渲染的数据):
[[command, arg1, arg2, ... argN ], ... ]
在每次游戏循环迭代的最后会计算下一帧,并且将数据发送给所有的客户端。当然,每次不是发送完整的帧,而是发送两帧之间的变化列表。
注意玩家连接上服务端后不是立马加入游戏。连接开始时是观望者(spectator)模式,玩家可以观察其它玩家如何玩游戏。如果游戏已经开始或者上一个游戏会话已经在屏幕上显示 &game over& (游戏结束),用户此时可以按下 &Join&(参与),来加入一个已经存在的游戏,或者如果游戏没有运行(没有其它玩家)则创建一个新的游戏。后一种情况下,游戏区域在开始前会被先清空。
游戏区域存储在 Game._field 这个属性中,它是由嵌套列表组成的二维数组,用于内部存储游戏区域的状态。数组中的每一个元素表示区域中的一个小格,最终小格会被渲染成 html 表格的格子。它有一个 Char 的类型,是一个 namedtuple ,包括一个字符和颜色。在所有连接的客户端之间保证游戏区域的同步很重要,所以所有游戏区域的更新都必须依据发送到客户端的相应的信息。这是通过 Game.apply_render() 来实现的。它接受一个 Draw 对象的列表,其用于内部更新游戏区域和发送渲染消息给客户端。
我们使用 namedtuple 不仅因为它表示简单数据结构很方便,也因为用它生成 json 格式的消息时相对于 dict 更省空间。如果你在一个真实的游戏循环中需要发送复杂的数据结构,建议先将它们序列化成一个简单的、更短的格式,甚至打包成二进制格式(例如 bson,而不是 json),以减少网络传输。
Player 对象包括用 deque 对象表示的蛇。这种数据类型和 list 相似,但是在两端增加和删除元素时效率更高,用它来表示蛇很理想。它的主要方法是 Player.render_move(),它返回移动玩家的蛇至下一个位置的渲染数据。一般来说它在新的位置渲染蛇的头部,移除上一帧中表示蛇的尾巴的元素。如果蛇吃了一个数字变长了,在相应的多个帧中尾巴是不需要移动的。蛇的渲染数据在主类的 Game.next_frame() 中使用,该方法中实现所有的游戏逻辑。这个方法渲染所有蛇的移动,检查每一个蛇前面的障碍物,而且生成数字和&石头&。每一个&嘀嗒&,game_loop() 都会直接调用它来生成下一帧。
如果蛇头前面有障碍物,在 Game.next_frame() 中会调用 Game.game_over()。它后通知所有的客户端那个蛇死掉了 (会调用 player.render_game_over() 方法将其变成石头),然后更新表中的分数排行榜。Player 对象的 alive 标记被置为 False,当渲染下一帧时,这个玩家会被跳过,除非他重新加入游戏。当没有蛇存活时,游戏区域会显示 &game over& (游戏结束)。而且,主游戏循环会停止,设置 game.running 标记为 False。当某个玩家下次按下 &Join& (加入)时,游戏区域会被清空。
在渲染游戏的每个下一帧时也会产生数字和石头,它们是由随机值决定的。产生数字或者石头的概率可以在 settings.py 中修改成其它值。注意数字的产生是针对游戏区域每一个活的蛇的,所以蛇越多,产生的数字就越多,这样它们都有足够的食物来吃掉。
4.4 网络协议
从客户端发送消息的列表:
命令参数描述
new_player
设置玩家的昵称
玩家加入游戏
从服务端发送消息的列表:
命令参数描述
给一个玩家指定 ID
[[(char, color), ...], ...]
初始化游戏区域(世界地图)
reset_world
清除实际地图,替换所有字符为空格
[x, y, char, color]
在某个位置显示字符
[id, name, color, score]
新玩家加入游戏
p_gameover
某个玩家游戏结束
[id, score]
给某个玩家计分
top_scores
[[name, score, color], ...]
更新排行榜
典型的消息交换顺序:
客户端 -& 服务端服务端 -& 客户端服务端 -& 所有客户端备注
new_player
名字传递给服务端
初始化传递的世界地图
top_scores
收到传递的排行榜
玩家按下&Join&,游戏循环开始
reset_world
命令客户端清除游戏区域
render, render, ...
第一个游戏&滴答&,渲染第一帧
(key code)
玩家按下一个键
render, render, ...
渲染第二帧
蛇吃掉了一个数字
render, render, ...
渲染第三帧
... 重复若干帧 ...
p_gameover
试着吃掉障碍物时蛇死掉了
top_scores
更新排行榜(如果需要更新的话)
说实话,我十分享受 Python 最新的异步特性。新的语法做了改善,所以异步代码很容易阅读。可以明显看出哪些调用是非阻塞的,什么时候发生 greenthread 的切换。所以现在我可以宣称 Python 是异步编程的好工具。
SnakePit 在 7WebPages 团队中非常受欢迎。如果你在公司想休息一下,不要忘记给我们在
留下反馈。
作者: 译者: 校对:
原创编译, 荣誉推出
(题图来自:)
共计翻译: 6.0 篇
| 共计贡献: 121 天
贡献时间: -&
04%-05%-14%-26%-57%-91%
说实话,我十分享受 Python 最新的异步特性。新的语法做了改善,所以异步代码很容易阅读。可以明显看出哪些调用是非阻塞的,什么时候发生 greenthread 的切换。所以现在我可以宣称 Python 是异步编程的好工具。
上一篇:下一篇:
评论功能关闭
根据国家法律法规要求,本站暂时关闭文章评论功能。开放时间不确定。我们将谋求一种可以让大家更好的发表意见的方式。
根据国家法律法规要求,只有实名认证后才可以发表评论。
分享到微信
打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。
请将我们加入您的广告过滤器的白名单,请支持开源站点。谢谢您。您的位置: >
> python游戏编程快速上手 斯维加特pdf扫描版
python游戏编程快速上手 斯维加特pdf扫描版
软件大小:18.22M
软件语言:简体中文
软件类型:国产软件
软件授权:免费软件
更新时间:
软件类别:电子阅读
软件官网:
应用平台:Windows10, Windows8, Windows7, WinVista, Win2003, WinXP, Win2000
网友评分:5分
python游戏编程快速上手是一本Python游戏编程的初学者指南,由美国程序员斯维加特Al Sweigart编著。本书将通过编写一个个小巧、有趣的游戏来教授Python编程。全书共包含了14个游戏程序和示例,贯穿其中,介绍了Python基础知识、数据类型、函数、流程控制、程序调试、流程图、字符串操作、列表和字典、图形和动画、碰撞检测、声音和图像等方方面面的知识,能够适合不同年龄和层次的Python编程初学者阅读,欢迎免费下载。内容介绍Python是一种高级程序设计语言,因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。《python游戏编程快速上手》通过编写一个个小巧、有趣的游戏来教授Python编程,并且采用直接展示了游戏的源代码,通过实例来解释编程的原理的方式。全书共21章,14个游戏程序和示例贯穿其中,介绍了Python基础知识、数据类型、函数、流程控制、程序调试、流程图设计、字符串操作、列表和字典、图形和动画、碰撞检测、声音和图像等方方面面的程序设计知识。本书可以帮助读者在轻松有趣的过程中,掌握Python游戏编程的基本技能。python游戏编程快速上手章节目录第1章 安装Python 1
1.1 下载和安装Python 1
1.2 启动IDLE 2
1.3 如何使用本书 3
1.4 寻求在线帮助 4
第2章 交互式shell 6
2.1 一些简单的数学知识 6
2.2 计算表达式 7
2.4 本章小结 12
第3章 编写程序 13
3.1 字符串 13
3.2 字符串连接 14
3.3 在IDLE的文件编辑器中编写程序 14
3.4 Hello World! 15
3.5 保存程序 16
3.6 打开保存过的程序 16
3.7 “Hello World”程序如何工作 18
3.8 变量名称 20
3.9 本章小结 21
第4章 “猜数字”游戏 22
4.1 “猜数字”游戏的运行示例 22
4.2 “猜数字”游戏的源代码 23
4.3 import语句 24
4.4 random.randint()函数 25
4.5 循环 26
4.6 语句块 26
4.7 布尔数据类型 27
4.8 比较操作符 28
4.9 条件 28
4.10 =和==的区别 30
4.11 while循环语句 30
4.12 使用int()函数、float()函数、str()
函数和bool()函数来转换值 31
4.14 if语句 33
4.15 用break语句提早离开循环 34
4.16 流程控制语句 36
4.17 本章小结 36
第5章 Jokes 38
5.1 用好print()函数 38
5.2 Jokes游戏的运行示例 38
5.3 Jokes游戏的源代码 38
5.4 转义字符 39
5.5引号和双引号 40
5.6 print()的end关键字参数 41
5.7 本章小结 42
第6章 Dragon Realm 43
6.1 函数 43
6.2 如何玩“Dragon Realm” 43
6.3 Dragon Realm游戏的运行示例 44
6.4 Dragon Realm的源代码 44
6.5 def语句 46
6.6 布尔操作符 47
6.7 返回值 51
6.8 全局作用域和局部作用域 51
6.9 形参(parameter) 53
6.10 设计游戏 56
6.11 本章小结 57
第7章 使用调试器 58
7.1 Bug! 58
7.2 调试器 59
7.3 单步执行 61
7.4 查找Bug 63
7.5 断点 66
7.6 使用断点的示例 67
7.7 本章小结 68
第8章 流程图 69
8.1 如何玩Hangman 69
8.2 Hangman的运行示例 69
8.3 ASCII字符图 71
8.4 用流程图来设计一个程序 71
8.5 生成流程图 73
8.6 本章小结 79
第9章 Hangman 81
9.1 Hangman的源代码 81
9.2 多行字符串 86
9.3 常量 86
9.4 列表 86
9.5 方法 91
9.6 字符串方法lower()和upper() 91
9.7 列表方法reverse()和append() 92
9.8 列表方法split() 93
9.9 range()函数和list()函数 95
9.10 for循环 96
9.11 切片 98
9.12 elif (“Else If”)语句 101
9.13 本章小结 108
第10章 Hangman扩展 109
10.1 字典 110
10.2 random.choice()函数 113
10.3 多变量赋值 114
10.4 本章小结 116
第11章 Tic Tac Toe 117
11.1 Tic Tac Toe的运行示例 117
11.2 Tic Tac Toe的源代码 118
11.3 设计程序 123
11.4 游戏AI 124
11.5 引用 129
11.6 短路求值 137
11.7 None值 140
11.8 本章小结 146
第12章 Bagels 147
12.1 Bagels的运行示例 147
12.2 Bagels的源代码 148
12.3 random.shuffle()函数 151
12.4 复合赋值操作符 153
12.5 列表方法sort() 154
12.6 字符串方法join() 155
12.7 字符串插值 157
12.8 本章小结 160
第13章 笛卡尔坐标 161
13.1 网格和笛卡尔坐标 161
13.2 负数 163
13.3 数学技巧 164
13.4 绝对值和abs()函数 166
13.5 计算机屏幕的坐标系 167
13.6 本章小结 167
第14章 Sonar Treasure Hunt 168
14.1 Sonar Treasure Hunt的
运行示例 169
14.2 Sonar Treasure Hunt的源代码 173
14.3 设计程序 179
14.4 找到最近的藏宝箱的算法 185
14.5 列表方法remove() 187
14.6 本章小结 195
第15章 Caesar Cipher 196
15.1 密码学 196
15.2 凯撒密码 197
15.3 ASCII码以及用数字表示字母 198
15.4 函数chr()和ord() 199
15.5 凯撒密码的运行示例 200
15.6 Caesar Cipher的源代码 201
15.7 代码如何工作 202
15.8 字符串方法isalpha() 204
15.9 字符串方法isupper()和
islower() 205
15.10 暴力破解 207
15.11 本章小结 209
第16章 Reversi 210
16.1 Reversi的运行示例 211
16.2 Reversi的源代码 215
16.3 代码如何工作 223
16.4 bool()函数 231
16.5 本章小结 244
第17章 Reversi AI模拟 245
17.1 让计算机和自己下棋 245
17.2 百分数 250
17.3 round()函数 251
17.4 AISim2.py的运行示例 252
17.5 比较不同的AI算法 252
17.6 本章小结 259
第18章 图形和动画 260
18.1 安装Pygame 260
18.2 Pygame中的Hello World 261
18.3 Hello World的源代码 261
18.4 运行Hello World程序 263
18.5 元组 264
18.6 RGB颜色 265
18.7 字体和pygame.font.SysFont()
18.8 属性 267
18.9 构造函数 269
18.10 Pygame的绘制函数 269
18.11 事件和游戏循环 272
18.12 动画 273
18.13 Animation程序的源代码 274
18.14 Animation程序如何工作 276
18.15 运行程序循环 279
18.16 本章小结 282
第19章 碰撞检测与鼠标/键盘的输入 284
19.1 Collision Detection程序的
源代码 284
19.2 Collision Detection算法 288
19.3 当遍历一个列表的时候,
不要修改该列表 292
19.4 键盘输入程序的源代码 293
19.5 colliderect()方法 300
19.6 本章小结 301
第20章 声音和图像 302
20.1 声音文件和图像文件 303
20.2 精灵和声音程序 303
20.3 Sprites and Sounds程序的
源代码 304
20.4 pygame.transform.scale()函数 308
20.5 本章小结 311
第21章 Dodger 312
21.1 回顾Pygame的基本数据类型 312
21.2 Dodger的源代码 313
21.3 全屏模式 322
21.4 游戏循环 325
21.5 事件处理 325
21.6 move_ip()方法 328
21.7 pygame.mouse.set_pos()函数 331
21.8 修改Dodger游戏 335
21.9 本章小结 335
使用说明1、下载并解压,得出pdf文件2、如果打不开本文件,请务必下载3、安装后,在打开解压得出的pdf文件4、双击进行阅读
python游戏编程快速上手 斯维加特pdf扫描版
高速下载通道
其它下载地址
感谢您对多多软件站的信任,请把这份信任分享给您的朋友!
您的评论需要经过审核才能显示!
软件排行榜
11.6M / 简体中文 /6.2分
69M / 简体中文 /7.7分
58M / 简体中文 /4.3分
54.52M / 简体中文 /5分
15.8M / 简体中文 /6.7分
21M / 简体中文 /5分
59.85M / 简体中文 /6分
61M / 简体中文 /6分
1.4M / 简体中文 /6.7分
11M / 简体中文 /8.6分
Copyright (C)
www.ddooo.com. All rights reserved.

我要回帖

更多关于 不便英文 的文章

 

随机推荐