![基于C#的五子棋游戲開(kāi)發(fā)(完整資料)_第1頁(yè)](http://file4.renrendoc.com/view/dd6ca794c8a3e72cd7b9f63cdedac401/dd6ca794c8a3e72cd7b9f63cdedac4011.gif)
![基于C#的五子棋游戲開(kāi)發(fā)(完整資料)_第2頁(yè)](http://file4.renrendoc.com/view/dd6ca794c8a3e72cd7b9f63cdedac401/dd6ca794c8a3e72cd7b9f63cdedac4012.gif)
![基于C#的五子棋游戲開(kāi)發(fā)(完整資料)_第3頁(yè)](http://file4.renrendoc.com/view/dd6ca794c8a3e72cd7b9f63cdedac401/dd6ca794c8a3e72cd7b9f63cdedac4013.gif)
![基于C#的五子棋游戲開(kāi)發(fā)(完整資料)_第4頁(yè)](http://file4.renrendoc.com/view/dd6ca794c8a3e72cd7b9f63cdedac401/dd6ca794c8a3e72cd7b9f63cdedac4014.gif)
![基于C#的五子棋游戲開(kāi)發(fā)(完整資料)_第5頁(yè)](http://file4.renrendoc.com/view/dd6ca794c8a3e72cd7b9f63cdedac401/dd6ca794c8a3e72cd7b9f63cdedac4015.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于C#的五子棋游戲開(kāi)發(fā)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)
基于C#的五子棋游戲開(kāi)發(fā)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)青島理工大學(xué)琴島學(xué)院設(shè)計(jì)報(bào)告課題名稱:基于C#的五子棋游戲開(kāi)發(fā)學(xué)院:計(jì)算機(jī)工程系專業(yè)班級(jí):計(jì)科(專升本)14-21學(xué)號(hào):20140371006學(xué)生:指導(dǎo)教師:青島理工大學(xué)琴島學(xué)院教務(wù)處2015年12月18日學(xué)生指導(dǎo)教師課題名稱基于C#的五子棋游戲開(kāi)發(fā)設(shè)計(jì)時(shí)間2015。11.23—2015.12。18設(shè)計(jì)地點(diǎn)動(dòng)漫1設(shè)計(jì)目的課程設(shè)計(jì)的目的就是培養(yǎng)學(xué)生的理論聯(lián)系實(shí)際的能力。通過(guò)課程設(shè)計(jì),使得學(xué)生能夠加深對(duì)講授內(nèi)容的理解、累積經(jīng)驗(yàn)、學(xué)會(huì)獨(dú)立上機(jī)調(diào)試程序;并且逐步達(dá)到綜合運(yùn)用網(wǎng)頁(yè)相關(guān)知識(shí),真正掌握。NET技術(shù)的精華,從而達(dá)到熟練應(yīng)用程序設(shè)計(jì)語(yǔ)言的目的.也為將來(lái)做較大的系統(tǒng)打下堅(jiān)實(shí)基礎(chǔ)。通過(guò)本次課程設(shè)計(jì),應(yīng)該達(dá)到以下教學(xué)任務(wù):鞏固所學(xué)知識(shí),培養(yǎng)學(xué)生的上機(jī)實(shí)踐能力以及獨(dú)立調(diào)試程序的能力,更主要的是使學(xué)生了解做項(xiàng)目的大體流程.每一個(gè)小組制定一題,項(xiàng)目成員要在項(xiàng)目經(jīng)理的帶領(lǐng)下,完成項(xiàng)目的所有內(nèi)容.重點(diǎn)掌握ASP。NET網(wǎng)站設(shè)計(jì)開(kāi)發(fā)流程,界面要友好,功能齊全,完成一個(gè)綜合項(xiàng)目。指導(dǎo)教師評(píng)語(yǔ)系部教研室意見(jiàn)一、需求分析1.選題:通過(guò)學(xué)習(xí)window窗體應(yīng)用程序的開(kāi)發(fā)與實(shí)現(xiàn),對(duì)C#程序開(kāi)發(fā)逐漸產(chǎn)生了濃厚的興趣,心中有了設(shè)計(jì)游戲的想法,通過(guò)學(xué)習(xí)和查資料慢慢對(duì)游戲制作有了一定的了解,后來(lái)通過(guò)深入學(xué)習(xí),對(duì)五子棋游戲設(shè)計(jì)有了進(jìn)一步了解,慢慢理清了其中的開(kāi)發(fā)過(guò)程與原理,最終確定了基于C#五子棋游戲的設(shè)計(jì)與實(shí)現(xiàn)項(xiàng)目。2.界面:(1)通過(guò)上網(wǎng)學(xué)習(xí),對(duì)游戲界面風(fēng)格有了一定的認(rèn)知,于是決定走界面美觀風(fēng)。手游中的主界面給人一種簡(jiǎn)單明了的感覺(jué),通常有模式關(guān)卡,讓玩家越玩越帶感,于是決定模仿它們,游戲主界面有四個(gè)模式,玩家可以選擇不同模式進(jìn)行對(duì)弈。如圖1所示:模式四模式三模式二模式一模式四模式三模式二模式一圖1。主界面(2)游戲模式一,雙人對(duì)戰(zhàn)模式。界面右側(cè)有悔棋、返回、排行榜、關(guān)于、重新開(kāi)始等功能按鈕,點(diǎn)擊各按鈕,執(zhí)行各功能。如圖2所示:棋盤(pán)棋盤(pán)關(guān)于按鈕排行榜按鈕悔棋按鈕返回按鈕重新開(kāi)始按鈕n關(guān)于按鈕排行榜按鈕悔棋按鈕返回按鈕重新開(kāi)始按鈕n圖2.模式一界面(3)游戲模式二,人機(jī)對(duì)戰(zhàn)模式。游戲界面中左部是棋盤(pán),悔棋、返回、排行榜、關(guān)于、重新開(kāi)始等功能按鈕,此模式實(shí)現(xiàn)了人和電腦的交互。如圖3所示:棋盤(pán)棋盤(pán)關(guān)于按鈕排行榜按鈕悔棋按鈕返回按鈕重新開(kāi)始按鈕n關(guān)于按鈕排行榜按鈕悔棋按鈕返回按鈕重新開(kāi)始按鈕n圖3.模式二界面(4)游戲模式三,讓子挑戰(zhàn)模式。游戲界面中左部是棋盤(pán),右部有悔棋、返回、排行榜、關(guān)于、重新開(kāi)始功能選項(xiàng)按鈕。和模式二不同的地方是讓子,開(kāi)局后棋盤(pán)中布好了讓給電腦的白子。正所謂有人的地方就會(huì)有爭(zhēng)斗,游戲中有菜鳥(niǎo)就會(huì)有高手.高手喜歡挑戰(zhàn),于是挑戰(zhàn)模式應(yīng)運(yùn)而生.此模式的界面和模式二界面相同,在此不再重畫(huà)。(5)游戲模式四,收拾殘局模式。游戲界面中左部是棋盤(pán),右部有擺棋、對(duì)戰(zhàn)、悔棋、返回、再來(lái)一局功能選項(xiàng)按鈕。和模式二不同的地方是開(kāi)局,開(kāi)局后玩家需先擺放棋子,然后點(diǎn)擊對(duì)戰(zhàn)按鈕開(kāi)始游戲。此模式界面設(shè)計(jì)參造模式二,不再重畫(huà)。3。功能劃分:通過(guò)對(duì)五子棋游戲的分析與了解,可知其基本功能有開(kāi)始、保存、打開(kāi)、悔棋、認(rèn)輸、和棋、返回、退出及聊天等功能.在這里,由于條件時(shí)間有限,僅實(shí)現(xiàn)悔棋、返回、重新開(kāi)始及模式選擇等功能.(1)模式選擇功能:在打開(kāi)游戲后,出現(xiàn)在玩家面前的是模式選擇窗口,即主窗口。玩家可通過(guò)點(diǎn)擊相應(yīng)按鈕進(jìn)入相應(yīng)模式進(jìn)行對(duì)弈。此功能參照手游及單機(jī)小游戲主界面簡(jiǎn)約美觀的特性制作的,多模式的增加符合廣大玩家的喜好。(2)悔棋功能:在每個(gè)模式中都有悔棋功能,在模式一中每次悔棋退后一子,模式二到模式四每次悔棋退后兩子,棋盤(pán)開(kāi)局后就有的讓子的棋子悔棋無(wú)效.人無(wú)完人,誰(shuí)能不犯錯(cuò),根據(jù)玩家的棋藝高低程度難以把握,為了讓玩家不至于因電腦太強(qiáng)對(duì)開(kāi)發(fā)者產(chǎn)生怨言,從而有了悔棋功能,進(jìn)而對(duì)五子棋菜鳥(niǎo)起引導(dǎo)作用,使其懷著開(kāi)心的心情與保持興趣走向棋圣之路。對(duì)于高手而言,棋品也是要有的,悔棋功能形同虛設(shè)而已。(3)從新開(kāi)始功能:此功能是菜鳥(niǎo)提升棋藝的首選功能,當(dāng)玩家進(jìn)行游戲到中途時(shí),因棋勢(shì)不明,或要敗時(shí),不能接受這一現(xiàn)狀,導(dǎo)致心情低落,怎么辦?只需輕輕一點(diǎn),一切回歸起點(diǎn),也就是初始化而已。(4)返回功能:此功能的作用是退出當(dāng)前模式,回到游戲主窗口,也就是模式選擇窗口。方便玩家在各個(gè)模式自由出入,盡情的展現(xiàn)自己的風(fēng)采。(5)人機(jī)對(duì)弈電腦下棋功能:在模式二到模式四中,玩家的對(duì)手都是電腦,電腦棋力取決于開(kāi)發(fā)者,在某中意義上來(lái)說(shuō),玩家在和開(kāi)發(fā)者對(duì)弈也是正確的。此功能是程序按照一定的算法循環(huán)掃描,算出己方和敵方最佳落子點(diǎn),再判斷出攻守,選出最終的落子點(diǎn),落子后等待玩家落子。(6)讓子功能:在模式三中,為了增加游戲難度,對(duì)棋藝大成者量身打造了讓子功能。開(kāi)局后,一般都是黑棋先行,在這里玩家執(zhí)黑,讓電腦1子,棋盤(pán)上變成了電腦執(zhí)白先行1子,白棋落在天元位置上,難度一般.玩家贏后,挑戰(zhàn)難度+1,玩家讓電腦2子,棋盤(pán)上電腦執(zhí)白先行2子,白棋落在天元位置左右兩側(cè),難度適中,適合一段棋手挑戰(zhàn).玩家贏兩局后,挑戰(zhàn)難度+1,玩家讓電腦3子,棋盤(pán)上電腦執(zhí)白先行3子,考錄到一般玩家沒(méi)有如此高深棋力,因此白棋分散落在棋盤(pán)交叉線上,難度相對(duì)適中,適合一段及以上棋手挑戰(zhàn)。讓4子和5子也是一樣的原理,難度較高,適合二段及以上棋手挑戰(zhàn).對(duì)戰(zhàn)后,會(huì)在棋盤(pán)中部上方顯示讓子數(shù)目,為迎合玩家的虛榮心理而設(shè)計(jì)。(7)判斷勝負(fù)功能:在每個(gè)模式中都需要對(duì)對(duì)局進(jìn)行勝負(fù)判斷,進(jìn)而產(chǎn)生了勝負(fù)判斷功能。其功能原理是對(duì)玩家或電腦下的棋子進(jìn)行循環(huán)掃描,對(duì)各個(gè)方向掃描黑白子雙方是否形成五子連珠,根據(jù)形成五子連珠方判斷勝負(fù),根據(jù)判斷彈出對(duì)應(yīng)的勝負(fù)提示框。再根據(jù)所屬模式對(duì)勝負(fù)后的對(duì)局進(jìn)行參數(shù)修改,如:模式一和模式二,不論勝負(fù)只需對(duì)其進(jìn)行初始化;模式三,玩家勝出,讓子加一,難度增加,需對(duì)其讓子參數(shù)進(jìn)行修改,反之則不進(jìn)行任何處理操作;模式四,玩家勝出,對(duì)局勝出參數(shù)加一,呼應(yīng)必勝模式的讓子布局功能,玩家失敗則不進(jìn)行參數(shù)修改操作等。(8)初始化界面功能:在每個(gè)模式中都需對(duì)窗口界面進(jìn)行初始化,考錄到原有界面運(yùn)行后的效果略顯呆板,為增加美觀性,需要對(duì)各窗口進(jìn)行導(dǎo)入圖片處理,美化界面.根據(jù)對(duì)局情形,在棋盤(pán)中部上方顯示提示文字,并在棋盤(pán)上顯示存在的棋子,對(duì)各參數(shù)進(jìn)行初始化處理。4.自定義類(lèi)描述、各類(lèi)方法描述及添加的命令響應(yīng).如表1所示:表1。用到的類(lèi)類(lèi)名描述說(shuō)明Form3模式一游戲窗口類(lèi),該類(lèi)主要對(duì)該模式下的窗口初始化并對(duì)鼠標(biāo)等事件消息進(jìn)行處理,實(shí)現(xiàn)悔棋功能、返回功能、排行榜功能、關(guān)于功能、重新開(kāi)始功能等。Form4模式二游戲窗口類(lèi),該類(lèi)主要對(duì)該模式下的窗口進(jìn)行初始化并對(duì)鼠標(biāo)等事件消息進(jìn)行處理,實(shí)現(xiàn)人機(jī)對(duì)弈功能、悔棋功能、返回功能、排行榜功能、關(guān)于功能、重新開(kāi)始功能、提示勝敗功能等.Form5模式三游戲窗口類(lèi),該類(lèi)主要對(duì)該模式下的窗口進(jìn)行初始化并對(duì)鼠標(biāo)等事件消息進(jìn)行處理,實(shí)現(xiàn)讓子功能、人機(jī)對(duì)弈功能、悔棋功能、返回功能、排行榜功能、關(guān)于功能、重新開(kāi)始功能、提示勝敗功能等。Form6模式四游戲窗口類(lèi),該類(lèi)主要對(duì)該模式下的窗口進(jìn)行初始化并對(duì)鼠標(biāo)等事件消息進(jìn)行處理,實(shí)現(xiàn)擺棋功能、人機(jī)對(duì)弈功能、悔棋功能、返回功能、排行榜功能、關(guān)于功能、重新開(kāi)始功能、提示勝敗功能等。二、總體設(shè)計(jì)1.游戲功能概述打開(kāi)程序,游戲開(kāi)始運(yùn)行,登錄進(jìn)入模式窗口,選擇游戲模式窗口彈出,窗口中有四個(gè)模式選擇按鈕,點(diǎn)擊按鈕,分別彈出對(duì)應(yīng)的模式一、二、三、四窗口,完成具體模式的跳轉(zhuǎn)。對(duì)于模式一,玩家點(diǎn)擊鼠標(biāo)進(jìn)行下棋操作,判斷點(diǎn)擊點(diǎn)在棋盤(pán)內(nèi)且無(wú)子時(shí),在點(diǎn)擊點(diǎn)畫(huà)出棋子;如果點(diǎn)擊點(diǎn)在棋盤(pán)外或有子時(shí),則不處理,返回等待鼠標(biāo)命令.然后判斷是否存在五子連珠,如果不存在五子連珠,則返回等待鼠標(biāo)命令;如果存在五子連珠,則進(jìn)行判斷勝負(fù)并提示勝負(fù)信息,再調(diào)用OnStart()函數(shù)初始化模式一窗口,重新開(kāi)始游戲。玩家點(diǎn)擊悔棋按鈕,調(diào)用悔棋功能函數(shù)OnHuiqi(),在窗口中重畫(huà)棋盤(pán),去掉最后下的一個(gè)棋子,把悔棋后存在的棋子重新畫(huà)在棋盤(pán)上。玩家點(diǎn)擊重新開(kāi)始按鈕,程序調(diào)用OnStart()函數(shù),初始化模式一窗口,重新開(kāi)始游戲.對(duì)于模式二、三、四,玩家點(diǎn)擊鼠標(biāo)進(jìn)行下棋操作,首先調(diào)用MouseMove函數(shù)。此函數(shù)的作用是判斷點(diǎn)擊點(diǎn)在棋盤(pán)內(nèi)且無(wú)子時(shí),在點(diǎn)擊點(diǎn)畫(huà)出棋子,如果點(diǎn)擊點(diǎn)在棋盤(pán)外或有子時(shí),則不處理,返回等待鼠標(biāo)命令。然后調(diào)用gameOver()函數(shù)判斷是否存在五子連珠,如果存在五子連珠,則進(jìn)行判斷勝負(fù)并提示勝負(fù)信息,再調(diào)用OnStart()函數(shù)初始化這一模式窗口,重新開(kāi)始游戲;如果不存在五子連珠,則調(diào)用AiGo()函數(shù),進(jìn)行電腦掃描最佳落子點(diǎn)完成電腦下棋操作。再調(diào)用Over()函數(shù)判斷是否存在五子連珠,如果不存在五子連珠,則返回等待鼠標(biāo)命令;如果存在五子連珠,則進(jìn)行勝負(fù)判斷并提示勝負(fù)信息,再調(diào)用OnStart()函數(shù)初始化這一模式窗口,重新開(kāi)始游戲.玩家點(diǎn)擊悔棋按鈕,程序調(diào)用悔棋功能函數(shù)OnHuiqi(),在窗口中重畫(huà)棋盤(pán),去掉最后下的兩個(gè)棋子,把悔棋后存在的棋子重新畫(huà)在棋盤(pán)上。玩家點(diǎn)擊重新開(kāi)始按鈕,程序調(diào)用OnStart()函數(shù),初始化模式一窗口,重新開(kāi)始游戲。開(kāi)始模式選擇窗口1。繪制游戲進(jìn)程圖,如圖4所示:開(kāi)始模式選擇窗口模式四選擇按鈕模式三選擇按鈕模式二選擇按鈕模式一選擇按鈕模式四選擇按鈕模式三選擇按鈕模式二選擇按鈕模式一選擇按鈕模式四窗口模式三窗口模式二窗口模式一窗口模式四窗口模式三窗口模式二窗口模式一窗口退出退出排行榜排行榜是在點(diǎn)擊點(diǎn)畫(huà)出棋子鼠標(biāo)點(diǎn)擊彈起等待鼠標(biāo)命令否悔棋是在點(diǎn)擊點(diǎn)畫(huà)出棋子鼠標(biāo)點(diǎn)擊彈起等待鼠標(biāo)命令否悔棋關(guān)于關(guān)于從新開(kāi)始從新開(kāi)始等待鼠標(biāo)命令等待鼠標(biāo)命令判斷點(diǎn)擊點(diǎn)在棋盤(pán)內(nèi)且無(wú)子判斷點(diǎn)擊點(diǎn)在棋盤(pán)內(nèi)且無(wú)子鼠標(biāo)點(diǎn)擊彈起鼠標(biāo)點(diǎn)擊彈起否否判斷點(diǎn)擊點(diǎn)在棋盤(pán)內(nèi)且無(wú)子判斷點(diǎn)擊點(diǎn)在棋盤(pán)內(nèi)且無(wú)子是否判斷是否存在五子連珠是否判斷是否存在五子連珠是是在點(diǎn)擊點(diǎn)畫(huà)出棋子在點(diǎn)擊點(diǎn)畫(huà)出棋子否彈出勝負(fù)提示框否彈出勝負(fù)提示框判斷是否存在五子連珠判斷是否存在五子連珠電腦掃描最佳落子點(diǎn)電腦掃描最佳落子點(diǎn)是是是是否否彈出勝負(fù)提示框判斷是否存在五子連珠彈出勝負(fù)提示框判斷是否存在五子連珠圖4。流程圖詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)1.悔棋功能的實(shí)現(xiàn):為悔棋按鈕添加類(lèi)向?qū)?,再添加int變量bushu、qi[400]、wzq[19][19],用于記錄先后下棋的具體坐標(biāo),以便于悔棋功能的實(shí)現(xiàn)。bushu用于記錄下棋的落子數(shù),qi[400]用于記錄棋子的具體坐標(biāo),wzq[19][19]用于記錄棋盤(pán)上各點(diǎn)存在棋子的黑白及有無(wú)情況?;谄骞δ艿膶?shí)現(xiàn)原理是重新畫(huà)出棋盤(pán)及悔棋后存在棋子。先判斷是否剛剛開(kāi)局,bushu不為0,就執(zhí)行悔棋命令,把最后落下的第bushu個(gè)棋子的信息初始化,再畫(huà)出棋盤(pán),重畫(huà)悔棋后存在的棋子。模式一與模式二、三、四的悔棋不同之處在于悔棋棋子數(shù)。具體代碼如下:privatevoidOnHuiqi(){if(bushu〉0&&star==true){if(colorwhite)colorwhite=false;elseb=newSolidBrush(Color。White);g。FillEllipse(b,20*i+20,20*j+30,20,20);b.Dispose();g.Dispose();}elseif(wzq[i,j]==-1){Graphicsg=this.pictureBox1.Creat(yī)eGraphics();Brushb;b=newSolidBrush(Color。Black);g.FillEllipse(b,20*i+20,20*j+30,20,20);b。Dispose();g.Dispose();}}}}悔棋功能的具體實(shí)現(xiàn)過(guò)程是先判斷是否剛開(kāi)局,有無(wú)可悔棋的棋子,如果有,就在窗口中重新畫(huà)出棋盤(pán),根據(jù)模式不同將最后落下的1個(gè)或2個(gè)棋子的信息初始化,再重新把悔棋后存在的棋子畫(huà)在棋盤(pán)上。2.鼠標(biāo)點(diǎn)擊落子功能的實(shí)現(xiàn):添加鼠標(biāo)事件處理函數(shù)MouseDown(),先獲取點(diǎn)擊點(diǎn)位置坐標(biāo),再判斷出點(diǎn)擊點(diǎn)是否在棋盤(pán)內(nèi)且無(wú)子,當(dāng)點(diǎn)擊點(diǎn)可落子時(shí),就在棋盤(pán)上畫(huà)出棋子,讓wzq[19][19]記錄該點(diǎn)棋子信息,把該手棋的具體坐標(biāo)交給qi[bushu],用于悔棋操作,后檢查游戲是否形成五子連珠,完成本次落子任務(wù)。具體代碼如下:privat(yī)evoidpictureBox1_MouseDown(objectsender,MouseEventArgse){intx,y;x=(e.X-20)/20;y=(e.Y—30)/20;if(star==true&&x〉=0&&x<19&&y〉=0&&y<19){if(wzq[x,y]==0){Graphicsg=this.pictureBox1.CreateGraphics();Brushb;bushu++;if(colorwhite){b=newSolidBrush(Color.White);wzq[x,y]=1;colorwhite=false;}else{b=newSolidBrush(Color.Black);wzq[x,y]=—1;colorwhite=true;}g.FillEllipse(b,20*x+20,20*y+30,20,20);b。Dispose();g.Dispose();gameOver(x,y);qi[bushu]=x*100+y;}}}鼠標(biāo)點(diǎn)擊落子功能的運(yùn)行過(guò)程是,獲取點(diǎn)擊點(diǎn)坐標(biāo)并進(jìn)行提取處理,方便棋子畫(huà)在交叉線上判斷點(diǎn)擊點(diǎn)是否在棋盤(pán)內(nèi),如果在棋盤(pán)內(nèi)。再判斷點(diǎn)擊點(diǎn)是否有棋子,如果沒(méi)有,就根據(jù)上一手棋的顏色在點(diǎn)擊點(diǎn)畫(huà)上相反顏色的棋子。調(diào)用gameOver(x,y)方法,判斷是否形成五子連珠,把落子點(diǎn)記錄到qi[bushu]數(shù)組中.3。檢查游戲是否形成五子連珠,判斷游戲是否結(jié)束功能:新建gameOver()函數(shù),進(jìn)行循環(huán)掃描橫豎撇捺四方向上有無(wú)黑子或白子形成五子連珠棋形,判斷游戲是否結(jié)束,是否彈出勝負(fù)提示框。具體代碼如下:privatevoidgameOver(intx,inty){intxx,yy;if(x〈4)xx=0;elsexx=x-4;if(y<4)yy=0;elseyy=y—4;inti,j,a;for(i=xx;i<15;i++){a=0;for(j=i;j<i+5;j++){a=a+wzq[j,y];if(a==5){MessageBox.Show(”白棋勝!”);star=false;return;}if(a==—5){MessageBox.Show(”黑棋勝!");star=false;return;}}}……}先獲取下棋點(diǎn)的坐標(biāo)并轉(zhuǎn)化為棋盤(pán)上對(duì)應(yīng)的棋子坐標(biāo),判斷棋子在棋盤(pán)上的位子是否在棋盤(pán)邊緣。如果是,就從棋盤(pán)(0,0)位置開(kāi)始向后掃描;不是,則從點(diǎn)擊點(diǎn)棋子坐標(biāo)向左上方移動(dòng)四個(gè)交叉位,開(kāi)始向后掃描。進(jìn)行循環(huán)掃描橫豎撇捺四方向上有無(wú)黑子或白子形成五子連珠棋形,進(jìn)而判斷游戲是否結(jié)束,根據(jù)情況決定是否彈出勝負(fù)提示框。4.讓子功能實(shí)現(xiàn):在模式三中,為了增加游戲難度,開(kāi)發(fā)者首創(chuàng)讓子功能.開(kāi)局后,先進(jìn)行讓子布局。一般都是黑棋先行,在這里玩家執(zhí)黑,讓電腦1子,棋盤(pán)上變成了電腦執(zhí)白先行1子,白棋落在天元位置上,難度一般.玩家贏后,挑戰(zhàn)難度+1,玩家讓電腦2子,棋盤(pán)上電腦執(zhí)白先行2子,白棋落在天元位置左右兩側(cè),難度適中,適合一段棋手挑戰(zhàn)。玩家贏兩局后,挑戰(zhàn)難度+1,玩家讓電腦3子,棋盤(pán)上電腦執(zhí)白先行3子,考錄到一般玩家沒(méi)有如此高深棋力,因此白棋分散落在棋盤(pán)交叉線上,難度相對(duì)適中,適合一段及以上棋手挑戰(zhàn)。讓4子和5子也是一樣的原理,難度較高,適合二段及以上棋手挑戰(zhàn)。具體代碼如下:privatevoidpictureBox1_MouseMove(objectsender,MouseEventArgse){if(jushu==1&&wzq[9,9]==0&&star==true){Graphicsg=this.pictureBox1.CreateGraphics();Brushb;b=newSolidBrush(Color.White);wzq[9,9]=1;colorwhite=false;g.FillEllipse(b,20*9+20,20*9+30,20,20);b.Dispose();g.Dispose();}……}鼠標(biāo)移動(dòng)讓子功能的運(yùn)行過(guò)程是,判斷是否剛剛開(kāi)局,如果剛開(kāi)局,就根據(jù)贏棋局?jǐn)?shù)進(jìn)行讓子布局,把讓電腦先下的棋子在棋盤(pán)上畫(huà)出來(lái)。如果不是剛開(kāi)局,說(shuō)明已經(jīng)對(duì)讓子布局處理過(guò),則跳過(guò)不再處理。5。模式選擇窗口到各模式的跳轉(zhuǎn)功能實(shí)現(xiàn):新建四個(gè)window窗體,各自添加按鈕控件,為模式選擇窗口添加四個(gè)模式跳轉(zhuǎn)按鈕并對(duì)其建立點(diǎn)擊事件,完成模式窗口到各模式的跳轉(zhuǎn).具體函數(shù)代碼如下:privatevoidbutton1_Click(objectsender,EventArgse){Form3f3=newForm3();this。Hide();DialogResultdr=f3.ShowDialog();if(dr==DialogResult.OK)this。Visible=true;}調(diào)用此函數(shù)后,會(huì)彈出模式一游戲窗口。其余跳轉(zhuǎn)按鈕代碼處理與此相似,只是彈出的窗體不同,進(jìn)入的模式窗口也就不同,也就實(shí)現(xiàn)了模式窗口的跳轉(zhuǎn)功能。6.人機(jī)對(duì)戰(zhàn)電腦下棋功能:添加電腦下棋方法AiGo(),循環(huán)掃描棋盤(pán)上的棋形,算出最優(yōu)下棋點(diǎn)坐標(biāo),處理代碼如下:privatevoidAiGo(){……for(i=0;i<19;i++)for(j=0;j<19;j++){if(a1[x1,y1]<a1[i,j]){y1=j(luò);x1=i;}}for(i=0;i<19;i++)for(j=0;j<19;j++){if(a2[x2,y2]<a2[i,j]){y2=j;x2=i;}}if(a2[x2,y2]>=a1[x1,y1]){px=x2;py=y2;}else{px=x1;py=y1;}}該算法先對(duì)棋盤(pán)上的棋子進(jìn)行循環(huán)掃描,分析橫豎撇捺四方向上的棋子分布情況,算出黑白棋子在棋盤(pán)上各點(diǎn)的棋形得分情況,分?jǐn)?shù)越高,該點(diǎn)越重要,此部分為函數(shù)中省略部分,由于代碼量龐大,不再闡述。接下來(lái)對(duì)是循環(huán)比較,分別找出黑白棋子在棋盤(pán)上的最高得分點(diǎn)坐標(biāo),進(jìn)而比較出二者中的得分最高點(diǎn)坐標(biāo),即最優(yōu)下棋點(diǎn)坐標(biāo)。7.初始化功能的實(shí)現(xiàn):privatevoidOnStart(){for(inti=0;i〈19;i++)for(intj=0;j〈19;j++)wzq[i,j]=0;colorwhite=false;star=true;bushu=0;pictureBox1。Refresh();}在每個(gè)模式中都需對(duì)窗口界面進(jìn)行初始化,對(duì)各參數(shù)進(jìn)行初始化處理。8.返回功能的實(shí)現(xiàn):privat(yī)evoidbutton1_Click(objectsender,EventArgse){this.DialogResult=DialogResult。OK;this.Close();}關(guān)閉子窗體,恢復(fù)隱藏的父窗體。遇到的問(wèn)題及解決方案問(wèn)題1:窗口間的跳轉(zhuǎn),實(shí)現(xiàn)不了。解決方法:查找資料,上網(wǎng)學(xué)習(xí),百度知道,當(dāng)然搜索到的答案不一定正確且不全面,需要反復(fù)嘗試,于是經(jīng)過(guò)慢慢嘗試,解決了窗口跳轉(zhuǎn)問(wèn)題。問(wèn)題2:在窗口中的棋盤(pán)上畫(huà)棋子,棋子有時(shí)不會(huì)落在交叉線上。解決方法:經(jīng)過(guò)仔細(xì)觀察,總結(jié)規(guī)律,發(fā)現(xiàn)畫(huà)棋子用的方法不對(duì),畫(huà)在棋盤(pán)上的棋子坐標(biāo)與棋盤(pán)上的交叉點(diǎn)有出入。經(jīng)過(guò)嘗試,找到了方法,于是改變了畫(huà)棋盤(pán)的方法,讓每一個(gè)交叉點(diǎn)都有具體的坐標(biāo),這樣,不管鼠標(biāo)點(diǎn)在哪里,想辦法在交叉點(diǎn)坐標(biāo)畫(huà)棋子就可以了。問(wèn)題3:實(shí)現(xiàn)悔棋功能時(shí),想著把最后下的棋子去掉,卻實(shí)現(xiàn)不了。解決方法:靜下心來(lái),仔細(xì)看自己編寫(xiě)的代碼,模擬電腦運(yùn)行調(diào)用程序的先后順序看代碼,想象運(yùn)行的結(jié)果,于是發(fā)現(xiàn)悔棋的棋子信息是初始化了,但沒(méi)有在棋盤(pán)上表現(xiàn)出來(lái),沒(méi)想到好辦法,只好麻煩電腦再重新畫(huà)出棋盤(pán),循環(huán)畫(huà)出悔棋后存在的棋子。問(wèn)題4:判斷游戲是否結(jié)束,掃描是否產(chǎn)生五子連珠,老是判斷出錯(cuò)誤。解決方法:經(jīng)過(guò)請(qǐng)教度娘后,借鑒了前輩們的方法,完成了游戲結(jié)果分析函數(shù)。問(wèn)題5:加載自己處理的圖片作為游戲棋盤(pán)背景,卻加載不進(jìn)去或圖片不管用。解決方法:直接在屬性中設(shè)置背景圖片.問(wèn)題6:人機(jī)對(duì)戰(zhàn),機(jī)器下棋功能的實(shí)現(xiàn),算法寫(xiě)不出來(lái),沒(méi)有頭緒,不知道從何處下手。解決方法:經(jīng)過(guò)多次嘗試失敗后,決定借鑒前輩們的算法,于是搜索到了不少算法,心中的貪念讓人無(wú)法取舍,不知道用哪個(gè)好,看著這些算法不知道怎么用,更不清楚原理。幾經(jīng)波折終于意識(shí)到了自己的當(dāng)務(wù)之急是先理解,于是選了一個(gè)注釋全面的算法,深入理解,經(jīng)過(guò)嘗試學(xué)會(huì)了調(diào)用這個(gè)算法的工作過(guò)程,也實(shí)現(xiàn)了機(jī)器下棋的功能。問(wèn)題7:讓子對(duì)戰(zhàn)模式中讓電腦先下的棋子,怎樣畫(huà)在棋盤(pán)上,出現(xiàn)了問(wèn)題。解決方法:首先把這些棋子放在了OnPaint()函數(shù)中來(lái)繪制,結(jié)果有偏差,也沒(méi)弄懂原因,于是嘗試著在OnLButtonDown()函數(shù)中來(lái)繪制,運(yùn)行界面后棋盤(pán)上無(wú)棋子,結(jié)果鼠標(biāo)點(diǎn)擊的一瞬間出現(xiàn)了3顆棋子,這才意識(shí)到鼠標(biāo)事件產(chǎn)生了沖突,也想到了在點(diǎn)擊鼠標(biāo)時(shí),鼠標(biāo)的移動(dòng)事件先觸發(fā),然后點(diǎn)擊事件才被觸發(fā)。想到做到,馬上把這些棋子放在了OnMouseMove()中來(lái)繪制,運(yùn)行正確,讓子對(duì)戰(zhàn)功能完成了.問(wèn)題8:在模式二的制作中,發(fā)現(xiàn)模式一的一些功能模式二都有用到,于是想到了繼承,想讓模式二繼承模式一,嘗試后發(fā)現(xiàn),繼承后的模式二運(yùn)行界面和模式一很像,但是模式二中自建的按鈕卻不見(jiàn)了,變成了模式一中存在的按鈕,和設(shè)計(jì)計(jì)劃產(chǎn)生了誤差。實(shí)現(xiàn)不了。解決方法:經(jīng)過(guò)取舍,決定用笨方法,不怕麻煩,方法重寫(xiě)一遍,雖然代碼存在冗余,但為了更好的完成設(shè)計(jì)計(jì)劃,先這樣處理,只能以后找機(jī)會(huì)來(lái)完善了。總結(jié)與體會(huì)通過(guò)本次課程設(shè)計(jì),學(xué)到了很多知識(shí),接觸了一些以前沒(méi)接觸過(guò)的領(lǐng)域,對(duì)C#編程有了深入的了解,也學(xué)會(huì)了很多解決問(wèn)題的方法,認(rèn)識(shí)到了自己的不足,同時(shí)發(fā)現(xiàn)原來(lái)自己也是可以做出小游戲的。在做這個(gè)項(xiàng)目之前,想到了自己會(huì)的和能實(shí)現(xiàn)的功能有哪些,自己會(huì)的也就窗口跳轉(zhuǎn)和鼠標(biāo)處理事件等.于是想著用到這些知識(shí)的項(xiàng)目有哪些是自認(rèn)為可以輕松實(shí)現(xiàn)的,經(jīng)過(guò)對(duì)比選擇了五子棋小游戲開(kāi)發(fā),因?yàn)檫@個(gè)項(xiàng)目中的棋盤(pán)自己是能畫(huà)出來(lái)的。對(duì)于下棋而言,也就是一個(gè)鼠標(biāo)處理事件,也能實(shí)現(xiàn)。難點(diǎn)在于人機(jī)對(duì)戰(zhàn)的算法上。于是清楚了自己接下來(lái)要做的事情,對(duì)于未知的先不要去考慮了,自己有多大能耐還不清楚,先做會(huì)做的,能實(shí)現(xiàn)再說(shuō).不做不知道,一做嚇一跳,想著簡(jiǎn)單,做起來(lái)難,往往是在人最得意的時(shí)候來(lái)一記狠得,讓人都不知道怎么著程序突然就報(bào)錯(cuò)了。經(jīng)過(guò)慢慢嘗試,一步步做下來(lái),終于完成了基本功能的實(shí)現(xiàn).接下來(lái)就是一步一步的去完善這個(gè)游戲,如何設(shè)計(jì)的更加有難度與挑戰(zhàn)性,比如在游戲中玩家可以選擇不同的模式來(lái)進(jìn)行游戲,在讓子模式三中玩家可以讓電腦先下幾顆棋子,在玩家獲勝后會(huì)在棋盤(pán)中部上方顯示讓子數(shù)量滿足玩家的虛榮心與好勝心,激起玩家的挑戰(zhàn)欲望;如何設(shè)計(jì)的更加有趣味性,比如在模式四中玩家可以通過(guò)下殘局獲得榮譽(yù)稱號(hào),而且還是棋力評(píng)級(jí)稱號(hào),讓玩家對(duì)未知的棋局產(chǎn)生興趣。另外,對(duì)于這個(gè)游戲還有很多需要改進(jìn)的地方,比如讓子模式可以把固定的讓子位置做成隨機(jī)的,這樣給玩家一種未知的探險(xiǎn)感覺(jué),讓玩家全身心的融入到游戲中。還可以在游戲中加入排行榜,得分記錄等功能。對(duì)于這些問(wèn)題,由于時(shí)間問(wèn)題只能在以后的進(jìn)一步學(xué)習(xí)過(guò)程中想辦法對(duì)其進(jìn)行解決與改進(jìn)。項(xiàng)目能夠按計(jì)劃完成,需要技術(shù)與知識(shí)的支持,也少不了個(gè)人的堅(jiān)持與努力,為了以后更好的完成項(xiàng)目,而時(shí)刻努力著。學(xué)號(hào):學(xué)號(hào):實(shí)習(xí)論文(本科)學(xué)院數(shù)學(xué)與統(tǒng)計(jì)學(xué)院專業(yè)統(tǒng)計(jì)學(xué)年級(jí)2013級(jí)姓名論文題目基于C++的2048游戲設(shè)計(jì)指導(dǎo)教師職稱講師成績(jī)2016年10月16日目錄TO(shè)C\o”1-3"\h\z\u摘要PAGEREF_Toc464584600\h1HYPERLINK\l”_Toc464584601"關(guān)鍵詞PAGEREF_Toc464584601\h1AbstractPAGEREF_Toc464584602\h1HYPERLINK\l"_Toc464584603"KeywordsPAGEREF_Toc464584603\h1HYPERLINK\l"_Toc464584604”前言PAGEREF_Toc464584604\h1HYPERLINK\l”_Toc464584605"1實(shí)習(xí)前的準(zhǔn)備PAGEREF_Toc464584605\h12實(shí)習(xí)目的PAGEREF_Toc464584606\h23實(shí)習(xí)任務(wù)PAGEREF_Toc464584607\h2HYPERLINK\l”_Toc464584608"4實(shí)習(xí)內(nèi)容PAGEREF_Toc464584608\h2HYPERLINK\l”_Toc464584609"4.12048游戲簡(jiǎn)介PAGEREF_Toc464584609\h24.22048模塊需求分析PAGEREF_Toc464584610\h3HYPERLINK\l"_Toc464584611”4.3UI界面的規(guī)劃設(shè)計(jì)PAGEREF_Toc464584611\h3HYPERLINK\l”_Toc464584612"4.4頭文件的需求分析PAGEREF_Toc464584612\h4HYPERLINK\l"_Toc464584613”4.5隨機(jī)數(shù)的生成PAGEREF_Toc464584613\h44.6圖片資源的導(dǎo)入和加載PAGEREF_Toc464584614\h5HYPERLINK\l"_Toc464584615"4.7主體算法的分析和實(shí)現(xiàn)PAGEREF_Toc464584615\h6HYPERLINK\l”_Toc464584616"4。8游戲結(jié)束的判斷PAGEREF_Toc464584616\h84.9游戲最終運(yùn)行成果PAGEREF_Toc464584617\h9HYPERLINK\l"_Toc464584618”5個(gè)人總結(jié)PAGEREF_Toc464584618\h10參考文獻(xiàn)PAGEREF_Toc464584619\h10基于C++的2048游戲設(shè)計(jì)學(xué)生姓名:學(xué)號(hào):學(xué)院:數(shù)學(xué)與統(tǒng)計(jì)學(xué)院專業(yè):統(tǒng)計(jì)學(xué)指導(dǎo)教師:職稱:講師摘要:專業(yè)實(shí)習(xí),是教學(xué)計(jì)劃中的一門(mén)重要的必修課和綜合實(shí)踐課程,是培養(yǎng)學(xué)生的專業(yè)素質(zhì)和實(shí)際能力的重要實(shí)踐環(huán)節(jié).通過(guò)此次的C++實(shí)習(xí),掌握了程序設(shè)計(jì)的基本理論與方法,能夠運(yùn)用基本代碼進(jìn)行簡(jiǎn)單的程序設(shè)計(jì),運(yùn)行基本的游戲程序.關(guān)鍵詞:C++;設(shè)計(jì);程序TheGameDesignof2048BasedonC++Abstract:Theimportantrequiredcourseintheteachingplanandcomprehensivepracticecurriculum,professionalinternships,istocultivatethestudents'professionalqualityandpracticalabilityoftheimportantlinkofpractice。ThroughtheC++practice,wegraspthebasictheoryandmethodofprogramdesign,beabletousebasiccodetobuildsimpleprogramandrunit.Keywords:C++;Design;Program前言這次實(shí)習(xí)是我們畢業(yè)前的一次實(shí)踐性實(shí)習(xí)。為了拓展我們的知識(shí)面,增強(qiáng)我們對(duì)所學(xué)知識(shí)的應(yīng)用能力,增加我們?cè)谏鐣?huì)競(jìng)爭(zhēng)中的經(jīng)驗(yàn),鍛煉和提高我們的綜合素質(zhì),以便在以后畢業(yè)后能真正走入社會(huì),并且能夠在生活和工作中很好地處理各方面的問(wèn)題,學(xué)校特地從北京達(dá)內(nèi)科技集團(tuán)聘請(qǐng)了專業(yè)的C++工程師講師來(lái)對(duì)我們進(jìn)行專業(yè)實(shí)訓(xùn),進(jìn)一步運(yùn)用所學(xué)知識(shí)分析和解決實(shí)際專業(yè)問(wèn)題,從而為就業(yè)打下良好的基礎(chǔ)。1實(shí)習(xí)前的準(zhǔn)備學(xué)校對(duì)我們的實(shí)習(xí)非常重視,本著通過(guò)實(shí)習(xí)來(lái)檢驗(yàn)本專業(yè)教學(xué)中存在的問(wèn)題,改進(jìn)教學(xué)工作的目的,提前就為我們聯(lián)系好了與專業(yè)相關(guān)的單位來(lái)做實(shí)習(xí)培訓(xùn).在正式進(jìn)入機(jī)房實(shí)訓(xùn)前,講師還專門(mén)做了一場(chǎng)關(guān)于實(shí)習(xí)內(nèi)容的分享會(huì),介紹了實(shí)習(xí)的基本情況、基本要求、實(shí)習(xí)項(xiàng)目的基本情況,學(xué)習(xí)和了解實(shí)習(xí)項(xiàng)目的相關(guān)文件和資料,幫助我們更系統(tǒng)地了解和熟悉接下來(lái)的實(shí)習(xí)課程內(nèi)容。2實(shí)習(xí)目的1。培養(yǎng)理論聯(lián)系實(shí)際的思想作風(fēng)和工作作風(fēng);2.培養(yǎng)作為計(jì)算機(jī)類(lèi)工作人員的專業(yè)素質(zhì);3。培養(yǎng)獨(dú)立或與團(tuán)隊(duì)一起開(kāi)展信息處理工作的基本業(yè)務(wù)能力。3實(shí)習(xí)任務(wù)1。通過(guò)實(shí)際操作,了解并逐步熟悉掌握C++;2。掌握常用軟件的熟練操作,為今后所期望的專業(yè)方向做準(zhǔn)備;3.在教師指導(dǎo)下,利用C++編程,完成獨(dú)立的游戲編程任務(wù);4。最后在實(shí)習(xí)指導(dǎo)老師的指導(dǎo)下,參與信息處理與計(jì)算工作,完成一篇相關(guān)的實(shí)習(xí)論文(或?qū)嵙?xí)記錄)。4實(shí)習(xí)內(nèi)容4。12048游戲簡(jiǎn)介2048游戲是一款簡(jiǎn)單而流行的數(shù)字游戲,屬于益智游戲。操作界面上有16個(gè)格子,初始時(shí)會(huì)有兩個(gè)格子上安放了兩個(gè)數(shù)字2,每次可以選擇上下左右其中一個(gè)方向去滑動(dòng).每滑動(dòng)一次,所有的數(shù)字方塊都會(huì)往滑動(dòng)的方向靠攏。兩個(gè)相同數(shù)字方塊撞在一起之后合并成為他們的和。每次操作之后會(huì)在空白的方格處隨機(jī)生成一個(gè)2或者4(其他模式會(huì)有所改變),最終得到一個(gè)“2048”的方塊就是勝利了。由于規(guī)則簡(jiǎn)單,各種版本和平臺(tái)上均有該款游戲.相信有不少人都玩過(guò)它,但是操作界面只有半個(gè)巴掌大的一個(gè)游戲,背后卻要用到類(lèi)似隨機(jī)數(shù)的產(chǎn)生、大批量數(shù)據(jù)的處理、UI設(shè)計(jì)等任務(wù),真的不算是一個(gè)很簡(jiǎn)單的工作。本次的游戲程序設(shè)計(jì)任務(wù)將運(yùn)用C++來(lái)實(shí)現(xiàn)。4.22048模塊需求分析首先分析了這款游戲的功能需求。2048游戲一般由以下幾個(gè)模塊來(lái)構(gòu)成:1。矩陣方塊;2。控制模塊;3.計(jì)算模塊;4.輸出模塊.每個(gè)模塊來(lái)實(shí)現(xiàn)2048游戲的各項(xiàng)功能:方向移動(dòng)、方塊合并、記錄當(dāng)前數(shù)據(jù)和輸出計(jì)分結(jié)果、游戲勝利或失敗后執(zhí)行結(jié)束游戲操作等。4。3UI界面的規(guī)劃設(shè)計(jì)首先進(jìn)行UI界面的規(guī)劃設(shè)計(jì)。創(chuàng)建一個(gè)800×600的背景模塊,在模塊左側(cè)這里我們需要16個(gè)方塊,按照4×4的規(guī)格排列整齊。模塊右側(cè)的空白區(qū)域需要添加功能鍵:上、下、左、右、重置、關(guān)閉.另外我們還需要再添加一個(gè)計(jì)分標(biāo)簽,用來(lái)計(jì)算并輸出游戲得分。最后按照模塊功能與人的操作習(xí)慣,將標(biāo)簽分別排列在合適的位置。最終的UI界面如圖1所示:圖1UI界面(矩陣方塊)設(shè)計(jì)完成以后,接著來(lái)開(kāi)始程序代碼的編寫(xiě)。4。4頭文件的需求分析首先分析需要用到的頭文件。第一步需要生成隨機(jī)數(shù),第二步要為16個(gè)矩形模塊填充隨機(jī)數(shù)所對(duì)應(yīng)的圖片,第三步為操作界面添加背景,第四步在游戲成功或失敗時(shí)即時(shí)輸出信息。分析完成以后將所有需要用到的頭文件都寫(xiě)入show。cpp文件里:#include"show.h”#include”ui_show.h"#include<ctime〉#include<cstdlib>#include<QPixmap〉#include<QPalette〉#include〈QMessageBox>QDialog(parent),ui(newUi::Show)4.5隨機(jī)數(shù)的生成接下來(lái)我們開(kāi)始寫(xiě)入生成兩個(gè)隨機(jī)數(shù)和分?jǐn)?shù)從零開(kāi)始的代碼,同時(shí)加入圖片加載和聲明面板對(duì)象的代碼:{ui—>setupUi(this);srand(time(NULL));for(inti=0;i<4;i++){for(intj=0;j<4;j++){map[i][j]=0;}}sui();sui();fen=0;QPixmappix(":/image/bj.jpg”);//加載圖片QPalettepalette;//聲明畫(huà)板對(duì)象palette。setBrush(this-〉backgroundRole(),QBrush(pix));//設(shè)置畫(huà)板樣式this—〉setPalette(palette);//設(shè)置到我們的面板上}voidShow::sui(){do{intx=rand()%4;inty=rand()%4;if(map[x][y]==0){if(rand()%20==4)map[x][y]=4;elsemap[x][y]=2;break;}}while(1);}4。6圖片資源的導(dǎo)入和加載將所有準(zhǔn)備好的圖片資源載入設(shè)計(jì)程序,以便后續(xù)的圖片加載工作。隨后我們進(jìn)入為16個(gè)矩形模塊和背景加載其各對(duì)應(yīng)隨機(jī)數(shù)圖片的設(shè)計(jì)過(guò)程,這個(gè)模塊以地址形式實(shí)現(xiàn):voidShow::paintEvent(QPaintEvent*){QImageimg;img.load(":/image/"+QString::number(map[0][0])+"。png");ui—〉show_1->setPixmap(QPixmap::fromImage(img));img.load(”:/image/"+QString::number(map[0][1])+".png");ui->show_2—>setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[0][2])+".png");ui—>show_3-〉setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[0][3])+".png”);ui-〉show_4—>setPixmap(QPixmap::fromImage(img));img。load(":/image/”+QString::number(map[1][0])+".png");ui—〉show_5-〉setPixmap(QPixmap::fromImage(img));img.load(":/image/”+QString::number(map[1][1])+".png");ui—>show_6-〉setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[1][2])+".png”);ui—>show_7->setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[1][3])+"。png”);ui—>show_8—>setPixmap(QPixmap::fromImage(img));img.load(":/image/”+QString::number(map[2][0])+"。png");ui—>show_9->setPixmap(QPixmap::fromImage(img));img。load(":/image/”+QString::number(map[2][1])+".png”);ui->show_10-〉setPixmap(QPixmap::fromImage(img));img。load(”:/image/"+QString::number(map[2][2])+".png");ui-〉show_11—>setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[2][3])+"。png”);ui->show_12-〉setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[3][0])+”。png");ui->show_13->setPixmap(QPixmap::fromImage(img));img.load(":/image/"+QString::number(map[3][1])+"。png");ui-〉show_14->setPixmap(QPixmap::fromImage(img));img。load(":/image/"+QString::number(map[3][2])+"。png");ui—〉show_15->setPixmap(QPixmap::fromImage(img));img。load(”:/image/"+QString::number(map[3][3])+”.png”);ui->show_16—〉setPixmap(QPixmap::fromImage(img));ui->fen->setText(QString::number(fen));}4.7主體算法的分析和實(shí)現(xiàn)接下來(lái)進(jìn)入主要的算法設(shè)計(jì)步驟.在此根據(jù)2048游戲算法的功能需求和功能模塊,對(duì)主要算法進(jìn)行分析并實(shí)現(xiàn)。對(duì)于控制模塊,一共有上、下、左、右、重置、關(guān)閉六個(gè)控制功能鍵。對(duì)于左移功能鍵的算法,每點(diǎn)擊一次,所有的數(shù)字方塊都會(huì)往滑動(dòng)的方向靠攏。兩個(gè)相同數(shù)字方塊撞在一起之后合并成為他們的和。每次操作之后會(huì)在空白的方格處隨機(jī)生成一個(gè)2或者4.此時(shí)分?jǐn)?shù)也在累計(jì)增加。這一部分中重置和關(guān)閉這兩個(gè)功能鍵相對(duì)與其他功能鍵獨(dú)立,而上、下、左、右四個(gè)功能鍵的算法有一定的相似之處,所以以下僅詳細(xì)展示左移功能鍵的代碼?,F(xiàn)在開(kāi)始對(duì)這六個(gè)功能鍵進(jìn)行代碼編寫(xiě):voidShow::on_pushButton_3_clicked(){//resetfor(inti=0;i<4;i++){for(intj=0;j<4;j++){map[i][j]=0;}}sui();sui();fen=0;update();}voidShow::on_clo_clicked(){//clothis->close();}voidShow::on_pushButton_2_clicked(){//upfor(intk=0;k〈3;k++){for(inti=1;i<4;i++){for(intj=0;j<4;j++){if(map[i-1][j]==0){map[i-1][j]=map[i][j];map[i][j]=0;}else{if(map[i][j]==map[i—1][j]){map[i—1][j]=map[i-1][j]+map[i][j];map[i][j]=0;fen+=map[i—1][j];}}}}}if(go()==1){sui();//產(chǎn)生隨機(jī)數(shù)}update();//更新界面}Show::~Show(){deleteui;}voidShow::on_pushButton_clicked(){//right}voidShow::on_pushButton_5_clicked(){//down}voidShow::on_pushButton_4_clicked(){//left}4。8游戲結(jié)束的判斷最后一個(gè)需解決的問(wèn)題就是對(duì)于游戲是否結(jié)束的判斷,其主要體現(xiàn)在控制和計(jì)算模塊.如果游戲未能達(dá)成任務(wù)而失敗,輸出“失敗"和“游戲結(jié)束”的信息,同時(shí)只有關(guān)閉和重置功能鍵可以被操作:intShow::go(){for(inti=0;i<4;i++){for(intj=0;j<4;j++){if(map[i][j]==0){return1;}}}return—1;}voidShow::pan(){intarr[4][2]={-1,0,0,-1,0,1,1,0};for(inti=0;i<4;i++){for(intj=0;j<4;j++){if(map[i][j]==0){return;}else{for(intloop=0;loop<4;loop++){intx=i+arr[loop][0];inty=j+arr[loop][1];if(x<0||x>3||y>3||y<0){continue;}elseif(map[x][y]==0){return;}elseif(map[i][j]==map[x][y]){return;}}}}}if(QMessageBox::question(this,tr("失敗”),tr(”游戲結(jié)束”);QMessageBox::Yes|QMessageBox::No,QMessageBox::Ok)==QMessageBox::Yes){on_pushButton_3_clicked();}else{this—>close();}}以上我們對(duì)2048這個(gè)游戲的程序設(shè)計(jì)部分的工作已經(jīng)完全結(jié)束,接下來(lái)構(gòu)建程序,檢查并修改錯(cuò)誤,就可以打開(kāi)并運(yùn)行這個(gè)游戲了。4。9游戲最終運(yùn)行成果最終的游戲界面如圖2所示:圖2點(diǎn)擊右側(cè)功能鍵,即可開(kāi)始游戲.5個(gè)人總結(jié)通過(guò)這次實(shí)習(xí)我很好地掌握了如何將C++實(shí)際運(yùn)用到游戲開(kāi)發(fā)中去,檢驗(yàn)了自己學(xué)習(xí)的成效、檢測(cè)了自己的所缺。這就形成了從實(shí)踐中學(xué)習(xí),從學(xué)習(xí)中實(shí)踐的良性循環(huán)。這是一個(gè)很好的鍛煉機(jī)會(huì),能將所學(xué)的理論知識(shí)聯(lián)系于實(shí)際,我感覺(jué)學(xué)習(xí)與實(shí)踐是密不可分的。當(dāng)今中國(guó)經(jīng)濟(jì)飛速發(fā)展,國(guó)內(nèi)外經(jīng)濟(jì)不斷變化,在機(jī)會(huì)越來(lái)越多的同時(shí),也出現(xiàn)了更多的題目,有了更多更艱巨的挑戰(zhàn),這也就對(duì)人才的要求越來(lái)越高。我們不僅要學(xué)好課本里的知識(shí),還要主動(dòng)走進(jìn)社會(huì),積極在實(shí)踐中學(xué)習(xí)其他的東西,不斷增加自己的經(jīng)驗(yàn),全方面武裝自己,才能在這個(gè)社會(huì)有立足之地甚至擁有不敗之地.參考文獻(xiàn)[1]
譚浩強(qiáng).C程序設(shè)計(jì)教程[M]。清華大學(xué)出版社,2007。?[2]
榮欽科技.Visual
C++游戲編程基礎(chǔ)[M]。電子工業(yè)出版社,2005。
[3]
王浩.Visual
C++游戲開(kāi)發(fā)經(jīng)典案例詳解[M]。清華出版社,2010.[4]劉明軍.C語(yǔ)言程序設(shè)計(jì)[M]。電子工業(yè)出版社,2007.[5]凌云。C語(yǔ)言程序設(shè)計(jì)與實(shí)踐[M]。機(jī)械工業(yè)出版社,2010.[6]StanleyB。LippmanC++primer[M]。人民郵電出版社,2006.[7]SteveMaguire。編程精粹[M]。人民郵電出版社,2009。[8]AndrewKoenig.C陷阱與缺陷[M]。人民郵電出版社,2008?;贑#與單片機(jī)串口通信的投票器李浩東20093101004周守悅20093101012作品的設(shè)計(jì)概述我們知道每年每個(gè)班都需要班委換屆,有很多同學(xué)積極參加競(jìng)選,然而每一次競(jìng)選投票都是大家拿出一張紙,然后再紙上寫(xiě)上自己心目中班委的名字,然后交給監(jiān)票讀票記票,這個(gè)過(guò)程不僅大大浪費(fèi)了大家的寶貴時(shí)間,還有可能出現(xiàn)漏票等情況,體現(xiàn)不了公平公正公開(kāi)。本設(shè)計(jì)是通過(guò)按鈕給班委競(jìng)選人投票,每個(gè)候選人都對(duì)應(yīng)一個(gè)按鈕,投票人如果想投票給某個(gè)人可以按下其對(duì)應(yīng)按鈕,每按下一次改競(jìng)選人的票數(shù)就會(huì)自動(dòng)增加1,每個(gè)人只能按下一次,電腦顯示屏將通過(guò)柱形圖動(dòng)態(tài)的呈現(xiàn)每個(gè)候選人獲得票數(shù)競(jìng)爭(zhēng)的情況以及通過(guò)框圖顯示總票數(shù),不僅使得投票結(jié)果更加公開(kāi)公正,而且也大大節(jié)省了大家的時(shí)間.本設(shè)計(jì)的創(chuàng)新點(diǎn)是通過(guò)柱形圖動(dòng)態(tài)顯示整個(gè)投票過(guò)程,而不是直接顯示到最后投票結(jié)果,更加體現(xiàn)公正公開(kāi)。作品的設(shè)計(jì)與分析主要功能與分析主要使用單片機(jī)和PC機(jī)之間的串口通信,在單片機(jī)硬件上設(shè)置七個(gè)按鍵,其中四個(gè)鍵是用來(lái)給A,B,C,D四個(gè)人投票的,這四個(gè)按鍵每按下一次就自動(dòng)增1,記錄這四個(gè)按鍵按下的總次數(shù)num1,num2,num3,num4,并把四個(gè)數(shù)按順序不斷循環(huán)通過(guò)串口發(fā)給PC機(jī),PC機(jī)通過(guò)串口把這些數(shù)據(jù)存儲(chǔ)下來(lái),并讀出來(lái),通過(guò)C#編程,把這四個(gè)人所獲得的總票數(shù)在picturebox控件上面的柱形圖動(dòng)態(tài)呈現(xiàn)出來(lái),通過(guò)time控件,不斷更新這個(gè)人所獲得的票數(shù),讓投票人通過(guò)柱形圖更加形象直觀的看出每個(gè)被投票人的競(jìng)爭(zhēng)情況,同時(shí)在柱形圖下方有著這四個(gè)人獲得總票數(shù)的真實(shí)數(shù)目。還有一個(gè)按鍵是票數(shù)清零,如果這次投票已經(jīng)完成或者無(wú)效可以按下這個(gè)按鍵,此時(shí)A,B,C,D四個(gè)人的總票數(shù)將變成零。還有一個(gè)按鍵作用是停止投票,如果需要停止這次投票可以按下此鍵,這時(shí)候那四個(gè)投票的按鍵將不可用。最后一個(gè)按鍵的作用是繼續(xù)投票,如需繼續(xù)投票,可按此鍵。其系統(tǒng)設(shè)計(jì)圖如下:PC機(jī)PC機(jī)圖像顯示清零繼續(xù)暫停ABCD單片機(jī)圖像顯示清零繼續(xù)暫停ABCD單片機(jī)數(shù)據(jù)傳輸2.串口通信規(guī)則單片機(jī)與PC機(jī)為了可以進(jìn)行通信,必須要遵守一定的通信規(guī)則,這個(gè)共同的規(guī)則就是通信端口的初始化。通信端口的初始化有以下幾項(xiàng)必須設(shè)置:(1)數(shù)據(jù)的傳輸速率傳輸雙方通過(guò)傳輸線的電壓改變來(lái)交換數(shù)據(jù),但傳輸線的電壓改變的速度必須和接收端的接收速度保持一致,RS—232通常用于異步傳輸,即雙方并沒(méi)有一個(gè)可參考的同步時(shí)鐘作為基準(zhǔn)。由于沒(méi)有一個(gè)參考時(shí)鐘,雙方所發(fā)送的高低電位到底代表幾個(gè)位就不得而知了,要使得雙方的數(shù)據(jù)讀取正常,就要考慮到傳輸速率——波特率,其所代表的意義是每秒鐘所能產(chǎn)生的最大電壓狀態(tài)改變率,或者說(shuō)是每秒鐘可以振蕩的次數(shù).原始信號(hào)經(jīng)過(guò)不同的波特率取樣后,所得的結(jié)果完全不一樣。取樣速度只有原來(lái)的一半時(shí),信號(hào)被跳著取樣,數(shù)據(jù)因此產(chǎn)生錯(cuò)誤。因此通信雙方獲得相同的通信速度是首先要做的事情.(2)數(shù)據(jù)的發(fā)送單位一般串行通信端口所發(fā)送的數(shù)據(jù)是字符類(lèi)型的,若用來(lái)傳輸文件,則會(huì)使用二進(jìn)制的數(shù)據(jù)類(lèi)型。當(dāng)使用字符類(lèi)型時(shí),通常使用ASCII碼,ASCII碼中8個(gè)位形成一個(gè)字符.以實(shí)際的RS-232傳輸來(lái)看,由于大多數(shù)應(yīng)用只是發(fā)送文字碼,因此只要7個(gè)位就可以將ASCII碼的0-127號(hào)字符表達(dá)出來(lái),所有的可見(jiàn)字符都在這個(gè)范圍內(nèi),所以只要7個(gè)數(shù)據(jù)位就足夠了.不同的情況下,會(huì)使用到不同的發(fā)送單位,但使用多少個(gè)位合成一個(gè)字節(jié)必須先行確定.(3)起始位及停止位由于異步串行通信中并沒(méi)有使用同步脈沖作為基準(zhǔn),故接收端完全不知道發(fā)送端何時(shí)將進(jìn)行數(shù)據(jù)的發(fā)送,而當(dāng)發(fā)送端準(zhǔn)備要開(kāi)始發(fā)送數(shù)據(jù)時(shí),發(fā)送端會(huì)在所送出的字符前后分別加上高電位的起始位(邏輯0)及低電位的停止位(邏輯1),它們分別是所謂的起始位和停止位。當(dāng)發(fā)送端要開(kāi)始發(fā)送數(shù)據(jù)時(shí),便將傳輸在線的電位由低電位提升至高電位,而當(dāng)發(fā)送結(jié)束后,再將電位降至低電位.接收端會(huì)因起始位的觸發(fā)(因電壓由低電位升至高電位)而開(kāi)始接收數(shù)據(jù),并因停止位的通知(因電壓維持在低電位)而確切數(shù)據(jù)的字符信號(hào)已經(jīng)結(jié)束。(4)校驗(yàn)位的檢查為了預(yù)防錯(cuò)誤的產(chǎn)生,因此使用校驗(yàn)位作為檢查的機(jī)制;校驗(yàn)位是用來(lái)檢查所發(fā)送數(shù)據(jù)正確性的一種核對(duì)碼,其中又分成奇校驗(yàn)位和偶校驗(yàn)位兩種方式,分別是檢查字符碼中I的數(shù)目是奇數(shù)或偶數(shù)。以偶校驗(yàn)位為例,A的ASCII碼01100001(二進(jìn)制),其中1的數(shù)目是三個(gè),因此校驗(yàn)位便是1,使1的數(shù)目保持偶數(shù)。同理,校驗(yàn)位是奇校驗(yàn)位時(shí),A的校驗(yàn)位便是0,使1的數(shù)目保持奇數(shù)。串口通信協(xié)議由于本設(shè)計(jì)主要從單片機(jī)串口發(fā)送數(shù)據(jù),所以因此有關(guān)串口通信的原理的介紹都是圍繞單片機(jī)講解的。80C51串行口的控制寄存器(1.1)特殊功能寄存器SCONSCON是一個(gè)特殊功能寄存器,用以設(shè)定串行口的工作方式、接收/發(fā)送控制以及設(shè)置狀態(tài)標(biāo)志,字節(jié)地址為98H.SCON寄存器的各位定義如表3-1所示。位76543210字節(jié)地址:98HSM0SM1SM2RENTB8RB8TIRISCON表3—1SCON寄存器SM0和SM1為工作方式選擇位,可選擇四種工作方式,如表3—2所示.SM0SM1方式說(shuō)明波特率000移位寄存器fosc/1201110位異步收發(fā)器(8位數(shù)據(jù))可變10211位異步收發(fā)器(9位數(shù)據(jù))fosc/64或fosc/3211311位異步收發(fā)器(9位數(shù)據(jù))可變表3-2串口通信4種工作方式SM2為多機(jī)通信控制位,主要用于方式2和方式3。當(dāng)接收機(jī)的SM2=1時(shí)可以利用收到的RB8來(lái)控制是否激活RI(RB8=0時(shí)不激活RI,收到的信息丟棄;RB8=1時(shí)收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI,進(jìn)而在中斷服務(wù)中將數(shù)據(jù)從SBUF讀走)。當(dāng)SM2=0時(shí),不論收到的RB8為0和1,均可以使收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI(即此時(shí)RB8不具有控制RI激活的功能)。通過(guò)控制SM2,可以實(shí)現(xiàn)多機(jī)通信。在方式0時(shí),SM2必須是0.在方式1時(shí),若SM2=1,則只有接收到有效停止位時(shí),RI才置1。REN為允許串行接收位。由軟件置REN=1,則啟動(dòng)串行口接收數(shù)據(jù);若軟件置REN=0,則禁止接收。TB8用在方式2或方式3中,是發(fā)送數(shù)據(jù)的第九位,可以用軟件規(guī)定其作用??梢杂米鲾?shù)據(jù)的奇偶校驗(yàn)位,或在多機(jī)通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位(在方式0和方式1中,該位未用).RB8用在方式2或方式3中,是接收到數(shù)據(jù)的第九位,作為奇偶校驗(yàn)位或地址幀/數(shù)據(jù)幀的標(biāo)志位。在方式1時(shí),若SM2=0,則RB8是接收到的停止位。TI,發(fā)送中斷標(biāo)志位.在方式0時(shí),當(dāng)串行發(fā)送第8位數(shù)據(jù)結(jié)束時(shí),或在其它方式,串行發(fā)送停止位的開(kāi)始時(shí),由內(nèi)部硬件使TI置1,向CPU發(fā)中斷申請(qǐng)。在中斷服務(wù)程序中,必須用軟件將其清0,取消此中斷申請(qǐng)。RI,接收中斷標(biāo)志位。在方式0時(shí),當(dāng)串行接收第8位數(shù)據(jù)結(jié)束時(shí),或在其它方式,串行接收停止位的中間時(shí),由內(nèi)部硬件使RI置1,向CPU發(fā)中斷申請(qǐng)。也必須在中斷服務(wù)程序中,用軟件將其清0,取消此中斷申請(qǐng)[7]。(1.2)特殊功能寄存器PCONPCON的字節(jié)地址為87H,它的第7位SMOD是與串口通信波特率的設(shè)置有關(guān)的選擇位。SMOD(PCON.7)為波特率倍增位。在串行口方式1、方式2、方式3時(shí),波特率與SMOD有關(guān),當(dāng)SMOD=1時(shí),波特率提高一倍.復(fù)位時(shí),SMOD=0。(2)80C51單片機(jī)串行口的工作方式(2.1)方式0設(shè)置SCON寄存器的SM0、SM1=00時(shí),串行口工作于方式0。此時(shí),串行口為同步移位寄存器的輸入輸出方式。主要用于擴(kuò)展并行輸入或輸出口。數(shù)據(jù)由RXD(P3.0)引腳輸入或輸出,同步移位脈沖由TXD(P3.1)引腳輸出。發(fā)送和接收均為8位數(shù)據(jù),低位在先,高位在后。波特率固定為fosc/12。其中fosc為時(shí)鐘頻率.(2.2)方式1設(shè)置SCON寄存器的SM0、SM1=01時(shí),串行口工作于方式1.方式1是10位數(shù)據(jù)的異步通信口。TXD為數(shù)據(jù)發(fā)送引腳,RXD為數(shù)據(jù)接收引腳,傳送一幀數(shù)據(jù)的格式如圖所示。其中1位起始位,8位數(shù)據(jù)位,1位停止位。用軟件置REN為1時(shí),接收器以所選擇波特率的16倍速率采樣RXD引腳電平,檢測(cè)到RXD引腳輸入電平發(fā)生負(fù)跳變時(shí),則說(shuō)明起始位有效,將其移入輸入移位寄存器,并開(kāi)始接收這一幀信息的其余位。接收過(guò)程中,數(shù)據(jù)從輸入移位寄存器右邊移入,起始位移至輸入移位寄存器最左邊時(shí),控制電路進(jìn)行最后一次移位。當(dāng)RI=0,且SM2=0(或接收到的停止位為1)時(shí),將接收到的9位數(shù)據(jù)的前8位數(shù)據(jù)裝入接收SBUF,第9位(停止位)進(jìn)入RB8,并置RI=1,向CPU請(qǐng)求中斷.方式一的輸入輸出圖如圖3—8、3—9所示。圖3-8方式1輸入圖3-9方式1輸出(2.3)方式2和方式3設(shè)置SCON寄存器的SM0、SM1=10時(shí),串行口工作于方式2,當(dāng)SM0、SM1=11時(shí),串行口工作于方式3。方式2或方式3為11位數(shù)據(jù)的異步通信口.TXD為數(shù)據(jù)發(fā)送引腳,RXD為數(shù)據(jù)接收引腳。方式2和方式3時(shí)起始位1位,數(shù)據(jù)9位(含1位附加的第9位,發(fā)送時(shí)為SCON中的TB8,接收時(shí)為RB8),停止位1位,一幀數(shù)據(jù)為11位.方式2的波特率固定為晶振頻率的1/64或1/32,方式3的波特率由定時(shí)器T1的溢出率決定。方式2和方式3輸出:發(fā)送開(kāi)始時(shí),先把起始位0輸出到TXD引腳,然后發(fā)送移位寄存器的輸出位(D0)到TXD引腳。每一個(gè)移位脈沖都使輸出移位寄存器的各位右移一位,并由TXD引腳輸出.第一次移位時(shí),停止位“1”移入輸出移位寄存器的第9位上,以后每次移位,左邊都移入0.當(dāng)停止位移至輸出位時(shí),左邊其余位全為0,檢測(cè)電路檢測(cè)到這一條件時(shí),使控制電路進(jìn)行最后一次移位,并置TI=1,向CPU請(qǐng)求中斷。發(fā)送時(shí)序圖如下圖3—10所示。圖3-10方式2或方式3的發(fā)送時(shí)序圖方式2和方式3輸入:接收時(shí),數(shù)據(jù)從右邊移入輸入移位寄存器,在起始位0移到最左邊時(shí),控制電路進(jìn)行最后一次移位。當(dāng)RI=0,且SM2=0(或接收到的第9位數(shù)據(jù)為1)時(shí),接收到的數(shù)據(jù)裝入接收緩沖器SBUF和RB8(接收數(shù)據(jù)的第9位),置RI=1,向CPU請(qǐng)求中斷。如果條件不滿足,則數(shù)據(jù)丟失,且不置位RI,繼續(xù)搜索RXD引腳的負(fù)跳變。接收時(shí)序圖如圖3-11所示。圖3--11方式2或方式3的接收時(shí)序圖(3)波特率的計(jì)算在串行通信中,收發(fā)雙方對(duì)發(fā)送或接收數(shù)據(jù)的速率要有約定。通過(guò)軟件可對(duì)單片機(jī)串行口編程為四種工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可變的,由定時(shí)器T1的溢出率來(lái)決定.串行口的四種工作方式對(duì)應(yīng)三種波特率.由于輸入的移位時(shí)鐘的來(lái)源不同,所以,各種方式的波特率計(jì)算公式也不相同。方式0的波特率=fosc/12方式2的波特率=(2SMOD/64)·fosc方式1的波特率=(2SMOD/32)·(T1溢出率)方式3的波特率=(2SMOD/32)·(T1溢出率)當(dāng)T1作為波特率發(fā)生器時(shí),最典型的用法是使T1工作在自動(dòng)再裝入的8位定時(shí)器方式(即方式2,且TCON的TR1=1,以啟動(dòng)定時(shí)器)。這時(shí)溢出率取決于TH1中的計(jì)數(shù)值。計(jì)算公式如3—1所示:T1溢出率=fosc/{12×[256-(TH1)]}(3-1)在單片機(jī)的應(yīng)用中,常用的晶振頻率為:12MHz和11.0592MHz。所以,選用的波特率也相對(duì)固定。本設(shè)計(jì)根據(jù)要求選用工作方式1。4。單片機(jī)的設(shè)計(jì)硬件設(shè)計(jì)主要有單片機(jī),七個(gè)按鍵,開(kāi)關(guān),以及一個(gè)與PC機(jī)相連接的USB串口,其硬件圖像如下圖:軟件部分開(kāi)始其單片機(jī)C語(yǔ)言程序框圖如下:開(kāi)始繼續(xù)不發(fā)數(shù)據(jù)暫停結(jié)束發(fā)送數(shù)據(jù)Num1,num2,num3,nun4全為零清零Num1++Num4++Num3++Num2++C?A?D?B?判斷是否有按鍵按下初始化(串口設(shè)置)繼續(xù)不發(fā)數(shù)據(jù)暫停結(jié)束發(fā)送數(shù)據(jù)Num1,num2,num3,nun4全為零清零Num1++Num4++Num3++Num2++C?A?D?B?判斷是否有按鍵按下初始化(串口設(shè)置)5.C#的程序設(shè)計(jì)串口通信的串行端口類(lèi)SerialPort(1.1)SerialPort的主要屬性屬性說(shuō)明BaudRate獲取或設(shè)置串行波特率。BytesToRead獲取接收緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)。BytesToWrite獲取發(fā)送緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)。DataBits獲取或設(shè)置每個(gè)字節(jié)的標(biāo)準(zhǔn)數(shù)據(jù)位長(zhǎng)度.Encoding獲取或設(shè)置傳輸前后文本轉(zhuǎn)換的字節(jié)編碼。IsOpen獲取一個(gè)值,該值指示SerialPort對(duì)象的打開(kāi)或關(guān)閉狀態(tài).NewLine獲取或設(shè)置用于解釋ReadLine和WriteLine方法調(diào)用結(jié)束的值。Parity獲取或設(shè)置奇偶校驗(yàn)檢查協(xié)議。PortName獲取或設(shè)置通信端口,包括但不限于所有可用的COM端口。ReadBufferSize獲取或設(shè)置SerialPort輸入緩沖區(qū)的大小。ReadTimeout獲取或設(shè)置讀取操作未完成時(shí)發(fā)生超時(shí)之前的毫秒數(shù)。ReceivedBytesThreshold獲取或設(shè)置DataReceived事件發(fā)生前內(nèi)部輸入緩沖區(qū)中的字節(jié)數(shù)。Site獲取或設(shè)置Component的ISite。(從Component繼承。)StopBits獲取或設(shè)置每個(gè)字節(jié)的標(biāo)準(zhǔn)停止位數(shù)。WriteBufferSize獲取或設(shè)置串行端口輸出緩沖區(qū)的大小。WriteTimeout獲取或設(shè)置寫(xiě)入操作未完成時(shí)發(fā)生超時(shí)之前的毫秒數(shù).(1.2)SerialPort的主要方法方法說(shuō)明Close關(guān)閉端口連接,將IsOpen屬性設(shè)置為false,并釋放內(nèi)部Stream對(duì)象.Dispose已重載。釋放SerialPort對(duì)象使用的非托管資源.Equals已重載。確定兩個(gè)Object實(shí)例是否相等。(從Object繼承。)GetPortNames獲取當(dāng)前計(jì)算機(jī)的串行端口名稱數(shù)組。Open打開(kāi)一個(gè)新的串行端口連接.Read已重載。從SerialPort輸入緩沖區(qū)中讀取。ReadByte從SerialPort輸入緩沖區(qū)中同步讀取一個(gè)字節(jié)。ReadChar從SerialPort輸入緩沖區(qū)中同步讀取一個(gè)字符。ReadExisting在編碼的基礎(chǔ)上,讀取SerialPort對(duì)象的流和輸入緩沖區(qū)中所有立即可用的字節(jié).ReadLine一直讀取到輸入緩沖區(qū)中的NewLine值。ReadTo一直讀取到輸入緩沖區(qū)中的指定value的字符串.ToString返回包含Component的名稱的String(如果有)。不應(yīng)重寫(xiě)此方法。(從Component繼承.)Write已重載。將數(shù)據(jù)寫(xiě)入串行端口輸出緩沖區(qū)。WriteLine將指定的字符串和NewLine值寫(xiě)入輸出緩沖區(qū)。(1.3)SerialPort的主要事件事件說(shuō)明DataReceived表示將處理SerialPort對(duì)象的數(shù)據(jù)接收事件的方法。ErrorReceived表示處理SerialPort對(duì)象的錯(cuò)誤事件的方法.C#界面串口設(shè)計(jì)開(kāi)始C#程序框圖開(kāi)始串口初始化串口初始化不接收數(shù)據(jù)串口打開(kāi)?顯示圖像Time事件觸發(fā)接收數(shù)據(jù)不接收數(shù)據(jù)串口打開(kāi)?顯示圖像Time事件觸發(fā)接收數(shù)據(jù)三.功能顯示以及結(jié)果(圖1)投票結(jié)果顯示(圖2)投票結(jié)果動(dòng)態(tài)顯示四.結(jié)論本設(shè)計(jì)利用了單片機(jī)串口通信編程和C#串口通信編程,讓單片機(jī)和PC機(jī)實(shí)現(xiàn)了通信。雖然是比較簡(jiǎn)單的C#與單片機(jī)之間的串口通信,但是也大大加深了自己對(duì)課堂知識(shí)的理解,同時(shí)大大提高了自己的動(dòng)手設(shè)計(jì)能力。這次設(shè)計(jì)也讓我充分認(rèn)識(shí)到C#強(qiáng)大的功能,但也讓我看到很多不足,界面完善不夠好,程序編寫(xiě)較為簡(jiǎn)單,還沒(méi)用到數(shù)據(jù)庫(kù)等功能,這也大大的激發(fā)了我對(duì)C#興趣。最后,非常感謝唐老師,他讓復(fù)雜枯燥的C#變得生動(dòng)有趣,上他的課非常有意思,大大提高了我對(duì)C#的興趣,同時(shí)的加強(qiáng)了我的設(shè)計(jì)技能.參考文獻(xiàn)張明鋒.PIC
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廉租房申請(qǐng)書(shū)范文大全
- 2025年晚裝鞋行業(yè)深度研究分析報(bào)告
- 廣州醫(yī)科大學(xué)《道路工程力學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 三峽旅游職業(yè)技術(shù)學(xué)院《設(shè)計(jì)方法與機(jī)械創(chuàng)新設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 現(xiàn)代化辦公環(huán)境下的機(jī)房設(shè)施管理
- 校園急救知識(shí)培訓(xùn)的組織與實(shí)施
- 電力企業(yè)員工的安全文化培育與實(shí)踐
- 農(nóng)村特困戶建房申請(qǐng)書(shū)
- 2025年辦公文具用品行業(yè)深度研究分析報(bào)告
- 助劑金屬清洗添加劑項(xiàng)目可行性研究報(bào)告建議書(shū)申請(qǐng)備案
- 《Unit 10 You're supposed to shake hands》單元檢測(cè)題及答案
- TSN 解決方案白皮書(shū)
- 完整2024年開(kāi)工第一課課件
- 貨運(yùn)車(chē)輛駕駛員安全培訓(xùn)內(nèi)容資料完整
- 風(fēng)神汽車(chē)4S店安全生產(chǎn)培訓(xùn)課件
- ICU患者的體位轉(zhuǎn)換與床旁運(yùn)動(dòng)訓(xùn)練
- 人教版四年級(jí)上冊(cè)豎式計(jì)算200題及答案
- 建設(shè)工程工作總結(jié)報(bào)告
- 電力預(yù)防性試驗(yàn)課件
- 四年級(jí)下冊(cè)脫式計(jì)算100題及答案
- 城市軌道交通的智能化與人工智能應(yīng)用
評(píng)論
0/150
提交評(píng)論