/PythonGame

做一些Python小游戏

Primary LanguagePython

:octocat:PythonGame仓库

学了几天Python,学了GUI库、Pygame库,又做一些游戏了,有贪吃蛇:snake:、滑雪:snowflake:和AI对下五子棋:black_square_button:

GIthub仓库:https://github.com/Github-Programer/PythonGame

🐶客官,点个赞?

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

🐱详细解释

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

pip install pygame

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

pip3 install pygame

🐛1$贪吃蛇

我做了一个手动版本,和一个AI版本,AI就是自动寻径原理,自动的,知道框满了不会碰边,但是由于算法不够精良(BFS广搜),所以蛇越长速度越慢……:turtle: 在这里插入图片描述 📆主要思路 ⏳(1)蛇每走一步,就使用BFS计算游戏界面中每个位置(蛇身除外)到达食物的最短路径长;

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

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

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

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

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

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

直到你终止游戏为止。。。 在这里插入图片描述 仓库中还有一个简单版,Normal的,可以手动操作,但是一般走几步就废了,控制不住:sweat:

⛄2$滑雪小游戏

📆TOOL 开发工具:Python版本:3.6.4

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

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

📆游戏规则:

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

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

📆逐步实现:

⏳Step1:定义精灵类

由于游戏涉及到碰撞检测(滑雪者与树和小旗之间的碰撞),因此我们定义两个精灵类,分别用于代表滑雪者和障碍物(即树和小旗): 在这里插入图片描述 其中,滑雪者在前进过程中应当拥有向左,向右偏移的能力,并且在偏移时滑雪者向前的速度应当减慢才更加合乎常理,这样才能供玩家操作。同时,滑雪者应当拥有不同的姿态来表现自己滑行时的状态:

直线:

img

左偏一点:

img

左偏很多:

img

右偏一点:

img

右偏很多:

img

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

⏳Step2:随机创建障碍物

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

img

⏳Step3:游戏主循环

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

img

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

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

img

主循环的内容包括:

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

⏳Step4:其他

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

img

🍟2$AI五子棋

比较愚蠢的AI五子棋。

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

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

📆原理简介

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

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

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

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

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

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

img

其中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。毕竟五子棋先手者优势巨大,或者说在某些情况/规则下是必胜的。至于原因,在相关文件中提供了两篇论文,感兴趣的可以看看。 在这里插入图片描述

联系方式