Python實戰!滑雪、貪吃蛇和AI五子棋,附倉庫!

PythonGame倉庫

學了幾天Python,學了GUI庫、Pygame庫,又做一些遊戲了,有貪吃蛇🐍、滑雪❄️和AI對下五子棋🔲

快快快,點贊!好文必點!👍

GIthub倉庫:https://github.com/Github-Programer/PythonGame

🐶客官,點個贊?

⭐️如果覺得對您有幫助的話,點個 star ,再走?

🐱詳細解釋

首先,需要幾個庫,打開cmd,輸入如下命令(如果已經有了,那麼就不用了)

pip install pygame

安裝pygame,如果出錯,可以試試

pip3 install pygame

🐛1$貪吃蛇

我做了一個手動版本,和一個AI版本,AI就是自動尋徑原理,自動的,知道框滿了不會碰邊,但是由於算法不夠精良(BFS廣搜),所以蛇越長速度越慢……🐢
在這裏插入圖片描述
📆主要思路
⏳​(1)蛇每走一步,就使用BFS計算遊戲界面中每個位置(蛇身除外)到達食物的最短路徑長;

⏳​(2)將蛇的安全定義爲蛇是否可以跟着蛇尾運動,即蛇頭和蛇尾間是否存在路徑;

⏳​(3)蛇每次行動前先利用虛擬的蛇進行探路,若虛擬的蛇吃完食物後是安全的,真蛇才行動;

⏳​(4)若蛇和食物之間不存在路徑或者吃完食物後並不安全,就跟着蛇尾走;

⏳​(5)若蛇和食物之間、蛇和蛇尾之間均不存在路徑,就隨便挑一步可行的來走;

(6)保證目標是食物時蛇走最短路徑,目標是蛇尾時蛇走最長路徑。
📆不足之處

由於食物是隨機出現的,若虛擬的蛇跑一遍發現去吃食物是不安全的,真蛇就不會去吃食物,而是選擇追着蛇尾跑,若一直如此,就陷入了死循環,蛇一直追着蛇尾跑跑跑。。。

直到你終止遊戲爲止。。。
在這裏插入圖片描述
倉庫中還有一個簡單版,Normal的,可以手動操作,但是一般走幾步就廢了,控制不住😓

⛄️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。畢竟五子棋先手者優勢巨大,或者說在某些情況/規則下是必勝的。至於原因,在相關文件中提供了兩篇論文,感興趣的可以看看。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章