Pythonプログラムでスクリーンショットの取得とマウス操作ができるようになったので
なんか面白いことやってみよう!!
ってことでマインスイーパ攻略プログラムを作ってみることにしました.

今回はマスの数字の認識が目標です.
戦略としては
1.スクリーンショットを取得
2.マインスイーパ画面を探す(下の画像でマッチング)

3.それぞれのマスに対して数字を調べる(下のテンプレート画像からよくマッチするものを探す)

4.全部まとめると全体がわかる
という感じでコードを書きました.
注目の結果は...
こんな感じ!


完璧ですね!
という訳で次はマインスイーパを解くアルゴリズムを作っていきたいと思います.
ソースコードはここからダウンロードできます
なんか面白いことやってみよう!!
ってことでマインスイーパ攻略プログラムを作ってみることにしました.
今回はマスの数字の認識が目標です.
戦略としては
1.スクリーンショットを取得
2.マインスイーパ画面を探す(下の画像でマッチング)
3.それぞれのマスに対して数字を調べる(下のテンプレート画像からよくマッチするものを探す)
4.全部まとめると全体がわかる
という感じでコードを書きました.
注目の結果は...
こんな感じ!
完璧ですね!
という訳で次はマインスイーパを解くアルゴリズムを作っていきたいと思います.
ソースコードはここからダウンロードできます
#-*- coding: utf-8 -*-
import gtk,cv
import time
import os
width,height=1920,1200
#width,height=500,500
x,y=0,0
class Taiping:
def __init__(self):
self.capture()
def capture(self):
self.pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, width, height)
self.pixbuf.get_from_drawable(gtk.gdk.get_default_root_window(), gtk.gdk.colormap_get_system(), x, y, 0, 0, width, height)
self.step=self.pixbuf.get_rowstride()
self.cv_im = cv.CreateImageHeader((width,height),cv.IPL_DEPTH_8U,3)
cv.SetData(self.cv_im, self.pixbuf.get_pixels(), self.step)
cv.CvtColor(self.cv_im,self.cv_im,cv.CV_BGR2RGB)
def match_title(self):
self.capture()
self.templateTitle = cv.LoadImage("title.png",cv.CV_LOAD_IMAGE_COLOR)
self.matchTitle = cv.CreateImage((self.cv_im.width-self.templateTitle.width+1,self.cv_im.height-self.templateTitle.height+1),32,1)
cv.MatchTemplate(self.cv_im,self.templateTitle,self.matchTitle,cv.CV_TM_CCOEFF_NORMED)
loc = cv.MinMaxLoc(self.matchTitle)
if loc[1] > 0.5 :
#os.system("xte 'mousemove " + str(loc[3][0] + self.template.width/2) + " " + str(loc[3][1] + self.template.height/2) + "'")
self.mine_x = loc[3][0] - 66
self.mine_y = loc[3][1] + 100
# print("xte 'mousemove " + str(loc[3][0] + self.templateTitle.width/2) + " " + str(loc[3][1] + self.templateTitle.height/2) + "'")
self.sub = cv.GetSubRect(self.cv_im, (self.mine_x,self.mine_y, 485, 485))
cv.ShowImage("result", self.sub)
def load_image(self):
self.cell_x_num = 16
self.cell_y_num = 16
self.cell_size = 30
self.template = [cv.LoadImage("0.png",cv.CV_LOAD_IMAGE_COLOR),
cv.LoadImage("1.png",cv.CV_LOAD_IMAGE_COLOR),
cv.LoadImage("2.png",cv.CV_LOAD_IMAGE_COLOR)]
self.match = [ cv.CreateImage((self.cell_size-templ.width+1,self.cell_size-templ.height+1),32,1) for templ in self.template]
def match_cell(self,i,j):
self.cell = cv.GetSubRect(self.sub, (i*30,j*30, 30, 30))
for index,(temple,match) in enumerate(zip(self.template,self.match)):
cv.MatchTemplate(self.cell,temple,match,cv.CV_TM_CCOEFF_NORMED)
loc = cv.MinMaxLoc(match)
if loc[1] > 0.7 :
#os.system("xte 'mousemove " + str(loc[3][0] + self.template.width/2) + " " + str(loc[3][1] + self.template.height/2) + "'")
#print(loc[1])
#print(str(index) + str(i) + "," + str(j))
#cv.ShowImage("test",self.cell)
#cv.WaitKey()
return index
return "*"
#print("xte 'mousemove " + str(loc[3][0] + self.template.width/2) + " " + str(loc[3][1] + self.template.height/2) + "'")
#cv.ShowImage("a",self.cell)
#cv.WaitKey(0)
def main(self):
self.load_image()
self.match_title()
#self.match_first()
while True:
for j in range(self.cell_y_num):
for i in range(self.cell_x_num):
print self.match_cell(i,j),
print ""
cv.WaitKey(0)
break
if __name__ == '__main__':
taip = Taiping()
taip.main()
PR
COMMENT
カレンダー
最新記事
(01/19)
(12/08)
(11/29)
(11/08)
(11/04)
プロフィール
HN:
たるこす
性別:
男性
ブログ内検索
カウンター

