python 小游戏_GitHub - Github-Programer/PythonGame: 做一些Python小游戏

octocat.pngPythonGame仓库

学了几天Python,学了GUI库、Pygame库,又做一些游戏了,有贪吃蛇🐍、滑雪❄️和AI对下五子棋🔲

🐶客官,点个赞?

⭐如果觉得对您有帮助的话,点个 star ,再走?

🐱详细解释

首先,需要几个库,打开cmd,输入如下命令(如果已经有了,那么就不用了)

pip install pygame

安装pygame,如果出错,可以试试

pip3 install pygame

🐛1$贪吃蛇

我做了一个手动版本,和一个AI版本,AI就是自动寻径原理,自动的,知道框满了不会碰边,但是由于算法不够精良(BFS广搜),所以蛇越长速度越慢……🐢

68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f32303230303530333132353234303439362e706e673f782d6f73732d70726f636573733d696d6167652f77617465726d61726b2c747970655f5a6d46755a33706f5a57356e6147567064476b2c736861646f775f31302c746578745f6148523063484d364c7939696247396e4c6d4e7a5a473475626d56304c324e76623277354f5463344d513d3d2c73697a655f31362c636f6c6f725f4646464646462c745f3730

📆主要思路

⏳(1)蛇每走一步,就使用BFS计算游戏界面中每个位置(蛇身除外)到达食物的最短路径长;

⏳(2)将蛇的安全定义为蛇是否可以跟着蛇尾运动,即蛇头和蛇尾间是否存在路径;

⏳(3)蛇每次行动前先利用虚拟的蛇进行探路,若虚拟的蛇吃完食物后是安全的,真蛇才行动;

⏳(4)若蛇和食物之间不存在路径或者吃完食物后并不安全,就跟着蛇尾走;

⏳(5)若蛇和食物之间、蛇和蛇尾之间均不存在路径,就随便挑一步可行的来走;

(6)保证目标是食物时蛇走最短路径,目标是蛇尾时蛇走最长路径。

📆不足之处

由于食物是随机出现的,若虚拟的蛇跑一遍发现去吃食物是不安全的,真蛇就不会去吃食物,而是选择追着蛇尾跑,若一直如此,就陷入了死循环,蛇一直追着蛇尾跑跑跑。。。

直到你终止游戏为止。。。

68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f32303230303530333132353433343736352e706e673f782d6f73732d70726f636573733d696d6167652f77617465726d61726b2c747970655f5a6d46755a33706f5a57356e6147567064476b2c736861646f775f31302c746578745f6148523063484d364c7939696247396e4c6d4e7a5a473475626d56304c324e76623277354f5463344d513d3d2c73697a655f31362c636f6c6f725f4646464646462c745f3730

仓库中还有一个简单版,Normal的,可以手动操作,但是一般走几步就废了,控制不住😓

⛄2$滑雪小游戏

📆TOOL

开发工具:Python版本:3.6.4

相关模块:pygame模块;以及一些Python自带的模块。

环境搭建:安装Python并添加到环境变量,pip安装需要的相关模块即可。

📆游戏规则:

玩家通过“AD”键或者“←→”操控前进中的滑雪者,努力避开路上的树,尽量捡到路上的小旗。

如果碰到树,则得分减50,如果捡到小旗子,则得分加10。

📆逐步实现:

⏳Step1:定义精灵类

由于游戏涉及到碰撞检测(滑雪者与树和小旗之间的碰撞),因此我们定义两个精灵类,分别用于代表滑雪者和障碍物(即树和小旗):

68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f32303230303530333133303635323731352e706e673f782d6f73732d70726f636573733d696d6167652f77617465726d61726b2c747970655f5a6d46755a33706f5a57356e6147567064476b2c736861646f775f31302c746578745f6148523063484d364c7939696247396e4c6d4e7a5a473475626d56304c324e76623277354f5463344d513d3d2c73697a655f31362c636f6c6f725f4646464646462c745f3730

