一步一步實現五子棋5

2021-06-19 15:07:37 字數 1554 閱讀 6864

前面弱智版五子棋雖然實現了讓電腦下棋,但是完全沒有思考能力。下面我們就來為電腦提公升智力,學會思考後再下棋。

計算機的思考能力體現在對盤面的分析上,通過分析可能形成的盤面,從中選擇最優結果,形成這個最優結果的著法即為計算機本次的選擇。盤面分析的過程就是查詢能形成五連珠的棋形,每種棋形賦予一定的分數,分數最高的盤面即為最佳盤面。下面是我總結的一些基本棋形(x表示黑子o表示白子-表示空格:

成五:***xx,形成這種棋形時即可分出勝負,賦予極高值。

活四:-***x-、x-***-x,這種棋形一旦形成,將無法防守,先手必勝,後手除了對方立刻成五也必勝。

衝四:o***x- 、o***-x、oxx-xx,這種棋形形成,先手必勝,後手對方必須防守。

活三:-***-、-x-xx-,這種棋形形成後,先手可成活四,後手對方必須防守,除非對方已經有活

四、衝四等棋形,否者必勝。

衝三:o***--、oxx-x-、ox-xx-,這種棋形可先手成衝四,雖然不是能立即獲勝的棋形,但一次或多次衝四後極可能形成良好的局面。

活二:--xx--、--x-x--,這種棋形是獲勝的開始,有贏棋始於活二的說法,活二對後續的發展非常關鍵。

後面還有衝二,活一等棋形,這裡就不一一介紹了。對這些棋形賦予恰當的分數,可更加真實的反應出盤面的優劣。

使用者落子後,每次都掃面整個棋盤,這樣的效率顯得比較低。事實上,新落子只會影響該點在棋盤上四個方向上的價值。因此我們可以將棋盤按照橫、縱、斜、反斜向的線用下面的結構體表示:

struct chess_line         ;

陣列point[15]用來儲存每條線上的棋子情況,二維陣列mode用來儲存黑棋和白棋在該條線上的特定棋形的數量。每次落子或者回退後時,重新分析該點所在的四條線上的棋形。在分析盤面時,只需要統計棋盤上所有線上的棋形形成的分數後即可。

電腦在選擇下乙個落子點時,先遍歷每乙個有效的落子點,模擬落子後分析棋盤的價值。選擇所有可能落子中棋盤分數最高的點,該點就是電腦選擇的點。

void engine::thinking()

map::iterator itor = spacelist.begin();

chess_point *bestpoint = null;

int bestvalue = -100000000;

int tempvalue = 0;

while(itor != spacelist.end())

removechess(itor->second->x, itor->second->y);

itor++;

}aidown(bestpoint->x, bestpoint->y);

}addchess和removechess分別是分析落子點和回退點影響的線上的價值,calculatestore即統計整個盤面的價值。由於**量較大,就不一一貼出來了。這樣乙個簡單的ai就做好了。多的不說了,線看看效果吧。

看,是不是下的有模有樣了,一不小心還被它贏了一盤。不過基本版的五子棋智力還是非常有限的,想讓它更聰明,就需要引入博弈演算法,進行深度思考了。

一步一步實現五子棋1

最近待業中,趁這段時間想實現乙個vc版的五子棋軟體,並且把每天的工作內容寫出來當作對自己工作的總結,同時希望能達到拋磚引玉的效果,希望各位大俠多多指教。首先建立乙個mfc工程,如下圖 工程建好後我們先完成棋盤的繪製。這裡我們使用gdi 來繪圖。要使用gdi 先要完成如下工作。1 將以下 加入到std...

一步一步實現FormsAuthentic驗證登入

本文不講原理,只講用法,原理性的東西網上特別多,不過還是會對一些要用到的東西進行解釋,不深入講原理。本文中用的是vs2012 net mvc 4.0。原理看這篇文章 看完這個文章絕對受益匪淺。說下登入的整個流程 使用者輸入賬號密碼 點選提交 資料提交到後台控制器 去資料庫取得使用者資料 如果登入成功...

一步一步學習hadoop(五)

hadoop分布式檔案系統 hdfs 首先介紹一下hdfs的特點 1.擅長處理大檔案,超大檔案。幾十g甚至pb級別的檔案 2.擅長流式資料訪問,一次寫入多次讀取是最高效的訪問模式 3.可以執行在普通的機器上,一般只要求記憶體是ecc記憶體,可以對資料進行糾錯。4.擅長執行非實時的分析或者是近實時的資...