




已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
人工智能 井字棋的實現(xiàn)學院:信息工程學院教師:羅會蘭 專業(yè):計算機應用技術學號:6120160166姓名:王碩豪簡介2016年3月9日,李世石與 AlphaGo 的人機大戰(zhàn)開始。這將成為寫入人類史冊的一天。計算機 AI 可以在圍棋上戰(zhàn)勝人類頂尖棋手的時代已經(jīng)到來。兩個月之后,美國白宮就推動成立了機器學習與人工智能分委會,由其主持和協(xié)調撰寫了三個關于人工智能發(fā)展的報告:為人工智能的未來做好準備國家人工智能研究和發(fā)展戰(zhàn)略計劃和人工智能、自動化與經(jīng)濟報告。歐盟、英國和日本等也相繼發(fā)布了研發(fā)和應用人工智能的報告。顯然,中國應當參與到這種戰(zhàn)略布局當中,這種布局不僅是國家和民族的需要,而且也是贏得未來的利器。再厲害的程序員,也是從“hello world”程序開始寫起。再“聰明”的機器,也是從零樣本開始“訓練”出來的。所以今天就來寫一個最簡單棋類游戲:Tic Tac Toe,又叫井字棋,大陸、臺灣又稱為井字游戲、圈圈叉叉;另外也有打井游戲、OX棋的稱呼,香港多稱井字過三關、過三關,是種紙筆游戲。大致說下井字棋的規(guī)則:1.棋盤為 3*3 共 9 格,類似漢字“井”;2.一方為 o,一方為 x,輪流落子;3.任一方先有連成一條線的 3 個棋子(橫、豎、斜皆可)則為勝利;4.棋盤擺滿仍沒有一方勝利,則為平局。這種游戲實際上是由第一位玩家所控制,第一位玩家是攻,第二位玩家是守。第一位玩家在角位行第一子的話贏面最大(見圖一),第二位玩家若是在邊,角位下子,第一位玩家就可以以兩粒連線牽制著第二位玩家,然后制造“兩頭蛇”。圖一運行開始的時候,會讓你輸入你的名字,我則輸入我名字的縮寫wsh;接下來,由我們來選擇是先下還是后下,1是先下,2是后下;我們的符號是X,電腦的是O,由于我們選擇了先下,我們在3*3的棋盤上先下在第2行第2列;電腦則下在了第1行第1列,再次由我們決定,如果我們下在了已經(jīng)有棋子的位置上則會提示你已經(jīng)下過了;我們決定下在第1行第3列,電腦則下在第3行第1列,我們需要注意到如果電腦再下到第2行第1列就獲得勝利,所以我們需要防守我們?yōu)榱朔朗叵略诹说?行第1列,電腦又下在了第2行第3列,這時候其實我們可以注意到如果想要勝利只有將第2列連成直線一種方法了;我們下在了第1行第2列,電腦下在了第3行第2列,這時候已經(jīng)可以看出是個平局了;我們把最后一個位置填上,電腦告訴我們這是一個平局,是否還想要再玩;輸入y,電腦讓我們再次選擇先后手,大家就可以根據(jù)自己的想法來試著戰(zhàn)勝電腦了。如果失敗了,也會詢問你是否再次挑戰(zhàn),如果輸入n則會直接跳出;代碼實現(xiàn)棋盤本身的數(shù)據(jù),用int a33來表示,棋盤中0表示空,1表示我們下的,其余的則是電腦下的;void print() int i,j; coutn; for(i=0;i3;i+) for(j=0;j3;j+) if(aij=0) cout.t; else if(aij=1) coutXt; else coutOt; coutendl; 檢查是否有人獲勝,分別是三行,三列,對角線的8種情況int check() for(int i=0;i3;i+) if(ai0!=0&ai0=ai1&ai1=ai2)|(a0i!=0&a0i=a1i&a1i=a2i) return 1; if(a00!=0&a00=a11&a11=a22) return 1; else if(a02!=0&a02=a11&a11=a20) return 1; else return 0;我們下棋的時候,下第幾行第幾列,如果輸入大于2或者小于0提示輸入正確的數(shù)字,如果下的位置已經(jīng)被下過了提示這里已經(jīng)被下過了;void pin() int r=0,c=0; coutr; coutc; r-; c-; if(r2|c2|r0|c0) strcpy(str,Enter correct value ); strcat(str,name); strcat(str,.n); puts(str); pin(); else if(arc!=0) coutIt is already filled.n; pin(); else arc=t;電腦的防守策略,即我們選擇先手時電腦的應對策略int defend(int c, int p, int b) if(b3) return 0; else if(a00+a11+a22=2*c&a00!=p&a11!=p&a22!=p) for(int i=0;i3;i+) if(aii=0) aii=y; coutComputer turn: i+1 i+1endl; return 1; else if(a02+a11+a20=2*c&a02!=p&a11!=p&a20!=p) for(int i=0;i3;i+) if(ai2-i=0) ai2-i=y; coutComputer turn: i+1 3-iendl; return 1; else int i,j; for(i=0;i3;i+) if(ai0+ai1+ai2=2*c&ai0!=p&ai1!=p&ai2!=p) for(j=0;j3;j+) if(aij=0) aij=y; coutComputer turn: i+1 j+1endl; return 1; else if(a0i+a1i+a2i=2*c&a0i!=p&a1i!=p&a2i!=p) for(j=0;j3;j+) if(aji=0) aji=y; coutComputer turn: j+1 i+1endl; return 1; return 0;電腦的進攻策略,即我們選擇后手時電腦的落子策略int attack()/takes a move as to win in future. int i,j; if(a00+a02+a20+a22=t|a00+a02+a20+a22=2*t) for(i=0;i3;i+) if( ai0+ai1+ai2=y & (ai0=y|ai1=y|ai2=y) ) if(i=1) for(j=0;j3;j+) if(aij=0) aij=y; coutComputer turn: i+1 j+1=0;j-) if(aij=0) aij=y; coutComputer turn: i+1 j+1endl; return 1; if(a0i+a1i+a2i=y & (a0i=y|a1i=y|a2i=y) if(i=1) for(j=0;j3;j+) if(aji=0) aji=y; coutComputer turn: j+1 i+1=0;j-) if(aji=0) aji=y; coutComputer turn: j+1 i+1=0;i-) if(ai2-i=0) if(ai0+ai1+ai2=t&(ai0=t|ai1=t|ai2=t)&(a02-i+a12-i+a22-i=t&(a02-i=t|a12-i=t|a22-i=t) ai2-i=y; coutComputer turn: i+1 3-i=0;i-) if(ai2-i=0) ai2-i=y; coutComputer turn: i+1 3-i=0;i-) if(aii=0)& (ai0+ai1+ai2=y&(ai0=y|ai1=y|ai2=y) |( (a0i+a1i+a2i=y)&(a0i=y|a1i=y|a2i=y) aii=y; coutComputer turn: i+1 i+1=0;i-) if(aii=0) if(ai0+ai1+ai2=t&(ai0=t|ai1=t|ai2=t)&(a0i+a1i+a2i=t&(a0i=t|a1i=t|a2i=t) aii=y; coutComputer turn: i+1 i+1=0;i-) if(aii=0) aii=y; coutComputer turn: i+1 i+1=0;i-) if(ai2-i=0&(ai0+ai1+ai2=y&(ai0=y|ai1=y|ai2=y)|( (a02-i+a12-i+a22-i=y)&(a02-i=y|a12-i=y|a22-i=y) ai2-i=y; coutComputer turn: i+1 3-i=0;i-) if(ai2-i=0) if(ai0+ai1+ai2=t&(ai0=t|ai1=t|ai2=t)&(a02-i+a12-i+a22-i=t&(a02-i=t|a12-i=t|a22-i=t) ai2-i=y; coutComputer turn: i+1 3-i=0;i-) if(ai2-i=0) ai2-i=y; coutComputer turn: i+1 3-iendl; return 1; else for(i=0;i3;i+) if( ai0+ai1+ai2=y & (ai0=y|ai1=y|ai2=y) ) if(i=1) for(int j=0;j3;j+) if(aij=0) aij=y; coutComputer turn: i+1 j+1=0;j-) if(aij=0) aij=y; coutComputer turn: i+1 j+1endl; return 1; else if(a0i+a1i+a2i=y & (a0i=y|a1i=y|a2i=y) if(i=1) for(j=0;j3;j+) if(aji=0) aji=y; coutComputer turn: j+1 i+1=0;j-) if(aji=0) aji=y; coutComputer turn: j+1 i+1endl; return 1; return 0;電腦的AI運用進攻和防守策略控制其的落子void ai(int b) if(!defend(y,t,b) if(!defend(t,y,b) if(a00+a02+a20+a22=t+y|a00+a02+a20+a22=t+2*y)&a11=0) for(int i=0;i3;i+=2) for(int j=0;j3;j+=2) if(aij=0) aij=y; coutComputer turn: i+1 j+1endl; goto end; else if(b=2&a11=0) a11=y; coutComputer turn: 2 2n; goto end; if(!attack() if(b=0) time_t seconds; time(&seconds); srand(unsigned int) seconds); int i,j; a(rand()%2)*2(rand()%2)*2=y; for(i=0;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育心理學教學監(jiān)控策略
- 山東省聊城市陽谷縣2024-2025學年數(shù)學五年級第二學期期末綜合測試試題含答案
- 山東省濟寧市重點中學2025年高三下學期期末聯(lián)考數(shù)學試題試卷含解析
- 山東省青島市膠南市2024-2025學年數(shù)學五年級第二學期期末統(tǒng)考試題含答案
- 2025年大學生心理健康測試試題及答案詳盡
- 大學生愛國主題教育
- 消毒隔離質量改進措施
- 高中學生交通安全教育課件
- 確保用戶隱私數(shù)據(jù)加密存儲措施
- 2025年中國濾油器殼市場調查研究報告
- 一例盆腔臟器脫垂全盆底重建術患者的護理
- 快手賬號轉讓合同范例
- 10kV電力電纜(銅芯)技術規(guī)范書
- 高空作業(yè)車專項施工方案全套資料
- YY/T 0314-2021一次性使用人體靜脈血樣采集容器
- 2022年江蘇鳳凰出版?zhèn)髅郊瘓F有限公司招聘筆試題庫及答案解析
- 年產(chǎn)11萬噸聚丙烯合成工藝設計
- 幼兒園教學課件《神奇的色彩女王 》課件
- 信息不對稱論文
- 話劇《林黛玉進賈府》
- 妊娠期高血壓綜合征-ppt課件
評論
0/150
提交評論