其中,滑雪者在前进过程中应当拥有向左,向右偏移的能力,并且在偏移时滑雪者向前的速度应当减慢才更加合乎常理,这样才能供玩家操作。同时,滑雪者应当拥有不同的姿态来表现自己滑行时的状态:

直线:

68747470733a2f2f696d67636f6e766572742e6373646e696d672e636e2f6148523063484d364c79393364336375647a4e6a63324e6f623239734c6d4e754c3246306447466a6147316c626e527a4c326c745957646c4c7a49774d5467774f4441354c7a45314d7a4d344d4463334e5467354e7a41354e544d756347356e3f782d6f73732d70726f636573733d696d6167652f666f726d61742c706e67

左偏一点:

68747470733a2f2f696d67636f6e766572742e6373646e696d672e636e2f6148523063484d364c79393364336375647a4e6a63324e6f623239734c6d4e754c3246306447466a6147316c626e527a4c326c745957646c4c7a49774d5467774f4441354c7a45314d7a4d344d4463334e6a51794e6a55794f4459756347356e3f782d6f73732d70726f636573733d696d6167652f666f726d61742c706e67

左偏很多:

68747470733a2f2f696d67636f6e766572742e6373646e696d672e636e2f6148523063484d364c79393364336375647a4e6a63324e6f623239734c6d4e754c3246306447466a6147316c626e527a4c326c745957646c4c7a49774d5467774f4441354c7a45314d7a4d344d4463344d5441794e4463304e7a51756347356e3f782d6f73732d70726f636573733d696d6167652f666f726d61742c706e67

右偏一点:

68747470733a2f2f696d67636f6e766572742e6373646e696d672e636e2f6148523063484d364c79393364336375647a4e6a63324e6f623239734c6d4e754c3246306447466a6147316c626e527a4c326c745957646c4c7a49774d5467774f4441354c7a45314d7a4d344d4463344d5451314f4455334f5455756347356e3f782d6f73732d70726f636573733d696d6167652f666f726d61742c706e67

右偏很多:

68747470733a2f2f696d67636f6e766572742e6373646e696d672e636e2f6148523063484d364c79393364336375647a4e6a63324e6f623239734c6d4e754c3246306447466a6147316c626e527a4c326c745957646c4c7a49774d5467774f4441354c7a45314d7a4d344d4463344d5467314e4441354d7a67756347356e3f782d6f73732d70726f636573733d696d6167652f666f726d61742c706e67

另外,尽管滑雪者的左右移动通过移动滑雪者本身实现,但是滑雪者的向前移动是通过移动障碍物实现的。

⏳Step2:随机创建障碍物

现在我们需要定义一个随机创建障碍物的函数,以便在游戏主循环中调用:

68747470733a2f2f696d67636f6e766572742e6373646e696d672e636e2f6148523063484d364c79393364336375647a4e6a63324e6f623239734c6d4e754c3246306447466a6147316c626e527a4c326c745957646c4c7a49774d5467774f4441354c7a45314d7a4d344d4463344d6a497a4d444d334e546b75616e426e3f782d6f73732d70726f636573733d696d6167652f666f726d61742c706e67

⏳Step3:游戏主循环

首先我们初始化一些参数:

68747470733a2f2f696d67636f6e766572742e6373646e696d672e636e2f6148523063484d364c79393364336375647a4e6a63324e6f623239734c6d4e754c3246306447466a6147316c626e527a4c326c745957646c4c7a49774d5467774f4441354c7a45314d7a4d344d4463344d6a557a4d6a51344d7a5575616e426e3f782d6f73732d70726f636573733d696d6167652f666f726d61742c706e67

其中障碍物创建两次的目的是便于画面衔接。

然后我们就可以定义主循环了:

68747470733a2f2f696d67636f6e766572742e6373646e696d672e636e2f6148523063484d364c79393364336375647a4e6a63324e6f623239734c6d4e754c3246306447466a6147316c626e527a4c326c745957646c4c7a49774d5467774f4441354c7a45314d7a4d344d4463344d7a49324e4467784f544975616e426e3f782d6f73732d70726f636573733d696d6167652f666f726d61742c706e67

