對戰演算法題
⑴ vb五子棋判定勝負的演算法
給你一個簡單的五子棋(雙人對戰)游戲代碼,自己慢慢研究,分好少!
首先,我們要確定棋盤的格子數,比如10*10的
然後,聲明兩個數組 Hei(1 To 10 * 10) ,Bai(1 To 10 * 10) 表示雙方已經下的棋子,再創建10*10個控制項數組與之對應。游戲開始時,兩個數組的所有元素都為空,當滑鼠按下一個控制項時改變對應數組元素的值即表示下了一個棋子。
最後,為了便於判斷贏輸,我們還要聲明一個二維數組 HWs(1 To 10, 1 To 10)來記錄前面兩個數組的索引值,便於分清兩個數組元素的行列(坐標)狀況,這樣才容易判斷贏輸。
'新建一個工程
'添加一個按鈕command1
'添加一個標簽label1,index屬性設為0
'黏貼以下代碼到窗體代碼編輯窗內
'f5運行,單擊按鈕即可游戲
Dim Ws As Long '棋盤的寬度(即一行可以下幾個棋子)
Dim Hs As Long '棋盤的高度
Dim Hei() As Boolean ' 代表黑方的棋子
Dim Bai() As Boolean ' 代表白方的棋子
Dim HWs() As Integer ' 棋盤的行列號
Dim HBGo As Boolean ' 真時黑方下棋
Dim GameStart As Boolean
Private Sub Form_Load()
Dim i As Long, j As Long, w As Long, h As Long, l As Long
Init '初始化
'生成棋盤布局
'label1.index=0'設計時將index屬性設為1
Me.BackColor = vbBlue
Label1(0).BackColor = RGB(100, 100, 100)
Label1(0) = ""
Label1(0).Height = 250
Label1(0).Width = 250
Label1(0).Top = 0
Label1(0).Left = 0
h = 100
l = 0
For i = 1 To Hs
h = h + 100 + Label1(0).Height
w = 100
For j = 1 To Ws
w = w + 100 + Label1(0).Width
l = l + 1
Load Label1(l)
Label1(l).Top = h
Label1(l).Left = w
Label1(l).Visible = True
Next
Next
GameStart = False
End Sub
Private Sub Init() '初始化
Dim i As Integer, j As Long, k As Long
Ws = 10 '定義棋盤行列大小
Hs = 10
ReDim Hei(1 To Ws * Hs) '初始化棋盤
ReDim Bai(1 To Ws * Hs) '當下棋時將對應的元素置為真即可
ReDim HWs(1 To Ws, 1 To Hs) '記錄棋盤行列中的索引號,便於判斷贏輸
j = 0: k = 1
For i = 1 To Hs * Ws
j = j + 1 '列數計算
HWs(j, k) = i '記下棋盤數組元素號
If j = Ws Then j = 0: k = k + 1 '滿一列後,重計列數,行數加1
Next
On Error Resume Next
For j = 1 To Hs * Ws
Label1(j).BackColor = Label1(0).BackColor
Next
End Sub
Private Sub Command1_Click() '開始游戲
Init '初始化
GameStart = True
End Sub
Private Sub Label1_Click(Index As Integer) '單擊標簽控制項數組下棋
If Index = 0 Or GameStart = False Then Exit Sub
If HBGo Then '判斷下棋方
If Bai(Index) = False And Hei(Index) = False Then '當雙方都沒有在這里下過棋子時,才可以下到這里
Hei(Index) = True ',才可以將棋子下到這里
HBGo = False '輪到黑方下棋
Label1(Index).BackColor = vbBlack '將該棋子設為黑色
If Winner(Hei) Then '判斷贏輸
MsgBox "黑方贏"
GameStart = False
Exit Sub
End If
End If
Else
If Bai(Index) = False And Hei(Index) = False Then
Bai(Index) = True
HBGo = True
Label1(Index).BackColor = vbWhite
If Winner(Bai) Then
MsgBox "白方贏"
GameStart = False
Exit Sub
End If
End If
End If
End Sub
Private Function Winner(ByRef QiZi() As Boolean) As Boolean '判斷輸贏,參數為某一方的棋子數組
Dim FiveQ As Long, j As Long, k As Long
Dim i As Long
For i = 1 To Hs '行判斷
FiveQ = 0
For j = 1 To Ws
If QiZi(HWs(j, i)) Then
FiveQ = FiveQ + 1
Else
If FiveQ > 0 And FiveQ < 5 Then FiveQ = 0
End If
Next
If FiveQ >= 5 Then Winner = True: Exit Function
Next
For i = 1 To Ws '列判斷
FiveQ = 0
For j = 1 To Hs
If QiZi(HWs(i, j)) Then
FiveQ = FiveQ + 1
Else
If FiveQ > 0 And FiveQ < 5 Then FiveQ = 0
End If
Next
If FiveQ >= 5 Then Winner = True: Exit Function
Next
For n = 1 To Hs - 4
For i = 5 To Ws '斜列判斷
If QiZi(HWs(i, n)) And _
QiZi(HWs(i - 1, n + 1)) And _
QiZi(HWs(i - 2, n + 2)) And _
QiZi(HWs(i - 3, n + 3)) And _
QiZi(HWs(i - 4, n + 4)) Then Winner = True: Exit Function
Next
For i = 1 To Ws - 5 '反斜列判斷
If QiZi(HWs(i, n)) And _
QiZi(HWs(i + 1, n + 1)) And _
QiZi(HWs(i + 2, n + 2)) And _
QiZi(HWs(i + 3, n + 3)) And _
QiZi(HWs(i + 4, n + 4)) Then Winner = True: Exit Function
Next
Next
End Function
⑵ 關於對戰游戲,隊伍匹配的演算法問題。
1
ELO演算法是累積
當你贏得頂級球隊的時候,你會增加很多的ELO價值
當你失去了一個強大的團隊,你會減少少量的ELO BR />當弱隊時,你贏了,你會增加少量的ELO值
你輸給弱隊的時候,你會減少很多的ELO值
不管下降的同時,或以其他方式。該值將被計算。
例如,如果你放棄了,但到底你的球隊取得勝利,你還是會增加ELO。
匹配模式ELO隱藏
看不到
多玩盒子看戰鬥力評估,只需按照你的
行位,勝率,總場數數。 ,
僅供參考,實際的游戲戰網與ELO值相差很大。
例如,你能贏得兩強的球隊失去了一個強大的團隊,你一個實際的ELO值高
但是,如果你贏了弱和他的團隊輸給弱隊,您的實際ELO值?低
但的發揮更只有運營商,兩場比賽.500勝率的欄位數。
⑶ 求五子棋人機對戰演算法
總的來說,要讓電腦知道該在哪一點下子,就要根據盤面的形勢,為每
一可能落子的點計算其重要程度,也就是當這子落下後會形成什麼棋型(如:「沖四」、「活三」等),然後通覽
全盤選出最重要的一點,這便是最基本的演算法。當然,僅靠當前盤面進行判定是遠遠不夠的,這樣下棋很輕易掉進
玩家設下的陷阱,因為它沒有考慮以後的變化。所以在此基礎上我們加入遞歸調用,即:在電腦中猜測出今後幾步
的各種走法,以便作出最佳選擇,這也是我們下棋時常說的「想了幾步」。如此一來您的程序便具有一定的水平了。
什麼?不信!過來試試吧!
總體思路弄清之後,下面進行具體討論:
一:數據結構
先來看看數據結構,我們需要哪些變數?
首先得為整個棋盤建立一張表格用以記錄棋子信息,我們使用一個15*15的二維數組 Table[15][15] (15*15是
五子棋棋盤的大小),數組的每一個元素對應棋盤上的一個交叉點,用『0』表示空位、『1』代表己方的子、『2』
代表對方的子;這張表也是今後分析的基礎。
在此之後還要為電腦和玩家雙方各建立一張棋型表Computer[15][15][4]和Player[15][15][4],用來存放棋型
數據,就是剛才所說的重要程度,比如用『20』代表「沖四」的點,用『15』代表「活三」的點,那麼在計算重要
性時,就可以根據20>15得出前者比後者重要,下子時電腦便會自動選擇「沖四」的點。那為什麼棋型表要使用三
維數組呢?因為棋盤上的每一個點都可以與橫、豎、左斜、右斜四個方向的棋子構成不同的棋型,所以一個點總共
有4個記錄;這樣做的另一個好處是可以輕易判定出復合棋型,例如:假如同一點上有2個『15』就是雙三、有一個『15』和一個『20』就是四三。
怎麼樣!3個數組構成了程序的基本數據骨架,今後只要再加入一些輔助變數便可以應付自如了。應該不會太
難吧?OK!有了這么多有用的數據,我們就可以深入到程序的流程中去了。
二:程序流程
我們主要討論五子棋的核心演算法,即:人工智慧部分,而其他像圖形顯示、鍵盤滑鼠控制等,因較為簡單,所
以就不作過多介紹了。
我們看到本程序由六個基本功能模塊構成,各模塊的具體分析如下:
(1)初始化:首先,建立盤面數組Table[15][15]、對戰雙方的棋型表Computer[15][15][4]和Player[15]
[15][4]並將它們清零以備使用;然後初始化顯示器、鍵盤、鼠等輸入輸出設備並在屏幕上畫出棋盤。
(2)主循環控制模塊:控制下棋順序,當輪到某方下子時,負責將程序轉到相應的模塊中去,主要擔當一個
調度者的角色。
(3)玩家下子:當輪到玩家下時,您通過鍵盤或滑鼠在棋盤上落子,程序會根據該點的位置,在Table[15]
[15]數組的相應地方記錄『2』,以表明該子是玩家下的。
(4)盤面分析填寫棋型表:本程序核心模塊之一,人工智慧演算法的根本依據!其具體實現方法如下:您在下
五子棋時,一定會先根據棋盤上的情況,找出當前最重要的一些點位,如「活三」、「沖四」等;然後再在其中
選擇落子點。但是,電腦不會像人一樣分析問題,要讓它知道哪是「活三」、哪是「沖四」,就得在棋盤上逐點
計算,一步一步的教它。
先來分析己方的棋型,我們從棋盤左上角出發,向右逐行搜索,當碰到一個空白點時,以它為中心向左挨個
查找,假如碰到己方的子則記錄然後繼續,假如碰到對方的子、空白點或邊界就停止查找。左邊完成後再向右進
行同樣的操作;最後把左右兩邊的記錄合並起來,得到的數據就是該點橫向上的棋型,然後把棋型的編號填入到Computer[x][y][n]中就行了(x、y代表坐標,n=0、1、2、3分別代表橫、豎、左斜、右斜四個方向)。而其他三
個方向的棋型也可用同樣的方法得到,當搜索完整張棋盤後,己方棋型表也就填寫完畢了。然後再用同樣的方法
填寫對方棋型表。
注重:所有棋型的編號都要事先定義好,越重要的號數越大!
OK! 怎麼樣?有點累了吧?不過千萬別泄氣!因為好戲還在後頭。
Let's go!
(5)電腦下子:有了上面填寫的兩張棋型表,現在要作的就是讓電腦知道在哪一點下子了。其中最簡單的
計算方法,就是遍歷棋型表Computer[15][15][4]和Player[15][15][4]找出其中數值最大的一點,在該點下子即
可。但這種演算法的弱點非常明顯,只顧眼前利益,不能顧全大局,這就和許多五子棋初學者一樣犯了「目光短淺」
的毛病。
要解決這個問題,我們引入『今後幾步猜測法』,具體方法是這樣的: 首先, 讓電腦分析一個可能的點,
假如在這兒下子將會形成對手不得不防守的棋型(例如:『沖四』、『活三』);那麼下一步對手就會照您的思
路下子來防守您,如此一來便完成了第一步的猜測。這時再調用模塊4對猜測後的棋進行盤面分析,假如出現了
『四三』、『雙三』或『雙四』等制勝點,那麼己方就可以獲勝了(當然對黑棋而言『雙三』、『雙四』是禁手
,另當別論);否則照同樣的方法向下分析,就可猜測出第二步、第三步……
等一等,要是盤面上沒有對手必須防的棋型,哪該怎麼辦呢?進攻不成的話就得考慮防守了,將自己和對手
調換一下位置,然後用上面的方法來猜測對手的棋,這樣既可以防住對手巧妙的攻擊,又能侍機發動反擊,何樂
而不為呢!
但是必須告訴大家的是:猜測法的運算量相當之大,據我的經驗,用Pentium-100猜測3步的走法平均需要15
秒以上時間,所以建議猜測量在5步以內。可別小瞧了這5步,有時它甚至會走出讓您拍手叫絕的妙著呢!
(6)勝敗判定:務須多言,某方形成五子連即獲勝;若黑棋走出『雙三』、『雙四』或長連即以禁手判負。
到現在為止,整個五子棋軟體就基本完成了,其水平大約在中級上下。當然,這種演算法並不是最好的,但我
相信它的基本思路是正確的。
⑷ 如果兩個AlphaGo對戰,誰會贏
2017年5月23日,AlphaGo與柯潔在浙江烏鎮進行對決。此前AlphaGo於2016年3月以4:1的比分戰勝了韓國選手李世石,之後AlphaGo以Master作為ID在網路圍棋平台上戰勝了眾多知名選手取得了60連勝的戰績,這其中也包括了要與其在烏鎮對決的柯潔。AlphaGo的強勢崛起已經讓部分人開始擔心未來人工智慧會代替甚至毀滅人類,著名的物理學家霍金也曾在公開場合多次提及過「人工智慧威脅論」。
出品:科普中國
製作:王軒
監制:中國科學院計算機網路信息中心
「科普中國」是中國科協攜同社會各方利用信息化手段開展科學傳播的科學權威品牌。
本文由科普中國融合創作出品,轉載請註明出處。
⑸ c++編寫小游戲,五子棋人機對戰的演算法要怎麼寫啊,希望大神路過指點一下
ai啊
一般都是DFS演算法+分支評分(用於alpha/beta剪枝)
⑹ vs對戰平台魔獸2V2積分演算法 (越詳細越好)
以1級為例
勝利基礎分為100分
失敗基礎分為50分
勝利敵人級別比你高出1 +15 2=2*15=30
你和10級的人打贏了
那麼就是 他的級別減去你的級別 *15 +100分基礎分
那麼 你贏了10級 也就是 【10-1】*9+100=245
輸了 就是你的級別減去他的級別 *10+上50分基礎分
當他的級別高於你5級以上 你輸看 無論他是多少級 【必須是大於你5級以上】 你都扣1分.. 所以你1級 輸給 6級的和20級的是沒區別的
2V2 是同樣的道理
只是隊友級別互相加在一起然後減
舉例 你1 你隊友2
敵人 一個3 一個2
那麼輸贏就是
你的隊伍 級別 是1+2
他的隊伍級別是 3+2
然後最後是 3級對5級
級別差2
那麼最後
你們贏 就是 【5-3】*15+100=130
輸就是 50-【5-3】*10=30分
⑺ 高分求演算法:關於井字棋(三子棋)的演算法!!面談感謝!!!!
「井字棋」游戲(又叫「三子棋」),是一款十分經典的益智小游戲,想必很多玩家都有玩過。「井字棋」的棋盤很簡單,是一個3×3的格子,很像中國文字中的「井」字,所以得名「井字棋」。「井字棋」游戲的規則與「五子棋」十分類似,「五子棋」的規則是一方首先五子連成一線就勝利;「井字棋」是一方首先三子連成一線就勝利。
井字棋(英文名Tic-Tac-Toe)
井字棋的出現年代估計已不可考,西方人認為這是由古羅馬人發明的;但我們中國人認為,既然咱們都發明了圍棋、五子棋,那發明個把井字棋自然是不在話下。這些純粹是口舌之爭了,暫且不提。
想起小時候上課喜歡玩井字棋,只要一張草稿紙、一支筆、同桌兩人就可以玩了。上體育課,也可以拿著樹枝在沙坑裡玩。但一直感覺這游戲太簡單了,後來接觸了五子棋,著迷了一陣,但水平總是很差,便也不玩了。
一字棋游戲極小極大分析法
設有九個空格,由MAX,MIN二人對弈,輪到誰走棋誰就往空格上放一隻自己的棋子,誰先使自己的棋子構成「三子成一線」(同一行或列或對角線全是某人的棋子),誰就取得了勝利。
用叉號表示MAX,用圓圈代表MIN。
比如右圖中就是MIN取勝的棋局。
為了不致於生成太大的博弈樹,假設每次僅擴展兩層。估價函數定義如下:
設棋局為P,估價函數為e(P)。
(1) 若P對任何一方來說都不是獲勝的位置,則e(P)=e(那些仍為MAX空著的完全的行、列或對角線的總數)-e(那些仍為MIN空著的完全的行、列或對角線的總數)
(2) 若P是MAX必勝的棋局,則e(P)=+∞。
(3) 若P是B必勝的棋局,則e(P)=-∞。
比如P如右圖示,則e(P)=6-4=2
要注意利用棋盤位置的對稱性,在生成後繼節點的位置時,下列博弈結局
都是相同的棋局(在博弈中,一宇棋的分枝系數比較小起初是由於對稱性,而後是由於棋盤上未布子的空格減少所致)。圖3.15畫出了經過兩層搜索生成的博弈樹,靜態估值記在端節點下面,倒推值記在圓圈內。
由於右圖所示位置具有最大的倒推值,它應當選取為MAX的第一步(正好是MAX的最好的優先走步)。
現在我們假設MAX走了這一步,而MIN的回步是直接在X上方的空格里放上一個圓圈(對MAX來說這是一步壞棋,他一定沒有採用好的搜索策略)。下一步,MAX又在新的格局下搜索兩層,產生如圖3.16所示的搜索圖。
現在圖中MAX有兩個可能「最好的」優先走步,假設MAX走了圖上指明的那一步。而MIN為了避免立即敗北被迫走了另一步,從而產生如下棋局:MAX再次搜索,產生如圖3.17所示的樹。
在這棵樹中某些端節點(例如其中一個標記著A)代表MIN獲勝,因此它們的估值為—∞。當這些估值被倒推回去時,可看到MAX的最好的也是唯一能使他避免立即失敗的一個走步。現在,MIN可以看出MAX必然在他的下一走步中獲勝,因此,MIN只好認輸。
按極大極小演算法編程下一字棋的演示(右圖,可以點擊操作)...
我們就利用Visual Basic編寫一個「井字棋」的小游戲。
【設計思路】
首先,我們要知道,「井字棋」游戲是一款典型的棋類游戲,游戲時一方式是電腦,另一方是玩家。所以,這類游戲在開始時有兩種方式:一種是玩家先走;另一種是電腦先走。這是我們要考慮的第一個問題。
其次,由於與玩家對戰的是計算機,所以我們要編寫一個過程(Chuqi),它可以使程序模擬人的思維與人下棋(其實就是「人工智慧」的體現),這個Chuqi過程也是本游戲軟體的關鍵。此外,我們還要編寫兩個過程(Lianxian和Shuying),Lianxian過程用來時刻判斷棋盤中是否有三個棋子連成一線;Shuying過程用來判斷如果有三個棋子連成一線,是哪一方連成一線的,即判斷哪一方獲勝。
以上幾個問題就是該「井字棋」游戲實現的關鍵思路。....
QQ:744192659
郵箱:[email protected]
⑻ 人機五子棋對戰演算法 棋盤是15*15的棋盤,我定義map[15][15]的二維數組,裡面的用來存儲
學習一下博弈樹吧