目錄
主界面顯示與選擇模式
雙人對戰(zhàn)
人機對戰(zhàn)
勝利界面顯示
部分源碼
主界面顯示與選擇模式
VGA顯示器顯示圖片,顯示圖片利用Block Memory Generator將圖片像素點儲存在RAM里面。
效果圖:(防止侵權(quán)打了馬賽克)
?通過開發(fā)板上的按鍵進行模式選擇,模式確定
雙人對戰(zhàn)
雙人對戰(zhàn)就是采用簡單的存數(shù)組的辦法,這里五子棋的棋盤是采用13*13的大小,為了方便輸贏判斷也為了方便后續(xù)人機模式得分判斷,這里數(shù)組采用了21*21大小的數(shù)組。
效果圖:
?在數(shù)組中黑子數(shù)值為1,白子為2,空白為0,簡單的原理就是黑子下完白子下,兩個玩家共用一個鍵盤,每當(dāng)一個玩家落子后就會進行輸贏判斷,對數(shù)組21*21中13*13的區(qū)域每一個點進行判斷
如下圖:(判斷以這個點為中心的橫豎斜方向是否都為1或者都為2)
人機對戰(zhàn)
該程序采用了局部區(qū)域計算得分的方法來實現(xiàn)人機下棋操作
效果圖:(采用了和雙人對戰(zhàn)一樣的頁面)
?當(dāng)玩家(黑子)下完后人機根據(jù)當(dāng)前棋局進行下棋(沒有加延時所以是秒下),并且在最后一次下的白子中心還有一個黑點方便玩家知道人機下哪了。
我原本想用剪枝算法來制作人機的,但是我發(fā)現(xiàn)我寫完程序后發(fā)現(xiàn)我的basys3開發(fā)板的LUT不能支持我的算法,還有會超出循環(huán)上限的問題(當(dāng)然還有我自身算法能力不夠),最后我重寫了一個簡單的算法,經(jīng)過不斷優(yōu)化,最終實現(xiàn)了一個簡單的人機對戰(zhàn)。
具體算法:
我創(chuàng)建了一個新變量(二進制8位,因為開發(fā)板資源有限,所以越簡單越好)用來存儲得分信息,對每一個空白點進行分數(shù)計算,對以每一個空白點為中心的9*9區(qū)域進行了條件判斷(這是我之前為什么存21*21的數(shù)組的原因,因為邊界上的空白的話左邊本來是沒有數(shù)組的,進行判斷就會出現(xiàn)錯誤,所以我直接省略了邊界條件的判斷,讓它在一定意義上沒有邊界,但是這也會造成一定的問題,例如情況:邊界,0,2,2,2,1,在這種情況下已經(jīng)不可能連成五個子了,但是它還是會判斷這是一個得分比較高的解)
得分計算:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2
先對中間空白點賦值,先賦為2(白色),然后對其進行是否連成五子判斷(如上圖1所示),如果能連成五子就將其得分的最高位(位7)賦為1,對其進行是否連成四子判斷(如上圖2所示),如果能連成四子就將其得分(位5)賦為1,對其進行是否連成三子判斷(如下圖3所示),如果能連成三子就將其得分(位3)賦為1,對其進行是否連成二子判斷(如下圖4所示),如果能連成二子就將其得分(位1)賦為1,其他豎和斜方向也是一樣的道理。
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖4
?然后將這個空白點賦為1(黑色),然后對其進行是否連成五子判斷,如果能連成五子就將其得分(位6)賦為1,對其進行是否連成四子判斷,如果能連成四子就將其得分(位4)賦為1,對其進行是否連成三子判斷,如果能連成三子就將其得分(位2)賦為1,對其進行是否連成二子判斷,如果能連成二子就將其得分(位0)賦為1,其他豎和斜方向也是一樣的道理。
還有一些特殊情況的判斷賦值為了提高人機的博弈力,這里不說明了。
?最后找到那個得分最高的空白點就行了。
勝利界面顯示
?最后也有選擇按鈕用來控制是當(dāng)前模式的直接下一局還是返回主頁面進行重新選擇。
在VGA顯示中還采用了取字模延時的方法顯示字和一些有趣的動圖
比如抽象的坤坤打球動圖,豌豆射手和向日葵。文章來源:http://www.zghlxwxcb.cn/news/detail-801088.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-801088.html
部分源碼
score=0;
maxa=0;maxb=0;
for(a=0;a<13;a=a+1)
begin
for(b=0;b<13;b=b+1)
begin
if(if_have_2[a+4][b+4]==0)
begin
score1=0;
if_have_2[a+4][b+4]=2;
for(q=0;q<5;q=q+1)
begin
if(if_have_2[a+q][b+4]==2
&&if_have_2[a+1+q][b+4]==2
&&if_have_2[a+2+q][b+4]==2
&&if_have_2[a+3+q][b+4]==2
&&if_have_2[a+4+q][b+4]==2)
begin
score1[7]=1;
end
else
begin
end
if(if_have_2[a+4][b+q]==2
&&if_have_2[a+4][b+1+q]==2
&&if_have_2[a+4][b+2+q]==2
&&if_have_2[a+4][b+3+q]==2
&&if_have_2[a+4][b+4+q]==2)
begin
score1[7]=1;
end
else
begin
end
if(if_have_2[a+q][b+q]==2
&&if_have_2[a+1+q][b+1+q]==2
&&if_have_2[a+2+q][b+2+q]==2
&&if_have_2[a+3+q][b+3+q]==2
&&if_have_2[a+4+q][b+4+q]==2)
begin
score1[7]=1;
end
else
begin
end
if(if_have_2[a+4-q][b+4+q]==2
&&if_have_2[a+5-q][b+3+q]==2
&&if_have_2[a+6-q][b+2+q]==2
&&if_have_2[a+7-q][b+1+q]==2
&&if_have_2[a+8-q][b+q]==2)
begin
score1[7]=1;
end
else
begin
end
end
for(q=0;q<4;q=q+1)
begin
if(if_have_2[a+1+q][b+4]==2
&&if_have_2[a+2+q][b+4]==2
&&if_have_2[a+3+q][b+4]==2
&&if_have_2[a+4+q][b+4]==2)
begin
score1[5]=1;
end
else
begin
end
if(if_have_2[a+4][b+1+q]==2
&&if_have_2[a+4][b+2+q]==2
&&if_have_2[a+4][b+3+q]==2
&&if_have_2[a+4][b+4+q]==2)
begin
score1[5]=1;
end
else
begin
end
if(if_have_2[a+1+q][b+1+q]==2
&&if_have_2[a+2+q][b+2+q]==2
&&if_have_2[a+3+q][b+3+q]==2
&&if_have_2[a+4+q][b+4+q]==2)
begin
score1[5]=1;
end
else
begin
end
if(if_have_2[a+4-q][b+4+q]==2
&&if_have_2[a+5-q][b+3+q]==2
&&if_have_2[a+6-q][b+2+q]==2
&&if_have_2[a+7-q][b+1+q]==2)
begin
score1[5]=1;
end
else
begin
end
end
for(q=0;q<3;q=q+1)
begin
if(if_have_2[a+2+q][b+4]==2
&&if_have_2[a+3+q][b+4]==2
&&if_have_2[a+4+q][b+4]==2)
begin
score1[3]=1;
end
else
begin
end
if(if_have_2[a+4][b+2+q]==2
&&if_have_2[a+4][b+3+q]==2
&&if_have_2[a+4][b+4+q]==2)
begin
score1[3]=1;
end
else
begin
end
...
到了這里,關(guān)于基于FPGA(basys3)的雙人對戰(zhàn)人機對戰(zhàn)五子棋(vivado)課程設(shè)計項目的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!