用Python讓小恐龍突破天際吧!
講者: 楊平
PIL(Python Imagine Library)是一套處理圖片的Python套件
mss(multiple screenshots)
from PIL import Image
import mss
with mss.mss() as sct:
box = {'top': 0, 'left': 0, 'width': 300, 'height': 300}
sct_img = sct.grab(box)
image = Image.frombytes('RGB', sct_img.size, sct_img.bgra, 'raw', 'BGRX')
image.show()
file = open('demo.py', 'r', encoding='UTF-8')
try:
for line in file:
print(line, end='')
except:
print('讀取檔案發生錯誤')
finally:
file.close()
等同於
with open('demo.py', 'r', encoding='UTF-8') as file:
for line in file:
print(line, end='')
with ... as ... 用法
pip install pillow
pip install pyautogui==0.9.39
pip install mss
Chrome網址列輸入chrome://dino
當分數可被700整除時進入夜晚模式
過了200之後重回白天模式
日夜中間會有一段灰階的漸層
日夜地板會有一段小小的高低差
月亮會變喔!
小恐龍會越跑越快,但有個速度上限
大約在1500達到極速
可以透過每100閃爍過後的數字來確認速度
在地上按下方向鍵「下」蹲下躲避中間的鳥
在半空中按下方向鍵「下」可急速下墜
將runner-canvas寬度調整為600
可用F12開發者工具調整
先建立一個字典coordinates,存放開始按鈕的座標(用小畫家觀察座標位置)
並用pyautogui在該座標按下滑鼠
from PIL import ImageGrab, Image
import pyautogui
cordinates = {
'replayBtn': (303, 356)
}
def startGame():
pyautogui.click(cordinates['replayBtn'])
利用PIL抓取前方區域,並判斷該區域有無障礙物
抓取範圍應為地板與最高的鳥之間(注意翅膀)
大約是頭頂至地板上方一點點即可
設定小恐龍鼻頭上方座標,作為參考
cordinates = {
'replayBtn': (303, 356),
'dino': (86, 360)
}
def imageGrab():
with mss.mss() as sct:
box = {'top': cordinates['dino'][1], 'left': cordinates['dino'][0]+70,
'width': 50, 'height': 40}
sct_img = sct.grab(box)
image = Image.frombytes('RGB', sct_img.size, sct_img.bgra, 'raw', 'BGRX')
bwImage = image.convert('1')
return list(bwImage.getdata()).count(0)
抓取區域函式,調整框起來的數值可決定甚麼時候跳躍
目前看起來已經可以穩穩地度過第一天了,但有幾個問題
到了晚上會發瘋
def imageGrab():
# ...
grayImage = image.convert('L')
return len(grayImage.getcolors())
while True:
if(imageGrab() > 1):
pressSpace()
如果多於一種顏色就跳
利用判斷"顏色種類"的方式決定要不要跳,如果前方有障礙物,裡面的顏色一定不只一種
中間的鳥躲得有點驚險
在地上時保持低頭避開中間飛來的鳥
調整偵測區域高度,不要碰到中間的鳥
def imageGrab():
with mss.mss() as sct:
box = {'top': cordinates['dino'][1]+39, 'left': cordinates['dino'][0]+70,
'width': 50, 'height': 1}
sct_img = sct.grab(box)
image = Image.frombytes('RGB', sct_img.size, sct_img.bgra, 'raw', 'BGRX')
grayImage = image.convert('L')
return len(grayImage.getcolors())
中間的鳥躲得有點驚險
在startGame裡面加上這段,讓遊戲一開始小恐龍就低頭
def startGame():
pyautogui.click(cordinates['replayBtn'])
pyautogui.keyDown('down')
中間的鳥躲得有點驚險
def pressSpace(airtime):
pyautogui.keyUp('down')
pyautogui.keyDown('space')
pyautogui.keyUp('space')
time.sleep(airtime)
pyautogui.keyDown('down')
每次跳躍前要先放開向下鍵,經過一段airtime(滯空時間之後再按回去
import time
引入時間模組,定義滯空時間
airtime = 0.14
速度漸增到後面會來不及反應
利用極速下墜,讓反映更靈敏
速度漸增到後面會來不及反應
每隔一段時間縮短airtime
airtime = 0.15
lastTime = time.time()
startGame()
while True:
if time.time() - lastTime >= 5:
airtime -= 0.01
lastTime = time.time()
if(imageGrab() > 1):
pressSpace()
10
lastTime
11
time.time()
12
13
14
15
10
10
10
10
1
2
3
4
5
15
=
-
16
17
18
19
20
15
15
15
15
15
1
2
3
4
5
20
速度漸增到後面會來不及反應
每隔一段時間增加偵測範圍,讓牠早點起跳
airtime = 0.15
lastTime = time.time()
offset = 0
startGame()
while True:
if time.time() - lastTime >= 5:
airtime -= 0.01
offset += 5
lastTime = time.time()
if(imageGrab() > 1):
pressSpace()
def imageGrab():
with mss.mss() as sct:
box = {'top': cordinates['dino'][1]+39, 'left': cordinates['dino'][0]+70,
'width': 50 + offset, 'height': 1}
sct_img = sct.grab(box)
image = Image.frombytes('RGB', sct_img.size, sct_img.bgra, 'raw', 'BGRX')
grayImage = image.convert('L') # 改為灰階
return len(grayImage.getcolors())
速度漸增到後面會來不及反應
aritime最多減至0,不可為負的
while True:
if time.time() - lastTime >= 5:
if airtime - 0.01 >= 0:
airtime -= 0.01
offset += 5
lastTime = time.time()
if(imageGrab() > 1):
pressSpace()
offset也不能無限制增加
while True:
if time.time() - lastTime >= 5:
if airtime - 0.01 >= 0:
airtime -= 0.01
if offset <= 140:
offset += 5
lastTime = time.time()
if(imageGrab() > 1):
pressSpace()
以下純屬個人有限之淺見,有錯請見諒
專家系統
狗: 汪汪叫、沒有花紋
貓: 喵喵叫、有花紋
"我看到一個有花紋會喵喵叫的東西,那是甚麼?"
類神經網路
類神經網路
細胞本體
軸突
突觸
樹突
類神經網路
可用來解決線性不可分離問題
資料
特徵擷取
模型
利用iris set製作iris模型
大概
填個問卷,讓我們更好
多多來上課才不會被AI取代喔XD
我們在招新人喔!