朱其祥,徐 勇,蔣宗華,陳曉玲
(安徽財(cái)經(jīng)大學(xué) 管理科學(xué)與工程學(xué)院,安徽 蚌埠 233030)
井字棋[1](Tic Tac Toe)又稱井字游戲,也叫九宮格游戲,即兩人輪流在印有九格方盤上畫“X”或“O”字,誰先把三個(gè)同一記號(hào)排成橫線、直線、斜線即為勝者.1952年,EDSAC計(jì)算機(jī)上的“OXO”游戲成為了已知的第一款電子游戲,計(jì)算機(jī)能與人類對(duì)手完美地進(jìn)行對(duì)戰(zhàn).井字棋也被應(yīng)用于人工智能與博弈論的研究.本文擬用單片機(jī)結(jié)合Proteus仿真軟件來設(shè)計(jì)一款井字棋游戲.
依據(jù)系統(tǒng)電路的按鍵來控制游戲雙方放置棋子的位置,分別用仿手機(jī)鍵盤中的①~⑨與棋盤格子相對(duì)應(yīng),其中①~③對(duì)應(yīng)棋盤第一行從左到右的3個(gè)棋格,④~⑥對(duì)應(yīng)棋盤第二行從左到右的3個(gè)棋格,⑦~⑨對(duì)應(yīng)棋盤第三行從左到右的3個(gè)棋格.分別用‘紅’和‘黃’兩種顏色的雙色發(fā)光二極管代表游戲雙方的棋子.若棋盤格子為空時(shí),則可以放置棋子;若格子已有棋子,則放置無效.當(dāng)程序判斷出有一方獲勝時(shí),即在數(shù)碼管上顯示‘r’或‘y’(表示‘紅’方或‘黃’方獲勝),同時(shí)禁止輸?shù)囊环皆倮^續(xù)落子,此局宣告結(jié)束;當(dāng)棋盤格子已被棋子占滿且無任何一方獲勝時(shí),即在數(shù)碼管上顯示‘P’(表示‘平手’),如圖1所示;當(dāng)棋盤格子未被占滿且無任何一方獲勝或平手時(shí),即在數(shù)碼管上顯示‘-’(表示可以‘繼續(xù)’).延遲一段時(shí)間后(也可在游戲進(jìn)行中按‘0’鍵),程序會(huì)自動(dòng)清空棋盤,開始新的對(duì)局,同時(shí)交換‘紅’、‘黃’先手(先手多一子獲勝概率大,每次交換先手較為公平).
圖1 “紅”方勝、“黃”方勝、“平手”仿真效果圖
依據(jù)游戲功能說明,繪制出游戲仿真電路圖[2-5],如圖2所示.電路由單片機(jī)最小系統(tǒng)、蜂鳴器、共陽極數(shù)碼管及限流電阻、9只紅黃雙色LED及限流電阻、仿手機(jī)鍵盤及解碼芯片等組成.解碼芯片74C922[6]的作用:一方面可以省去用軟件掃描矩陣鍵盤獲得按鍵編碼;另一方面按鍵時(shí)可以形成外部中斷請(qǐng)求信號(hào).為了形成棋子與棋盤的效果,將做好的方格圖覆蓋在雙色LED圖上,如圖3所示.
軟件采用KeilC51集成開發(fā)環(huán)境來編寫,程序由主函數(shù)、延時(shí)函數(shù)、發(fā)聲函數(shù)、清空棋盤函數(shù)、判贏函數(shù)、外部中斷處理函數(shù)等構(gòu)成.游戲雙方的按鍵采用外部中斷方式處理,當(dāng)任何一方按鍵后,即進(jìn)入外部中斷處理函數(shù).首先判斷該位置是否為空,若為空,才可放棋子.點(diǎn)擊按鍵后,使該位置的LED點(diǎn)亮,若是‘黃’方,則使其發(fā)黃光,若是‘紅’方,則使其發(fā)紅光.并發(fā)出‘滴’一聲,然后修改走棋方的標(biāo)志,如剛才走棋的是‘黃’方,則下次就該輪到‘紅’方走棋,反之亦然;若該位置已有棋子,則操作無效,并發(fā)出‘嘟’一聲,此時(shí),不修改走棋標(biāo)志,仍是該當(dāng)前走棋的一方落子.在程序處理上,定義一個(gè)2維數(shù)組arr[3],用以記錄棋子的狀態(tài).開始將數(shù)組初始化為‘’(空格)字符,如當(dāng)‘黃’方在某方格落子有效后,數(shù)組中相應(yīng)位置的數(shù)據(jù)則修改為‘Y’;如當(dāng)‘紅’方在某方格落子有效后,數(shù)據(jù)的內(nèi)容變則為‘R’.判贏函數(shù)的算法是:掃描數(shù)組中的所有元素,當(dāng)某一行的三個(gè)元素內(nèi)容相同、或某一列三個(gè)元素內(nèi)容相同、或者是對(duì)角線上的三個(gè)元素內(nèi)容相同即為獲勝!(返回對(duì)應(yīng)數(shù)組元素即可判斷是哪方贏了,如返回的內(nèi)容是‘Y’,則為‘黃’方獲勝,若返回的內(nèi)容是‘R’,則為‘紅’方獲勝).若輸贏的判斷沒有結(jié)果,并判斷棋盤上是否還有位置(是否有空格),若還有的話則繼續(xù)(返回‘N’表示游戲繼續(xù));沒有則是平局!(返回‘P’表示平局).
圖2 井字棋游戲仿真電路圖
圖3 模擬的棋子和棋盤仿真圖
用Keil C51集成開發(fā)環(huán)境將編寫好的項(xiàng)目文件及添加的.C文件進(jìn)行編譯生成.HEX文件,然后將其裝載到用Proteus畫好的電路圖的CPU中即可仿真運(yùn)行[7-11].仿真效果如圖1所示.
利用AT89C51單片機(jī)來設(shè)計(jì)井字棋游戲,結(jié)合Proteus仿真軟件,實(shí)現(xiàn)了井字棋游戲的預(yù)期功能,對(duì)于用單片機(jī)開發(fā)和設(shè)計(jì)游戲有一定的借鑒作用,譬如還可以設(shè)計(jì)人機(jī)對(duì)弈的井字棋游戲以及五子棋游戲等.