主循环的内容包括:

事件监听、障碍物的更新、碰撞检测以及分数的展示等内容,总之还是很容易实现的。

⏳Step4:其他

开始、结束界面这些,就靠大家自己发挥了,我就写了一个简单的开始界面:

68747470733a2f2f696d67636f6e766572742e6373646e696d672e636e2f6148523063484d364c79393364336375647a4e6a63324e6f623239734c6d4e754c3246306447466a6147316c626e527a4c326c745957646c4c7a49774d5467774f4441354c7a45314d7a4d344d4463344d7a59784d6a6b354f546375616e426e3f782d6f73732d70726f636573733d696d6167652f666f726d61742c706e67

🍟2$AI五子棋

比较愚蠢的AI五子棋。

T_T当然你好好和它下,它还是比较机智的。

让我们愉快地开始吧~~~

📆原理简介

对于五子棋这样的博弈类AI,很自然的想法就是让计算机把当前所有可能的情况都尝试一遍,找到最优的落子点。这里有两个问题:

⏳(1)如何把所有可能的情况都尝试一遍;

⏳(2)如何定量判断某落子点的优劣。

对于第一个问题,其实就是所谓的博弈树搜索,对于第二个问题,其实就是所谓的选择评估函数。评估函数的选取直接决定了AI算法的优劣,其形式也千变万化。可以说,每个评估函数就是一个选手,对不同的棋型每个选手自然有不同的看法和应对措施,当然他们的棋力也就因此各不相同了。

但博弈树搜索就比较固定了,其核心思想无非是让计算机考虑当前局势下之后N步所有可能的情况,其中奇数步(因为现在轮到AI下)要让AI方的得分最大,偶数步要让AI方的得分最小(因为对手也就是人类,也可以选择最优策略)。

当然这样的搜索其计算量是极大的,这时候就需要剪枝来减少计算量。例如下图:

68747470733a2f2f696d67636f6e766572742e6373646e696d672e636e2f6148523063484d364c79393364336375647a4e6a63324e6f623239734c6d4e754c3246306447466a6147316c626e527a4c326c745957646c4c7a49774d5467774f44457a4c7a45314d7a51784e4467774d4459304f546b344e7a4575616e426e3f782d6f73732d70726f636573733d696d6167652f666f726d61742c706e67

其中A代表AI方,P代表人类方。AI方搜索最大值,人类方搜索最小值。因此Layer3的A1向下搜索的最终结果为4,Layer3的A2向下搜索,先搜索Layer4的P3,获得的分值为6,考虑到Layer2的P1向下搜索时取Layer3的A1和A2中的较小值,而Layer3的A2搜索完Layer4的P3时,其值就已经必大于Layer3的A1了,就没有搜索下去的必要了,因此Layer3到Layer4的路径3就可以剪掉了。

上述搜索策略其实质就是:

minimax算法+alpha-beta剪枝算法。

了解了上述原理之后,就可以自己写代码实现了。当然实际实现过程中,我做了一些简化,但万变不离其宗,其核心思想都是一样的。

具体实现过程详见相关文件中的源代码。

📆缺点

速度比较慢,棋子越多,反应越慢,所以说很愚蠢,下了30个的时候电脑烫的不行

📆使用演示

在cmd窗口运行GobangAI.py文件即可。

下面的视频是我和AI的一局对弈,我执黑先行,所以赢的比较轻松T_T。毕竟五子棋先手者优势巨大,或者说在某些情况/规则下是必胜的。至于原因,在相关文件中提供了两篇论文,感兴趣的可以看看。

68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f32303230303530333133313731343833312e706e673f782d6f73732d70726f636573733d696d6167652f77617465726d61726b2c747970655f5a6d46755a33706f5a57356e6147567064476b2c736861646f775f31302c746578745f6148523063484d364c7939696247396e4c6d4e7a5a473475626d56304c324e76623277354f5463344d513d3d2c73697a655f31362c636f6c6f725f4646464646462c745f3730

联系方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值