版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
基于C#的五子棋游戲開發(fā)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)
基于C#的五子棋游戲開發(fā)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)青島理工大學(xué)琴島學(xué)院設(shè)計報告課題名稱:基于C#的五子棋游戲開發(fā)學(xué)院:計算機(jī)工程系專業(yè)班級:計科(專升本)14-21學(xué)號:20140371006學(xué)生:指導(dǎo)教師:青島理工大學(xué)琴島學(xué)院教務(wù)處2015年12月18日學(xué)生指導(dǎo)教師課題名稱基于C#的五子棋游戲開發(fā)設(shè)計時間2015。11.23—2015.12。18設(shè)計地點動漫1設(shè)計目的課程設(shè)計的目的就是培養(yǎng)學(xué)生的理論聯(lián)系實際的能力。通過課程設(shè)計,使得學(xué)生能夠加深對講授內(nèi)容的理解、累積經(jīng)驗、學(xué)會獨立上機(jī)調(diào)試程序;并且逐步達(dá)到綜合運用網(wǎng)頁相關(guān)知識,真正掌握。NET技術(shù)的精華,從而達(dá)到熟練應(yīng)用程序設(shè)計語言的目的.也為將來做較大的系統(tǒng)打下堅實基礎(chǔ)。通過本次課程設(shè)計,應(yīng)該達(dá)到以下教學(xué)任務(wù):鞏固所學(xué)知識,培養(yǎng)學(xué)生的上機(jī)實踐能力以及獨立調(diào)試程序的能力,更主要的是使學(xué)生了解做項目的大體流程.每一個小組制定一題,項目成員要在項目經(jīng)理的帶領(lǐng)下,完成項目的所有內(nèi)容.重點掌握ASP。NET網(wǎng)站設(shè)計開發(fā)流程,界面要友好,功能齊全,完成一個綜合項目。指導(dǎo)教師評語系部教研室意見一、需求分析1.選題:通過學(xué)習(xí)window窗體應(yīng)用程序的開發(fā)與實現(xiàn),對C#程序開發(fā)逐漸產(chǎn)生了濃厚的興趣,心中有了設(shè)計游戲的想法,通過學(xué)習(xí)和查資料慢慢對游戲制作有了一定的了解,后來通過深入學(xué)習(xí),對五子棋游戲設(shè)計有了進(jìn)一步了解,慢慢理清了其中的開發(fā)過程與原理,最終確定了基于C#五子棋游戲的設(shè)計與實現(xiàn)項目。2.界面:(1)通過上網(wǎng)學(xué)習(xí),對游戲界面風(fēng)格有了一定的認(rèn)知,于是決定走界面美觀風(fēng)。手游中的主界面給人一種簡單明了的感覺,通常有模式關(guān)卡,讓玩家越玩越帶感,于是決定模仿它們,游戲主界面有四個模式,玩家可以選擇不同模式進(jìn)行對弈。如圖1所示:模式四模式三模式二模式一模式四模式三模式二模式一圖1。主界面(2)游戲模式一,雙人對戰(zhàn)模式。界面右側(cè)有悔棋、返回、排行榜、關(guān)于、重新開始等功能按鈕,點擊各按鈕,執(zhí)行各功能。如圖2所示:棋盤棋盤關(guān)于按鈕排行榜按鈕悔棋按鈕返回按鈕重新開始按鈕n關(guān)于按鈕排行榜按鈕悔棋按鈕返回按鈕重新開始按鈕n圖2.模式一界面(3)游戲模式二,人機(jī)對戰(zhàn)模式。游戲界面中左部是棋盤,悔棋、返回、排行榜、關(guān)于、重新開始等功能按鈕,此模式實現(xiàn)了人和電腦的交互。如圖3所示:棋盤棋盤關(guān)于按鈕排行榜按鈕悔棋按鈕返回按鈕重新開始按鈕n關(guān)于按鈕排行榜按鈕悔棋按鈕返回按鈕重新開始按鈕n圖3.模式二界面(4)游戲模式三,讓子挑戰(zhàn)模式。游戲界面中左部是棋盤,右部有悔棋、返回、排行榜、關(guān)于、重新開始功能選項按鈕。和模式二不同的地方是讓子,開局后棋盤中布好了讓給電腦的白子。正所謂有人的地方就會有爭斗,游戲中有菜鳥就會有高手.高手喜歡挑戰(zhàn),于是挑戰(zhàn)模式應(yīng)運而生.此模式的界面和模式二界面相同,在此不再重畫。(5)游戲模式四,收拾殘局模式。游戲界面中左部是棋盤,右部有擺棋、對戰(zhàn)、悔棋、返回、再來一局功能選項按鈕。和模式二不同的地方是開局,開局后玩家需先擺放棋子,然后點擊對戰(zhàn)按鈕開始游戲。此模式界面設(shè)計參造模式二,不再重畫。3。功能劃分:通過對五子棋游戲的分析與了解,可知其基本功能有開始、保存、打開、悔棋、認(rèn)輸、和棋、返回、退出及聊天等功能.在這里,由于條件時間有限,僅實現(xiàn)悔棋、返回、重新開始及模式選擇等功能.(1)模式選擇功能:在打開游戲后,出現(xiàn)在玩家面前的是模式選擇窗口,即主窗口。玩家可通過點擊相應(yīng)按鈕進(jìn)入相應(yīng)模式進(jìn)行對弈。此功能參照手游及單機(jī)小游戲主界面簡約美觀的特性制作的,多模式的增加符合廣大玩家的喜好。(2)悔棋功能:在每個模式中都有悔棋功能,在模式一中每次悔棋退后一子,模式二到模式四每次悔棋退后兩子,棋盤開局后就有的讓子的棋子悔棋無效.人無完人,誰能不犯錯,根據(jù)玩家的棋藝高低程度難以把握,為了讓玩家不至于因電腦太強(qiáng)對開發(fā)者產(chǎn)生怨言,從而有了悔棋功能,進(jìn)而對五子棋菜鳥起引導(dǎo)作用,使其懷著開心的心情與保持興趣走向棋圣之路。對于高手而言,棋品也是要有的,悔棋功能形同虛設(shè)而已。(3)從新開始功能:此功能是菜鳥提升棋藝的首選功能,當(dāng)玩家進(jìn)行游戲到中途時,因棋勢不明,或要敗時,不能接受這一現(xiàn)狀,導(dǎo)致心情低落,怎么辦?只需輕輕一點,一切回歸起點,也就是初始化而已。(4)返回功能:此功能的作用是退出當(dāng)前模式,回到游戲主窗口,也就是模式選擇窗口。方便玩家在各個模式自由出入,盡情的展現(xiàn)自己的風(fēng)采。(5)人機(jī)對弈電腦下棋功能:在模式二到模式四中,玩家的對手都是電腦,電腦棋力取決于開發(fā)者,在某中意義上來說,玩家在和開發(fā)者對弈也是正確的。此功能是程序按照一定的算法循環(huán)掃描,算出己方和敵方最佳落子點,再判斷出攻守,選出最終的落子點,落子后等待玩家落子。(6)讓子功能:在模式三中,為了增加游戲難度,對棋藝大成者量身打造了讓子功能。開局后,一般都是黑棋先行,在這里玩家執(zhí)黑,讓電腦1子,棋盤上變成了電腦執(zhí)白先行1子,白棋落在天元位置上,難度一般.玩家贏后,挑戰(zhàn)難度+1,玩家讓電腦2子,棋盤上電腦執(zhí)白先行2子,白棋落在天元位置左右兩側(cè),難度適中,適合一段棋手挑戰(zhàn).玩家贏兩局后,挑戰(zhàn)難度+1,玩家讓電腦3子,棋盤上電腦執(zhí)白先行3子,考錄到一般玩家沒有如此高深棋力,因此白棋分散落在棋盤交叉線上,難度相對適中,適合一段及以上棋手挑戰(zhàn)。讓4子和5子也是一樣的原理,難度較高,適合二段及以上棋手挑戰(zhàn).對戰(zhàn)后,會在棋盤中部上方顯示讓子數(shù)目,為迎合玩家的虛榮心理而設(shè)計。(7)判斷勝負(fù)功能:在每個模式中都需要對對局進(jìn)行勝負(fù)判斷,進(jìn)而產(chǎn)生了勝負(fù)判斷功能。其功能原理是對玩家或電腦下的棋子進(jìn)行循環(huán)掃描,對各個方向掃描黑白子雙方是否形成五子連珠,根據(jù)形成五子連珠方判斷勝負(fù),根據(jù)判斷彈出對應(yīng)的勝負(fù)提示框。再根據(jù)所屬模式對勝負(fù)后的對局進(jìn)行參數(shù)修改,如:模式一和模式二,不論勝負(fù)只需對其進(jìn)行初始化;模式三,玩家勝出,讓子加一,難度增加,需對其讓子參數(shù)進(jìn)行修改,反之則不進(jìn)行任何處理操作;模式四,玩家勝出,對局勝出參數(shù)加一,呼應(yīng)必勝模式的讓子布局功能,玩家失敗則不進(jìn)行參數(shù)修改操作等。(8)初始化界面功能:在每個模式中都需對窗口界面進(jìn)行初始化,考錄到原有界面運行后的效果略顯呆板,為增加美觀性,需要對各窗口進(jìn)行導(dǎo)入圖片處理,美化界面.根據(jù)對局情形,在棋盤中部上方顯示提示文字,并在棋盤上顯示存在的棋子,對各參數(shù)進(jìn)行初始化處理。4.自定義類描述、各類方法描述及添加的命令響應(yīng).如表1所示:表1。用到的類類名描述說明Form3模式一游戲窗口類,該類主要對該模式下的窗口初始化并對鼠標(biāo)等事件消息進(jìn)行處理,實現(xiàn)悔棋功能、返回功能、排行榜功能、關(guān)于功能、重新開始功能等。Form4模式二游戲窗口類,該類主要對該模式下的窗口進(jìn)行初始化并對鼠標(biāo)等事件消息進(jìn)行處理,實現(xiàn)人機(jī)對弈功能、悔棋功能、返回功能、排行榜功能、關(guān)于功能、重新開始功能、提示勝敗功能等.Form5模式三游戲窗口類,該類主要對該模式下的窗口進(jìn)行初始化并對鼠標(biāo)等事件消息進(jìn)行處理,實現(xiàn)讓子功能、人機(jī)對弈功能、悔棋功能、返回功能、排行榜功能、關(guān)于功能、重新開始功能、提示勝敗功能等。Form6模式四游戲窗口類,該類主要對該模式下的窗口進(jìn)行初始化并對鼠標(biāo)等事件消息進(jìn)行處理,實現(xiàn)擺棋功能、人機(jī)對弈功能、悔棋功能、返回功能、排行榜功能、關(guān)于功能、重新開始功能、提示勝敗功能等。二、總體設(shè)計1.游戲功能概述打開程序,游戲開始運行,登錄進(jìn)入模式窗口,選擇游戲模式窗口彈出,窗口中有四個模式選擇按鈕,點擊按鈕,分別彈出對應(yīng)的模式一、二、三、四窗口,完成具體模式的跳轉(zhuǎn)。對于模式一,玩家點擊鼠標(biāo)進(jìn)行下棋操作,判斷點擊點在棋盤內(nèi)且無子時,在點擊點畫出棋子;如果點擊點在棋盤外或有子時,則不處理,返回等待鼠標(biāo)命令.然后判斷是否存在五子連珠,如果不存在五子連珠,則返回等待鼠標(biāo)命令;如果存在五子連珠,則進(jìn)行判斷勝負(fù)并提示勝負(fù)信息,再調(diào)用OnStart()函數(shù)初始化模式一窗口,重新開始游戲。玩家點擊悔棋按鈕,調(diào)用悔棋功能函數(shù)OnHuiqi(),在窗口中重畫棋盤,去掉最后下的一個棋子,把悔棋后存在的棋子重新畫在棋盤上。玩家點擊重新開始按鈕,程序調(diào)用OnStart()函數(shù),初始化模式一窗口,重新開始游戲.對于模式二、三、四,玩家點擊鼠標(biāo)進(jìn)行下棋操作,首先調(diào)用MouseMove函數(shù)。此函數(shù)的作用是判斷點擊點在棋盤內(nèi)且無子時,在點擊點畫出棋子,如果點擊點在棋盤外或有子時,則不處理,返回等待鼠標(biāo)命令。然后調(diào)用gameOver()函數(shù)判斷是否存在五子連珠,如果存在五子連珠,則進(jìn)行判斷勝負(fù)并提示勝負(fù)信息,再調(diào)用OnStart()函數(shù)初始化這一模式窗口,重新開始游戲;如果不存在五子連珠,則調(diào)用AiGo()函數(shù),進(jìn)行電腦掃描最佳落子點完成電腦下棋操作。再調(diào)用Over()函數(shù)判斷是否存在五子連珠,如果不存在五子連珠,則返回等待鼠標(biāo)命令;如果存在五子連珠,則進(jìn)行勝負(fù)判斷并提示勝負(fù)信息,再調(diào)用OnStart()函數(shù)初始化這一模式窗口,重新開始游戲.玩家點擊悔棋按鈕,程序調(diào)用悔棋功能函數(shù)OnHuiqi(),在窗口中重畫棋盤,去掉最后下的兩個棋子,把悔棋后存在的棋子重新畫在棋盤上。玩家點擊重新開始按鈕,程序調(diào)用OnStart()函數(shù),初始化模式一窗口,重新開始游戲。開始模式選擇窗口1。繪制游戲進(jìn)程圖,如圖4所示:開始模式選擇窗口模式四選擇按鈕模式三選擇按鈕模式二選擇按鈕模式一選擇按鈕模式四選擇按鈕模式三選擇按鈕模式二選擇按鈕模式一選擇按鈕模式四窗口模式三窗口模式二窗口模式一窗口模式四窗口模式三窗口模式二窗口模式一窗口退出退出排行榜排行榜是在點擊點畫出棋子鼠標(biāo)點擊彈起等待鼠標(biāo)命令否悔棋是在點擊點畫出棋子鼠標(biāo)點擊彈起等待鼠標(biāo)命令否悔棋關(guān)于關(guān)于從新開始從新開始等待鼠標(biāo)命令等待鼠標(biāo)命令判斷點擊點在棋盤內(nèi)且無子判斷點擊點在棋盤內(nèi)且無子鼠標(biāo)點擊彈起鼠標(biāo)點擊彈起否否判斷點擊點在棋盤內(nèi)且無子判斷點擊點在棋盤內(nèi)且無子是否判斷是否存在五子連珠是否判斷是否存在五子連珠是是在點擊點畫出棋子在點擊點畫出棋子否彈出勝負(fù)提示框否彈出勝負(fù)提示框判斷是否存在五子連珠判斷是否存在五子連珠電腦掃描最佳落子點電腦掃描最佳落子點是是是是否否彈出勝負(fù)提示框判斷是否存在五子連珠彈出勝負(fù)提示框判斷是否存在五子連珠圖4。流程圖詳細(xì)設(shè)計與實現(xiàn)1.悔棋功能的實現(xiàn):為悔棋按鈕添加類向?qū)В偬砑觟nt變量bushu、qi[400]、wzq[19][19],用于記錄先后下棋的具體坐標(biāo),以便于悔棋功能的實現(xiàn)。bushu用于記錄下棋的落子數(shù),qi[400]用于記錄棋子的具體坐標(biāo),wzq[19][19]用于記錄棋盤上各點存在棋子的黑白及有無情況。悔棋功能的實現(xiàn)原理是重新畫出棋盤及悔棋后存在棋子。先判斷是否剛剛開局,bushu不為0,就執(zhí)行悔棋命令,把最后落下的第bushu個棋子的信息初始化,再畫出棋盤,重畫悔棋后存在的棋子。模式一與模式二、三、四的悔棋不同之處在于悔棋棋子數(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();}}}}悔棋功能的具體實現(xiàn)過程是先判斷是否剛開局,有無可悔棋的棋子,如果有,就在窗口中重新畫出棋盤,根據(jù)模式不同將最后落下的1個或2個棋子的信息初始化,再重新把悔棋后存在的棋子畫在棋盤上。2.鼠標(biāo)點擊落子功能的實現(xiàn):添加鼠標(biāo)事件處理函數(shù)MouseDown(),先獲取點擊點位置坐標(biāo),再判斷出點擊點是否在棋盤內(nèi)且無子,當(dāng)點擊點可落子時,就在棋盤上畫出棋子,讓wzq[19][19]記錄該點棋子信息,把該手棋的具體坐標(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)點擊落子功能的運行過程是,獲取點擊點坐標(biāo)并進(jìn)行提取處理,方便棋子畫在交叉線上判斷點擊點是否在棋盤內(nèi),如果在棋盤內(nèi)。再判斷點擊點是否有棋子,如果沒有,就根據(jù)上一手棋的顏色在點擊點畫上相反顏色的棋子。調(diào)用gameOver(x,y)方法,判斷是否形成五子連珠,把落子點記錄到qi[bushu]數(shù)組中.3。檢查游戲是否形成五子連珠,判斷游戲是否結(jié)束功能:新建gameOver()函數(shù),進(jìn)行循環(huán)掃描橫豎撇捺四方向上有無黑子或白子形成五子連珠棋形,判斷游戲是否結(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;}}}……}先獲取下棋點的坐標(biāo)并轉(zhuǎn)化為棋盤上對應(yīng)的棋子坐標(biāo),判斷棋子在棋盤上的位子是否在棋盤邊緣。如果是,就從棋盤(0,0)位置開始向后掃描;不是,則從點擊點棋子坐標(biāo)向左上方移動四個交叉位,開始向后掃描。進(jìn)行循環(huán)掃描橫豎撇捺四方向上有無黑子或白子形成五子連珠棋形,進(jìn)而判斷游戲是否結(jié)束,根據(jù)情況決定是否彈出勝負(fù)提示框。4.讓子功能實現(xiàn):在模式三中,為了增加游戲難度,開發(fā)者首創(chuàng)讓子功能.開局后,先進(jìn)行讓子布局。一般都是黑棋先行,在這里玩家執(zhí)黑,讓電腦1子,棋盤上變成了電腦執(zhí)白先行1子,白棋落在天元位置上,難度一般.玩家贏后,挑戰(zhàn)難度+1,玩家讓電腦2子,棋盤上電腦執(zhí)白先行2子,白棋落在天元位置左右兩側(cè),難度適中,適合一段棋手挑戰(zhàn)。玩家贏兩局后,挑戰(zhàn)難度+1,玩家讓電腦3子,棋盤上電腦執(zhí)白先行3子,考錄到一般玩家沒有如此高深棋力,因此白棋分散落在棋盤交叉線上,難度相對適中,適合一段及以上棋手挑戰(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)移動讓子功能的運行過程是,判斷是否剛剛開局,如果剛開局,就根據(jù)贏棋局?jǐn)?shù)進(jìn)行讓子布局,把讓電腦先下的棋子在棋盤上畫出來。如果不是剛開局,說明已經(jīng)對讓子布局處理過,則跳過不再處理。5。模式選擇窗口到各模式的跳轉(zhuǎn)功能實現(xiàn):新建四個window窗體,各自添加按鈕控件,為模式選擇窗口添加四個模式跳轉(zhuǎ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ù)后,會彈出模式一游戲窗口。其余跳轉(zhuǎn)按鈕代碼處理與此相似,只是彈出的窗體不同,進(jìn)入的模式窗口也就不同,也就實現(xiàn)了模式窗口的跳轉(zhuǎn)功能。6.人機(jī)對戰(zhàn)電腦下棋功能:添加電腦下棋方法AiGo(),循環(huán)掃描棋盤上的棋形,算出最優(yōu)下棋點坐標(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;}}該算法先對棋盤上的棋子進(jìn)行循環(huán)掃描,分析橫豎撇捺四方向上的棋子分布情況,算出黑白棋子在棋盤上各點的棋形得分情況,分?jǐn)?shù)越高,該點越重要,此部分為函數(shù)中省略部分,由于代碼量龐大,不再闡述。接下來對是循環(huán)比較,分別找出黑白棋子在棋盤上的最高得分點坐標(biāo),進(jìn)而比較出二者中的得分最高點坐標(biāo),即最優(yōu)下棋點坐標(biāo)。7.初始化功能的實現(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();}在每個模式中都需對窗口界面進(jìn)行初始化,對各參數(shù)進(jìn)行初始化處理。8.返回功能的實現(xiàn):privat(yī)evoidbutton1_Click(objectsender,EventArgse){this.DialogResult=DialogResult。OK;this.Close();}關(guān)閉子窗體,恢復(fù)隱藏的父窗體。遇到的問題及解決方案問題1:窗口間的跳轉(zhuǎn),實現(xiàn)不了。解決方法:查找資料,上網(wǎng)學(xué)習(xí),百度知道,當(dāng)然搜索到的答案不一定正確且不全面,需要反復(fù)嘗試,于是經(jīng)過慢慢嘗試,解決了窗口跳轉(zhuǎn)問題。問題2:在窗口中的棋盤上畫棋子,棋子有時不會落在交叉線上。解決方法:經(jīng)過仔細(xì)觀察,總結(jié)規(guī)律,發(fā)現(xiàn)畫棋子用的方法不對,畫在棋盤上的棋子坐標(biāo)與棋盤上的交叉點有出入。經(jīng)過嘗試,找到了方法,于是改變了畫棋盤的方法,讓每一個交叉點都有具體的坐標(biāo),這樣,不管鼠標(biāo)點在哪里,想辦法在交叉點坐標(biāo)畫棋子就可以了。問題3:實現(xiàn)悔棋功能時,想著把最后下的棋子去掉,卻實現(xiàn)不了。解決方法:靜下心來,仔細(xì)看自己編寫的代碼,模擬電腦運行調(diào)用程序的先后順序看代碼,想象運行的結(jié)果,于是發(fā)現(xiàn)悔棋的棋子信息是初始化了,但沒有在棋盤上表現(xiàn)出來,沒想到好辦法,只好麻煩電腦再重新畫出棋盤,循環(huán)畫出悔棋后存在的棋子。問題4:判斷游戲是否結(jié)束,掃描是否產(chǎn)生五子連珠,老是判斷出錯誤。解決方法:經(jīng)過請教度娘后,借鑒了前輩們的方法,完成了游戲結(jié)果分析函數(shù)。問題5:加載自己處理的圖片作為游戲棋盤背景,卻加載不進(jìn)去或圖片不管用。解決方法:直接在屬性中設(shè)置背景圖片.問題6:人機(jī)對戰(zhàn),機(jī)器下棋功能的實現(xiàn),算法寫不出來,沒有頭緒,不知道從何處下手。解決方法:經(jīng)過多次嘗試失敗后,決定借鑒前輩們的算法,于是搜索到了不少算法,心中的貪念讓人無法取舍,不知道用哪個好,看著這些算法不知道怎么用,更不清楚原理。幾經(jīng)波折終于意識到了自己的當(dāng)務(wù)之急是先理解,于是選了一個注釋全面的算法,深入理解,經(jīng)過嘗試學(xué)會了調(diào)用這個算法的工作過程,也實現(xiàn)了機(jī)器下棋的功能。問題7:讓子對戰(zhàn)模式中讓電腦先下的棋子,怎樣畫在棋盤上,出現(xiàn)了問題。解決方法:首先把這些棋子放在了OnPaint()函數(shù)中來繪制,結(jié)果有偏差,也沒弄懂原因,于是嘗試著在OnLButtonDown()函數(shù)中來繪制,運行界面后棋盤上無棋子,結(jié)果鼠標(biāo)點擊的一瞬間出現(xiàn)了3顆棋子,這才意識到鼠標(biāo)事件產(chǎn)生了沖突,也想到了在點擊鼠標(biāo)時,鼠標(biāo)的移動事件先觸發(fā),然后點擊事件才被觸發(fā)。想到做到,馬上把這些棋子放在了OnMouseMove()中來繪制,運行正確,讓子對戰(zhàn)功能完成了.問題8:在模式二的制作中,發(fā)現(xiàn)模式一的一些功能模式二都有用到,于是想到了繼承,想讓模式二繼承模式一,嘗試后發(fā)現(xiàn),繼承后的模式二運行界面和模式一很像,但是模式二中自建的按鈕卻不見了,變成了模式一中存在的按鈕,和設(shè)計計劃產(chǎn)生了誤差。實現(xiàn)不了。解決方法:經(jīng)過取舍,決定用笨方法,不怕麻煩,方法重寫一遍,雖然代碼存在冗余,但為了更好的完成設(shè)計計劃,先這樣處理,只能以后找機(jī)會來完善了??偨Y(jié)與體會通過本次課程設(shè)計,學(xué)到了很多知識,接觸了一些以前沒接觸過的領(lǐng)域,對C#編程有了深入的了解,也學(xué)會了很多解決問題的方法,認(rèn)識到了自己的不足,同時發(fā)現(xiàn)原來自己也是可以做出小游戲的。在做這個項目之前,想到了自己會的和能實現(xiàn)的功能有哪些,自己會的也就窗口跳轉(zhuǎn)和鼠標(biāo)處理事件等.于是想著用到這些知識的項目有哪些是自認(rèn)為可以輕松實現(xiàn)的,經(jīng)過對比選擇了五子棋小游戲開發(fā),因為這個項目中的棋盤自己是能畫出來的。對于下棋而言,也就是一個鼠標(biāo)處理事件,也能實現(xiàn)。難點在于人機(jī)對戰(zhàn)的算法上。于是清楚了自己接下來要做的事情,對于未知的先不要去考慮了,自己有多大能耐還不清楚,先做會做的,能實現(xiàn)再說.不做不知道,一做嚇一跳,想著簡單,做起來難,往往是在人最得意的時候來一記狠得,讓人都不知道怎么著程序突然就報錯了。經(jīng)過慢慢嘗試,一步步做下來,終于完成了基本功能的實現(xiàn).接下來就是一步一步的去完善這個游戲,如何設(shè)計的更加有難度與挑戰(zhàn)性,比如在游戲中玩家可以選擇不同的模式來進(jìn)行游戲,在讓子模式三中玩家可以讓電腦先下幾顆棋子,在玩家獲勝后會在棋盤中部上方顯示讓子數(shù)量滿足玩家的虛榮心與好勝心,激起玩家的挑戰(zhàn)欲望;如何設(shè)計的更加有趣味性,比如在模式四中玩家可以通過下殘局獲得榮譽(yù)稱號,而且還是棋力評級稱號,讓玩家對未知的棋局產(chǎn)生興趣。另外,對于這個游戲還有很多需要改進(jìn)的地方,比如讓子模式可以把固定的讓子位置做成隨機(jī)的,這樣給玩家一種未知的探險感覺,讓玩家全身心的融入到游戲中。還可以在游戲中加入排行榜,得分記錄等功能。對于這些問題,由于時間問題只能在以后的進(jìn)一步學(xué)習(xí)過程中想辦法對其進(jìn)行解決與改進(jìn)。項目能夠按計劃完成,需要技術(shù)與知識的支持,也少不了個人的堅持與努力,為了以后更好的完成項目,而時刻努力著。學(xué)號:學(xué)號:實習(xí)論文(本科)學(xué)院數(shù)學(xué)與統(tǒng)計學(xué)院專業(yè)統(tǒng)計學(xué)年級2013級姓名論文題目基于C++的2048游戲設(shè)計指導(dǎo)教師職稱講師成績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實習(xí)前的準(zhǔn)備PAGEREF_Toc464584605\h12實習(xí)目的PAGEREF_Toc464584606\h23實習(xí)任務(wù)PAGEREF_Toc464584607\h2HYPERLINK\l”_Toc464584608"4實習(xí)內(nèi)容PAGEREF_Toc464584608\h2HYPERLINK\l”_Toc464584609"4.12048游戲簡介PAGEREF_Toc464584609\h24.22048模塊需求分析PAGEREF_Toc464584610\h3HYPERLINK\l"_Toc464584611”4.3UI界面的規(guī)劃設(shè)計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主體算法的分析和實現(xiàn)PAGEREF_Toc464584615\h6HYPERLINK\l”_Toc464584616"4。8游戲結(jié)束的判斷PAGEREF_Toc464584616\h84.9游戲最終運行成果PAGEREF_Toc464584617\h9HYPERLINK\l"_Toc464584618”5個人總結(jié)PAGEREF_Toc464584618\h10參考文獻(xiàn)PAGEREF_Toc464584619\h10基于C++的2048游戲設(shè)計學(xué)生姓名:學(xué)號:學(xué)院:數(shù)學(xué)與統(tǒng)計學(xué)院專業(yè):統(tǒng)計學(xué)指導(dǎo)教師:職稱:講師摘要:專業(yè)實習(xí),是教學(xué)計劃中的一門重要的必修課和綜合實踐課程,是培養(yǎng)學(xué)生的專業(yè)素質(zhì)和實際能力的重要實踐環(huán)節(jié).通過此次的C++實習(xí),掌握了程序設(shè)計的基本理論與方法,能夠運用基本代碼進(jìn)行簡單的程序設(shè)計,運行基本的游戲程序.關(guān)鍵詞:C++;設(shè)計;程序TheGameDesignof2048BasedonC++Abstract:Theimportantrequiredcourseintheteachingplanandcomprehensivepracticecurriculum,professionalinternships,istocultivatethestudents'professionalqualityandpracticalabilityoftheimportantlinkofpractice。ThroughtheC++practice,wegraspthebasictheoryandmethodofprogramdesign,beabletousebasiccodetobuildsimpleprogramandrunit.Keywords:C++;Design;Program前言這次實習(xí)是我們畢業(yè)前的一次實踐性實習(xí)。為了拓展我們的知識面,增強(qiáng)我們對所學(xué)知識的應(yīng)用能力,增加我們在社會競爭中的經(jīng)驗,鍛煉和提高我們的綜合素質(zhì),以便在以后畢業(yè)后能真正走入社會,并且能夠在生活和工作中很好地處理各方面的問題,學(xué)校特地從北京達(dá)內(nèi)科技集團(tuán)聘請了專業(yè)的C++工程師講師來對我們進(jìn)行專業(yè)實訓(xùn),進(jìn)一步運用所學(xué)知識分析和解決實際專業(yè)問題,從而為就業(yè)打下良好的基礎(chǔ)。1實習(xí)前的準(zhǔn)備學(xué)校對我們的實習(xí)非常重視,本著通過實習(xí)來檢驗本專業(yè)教學(xué)中存在的問題,改進(jìn)教學(xué)工作的目的,提前就為我們聯(lián)系好了與專業(yè)相關(guān)的單位來做實習(xí)培訓(xùn).在正式進(jìn)入機(jī)房實訓(xùn)前,講師還專門做了一場關(guān)于實習(xí)內(nèi)容的分享會,介紹了實習(xí)的基本情況、基本要求、實習(xí)項目的基本情況,學(xué)習(xí)和了解實習(xí)項目的相關(guān)文件和資料,幫助我們更系統(tǒng)地了解和熟悉接下來的實習(xí)課程內(nèi)容。2實習(xí)目的1。培養(yǎng)理論聯(lián)系實際的思想作風(fēng)和工作作風(fēng);2.培養(yǎng)作為計算機(jī)類工作人員的專業(yè)素質(zhì);3。培養(yǎng)獨立或與團(tuán)隊一起開展信息處理工作的基本業(yè)務(wù)能力。3實習(xí)任務(wù)1。通過實際操作,了解并逐步熟悉掌握C++;2。掌握常用軟件的熟練操作,為今后所期望的專業(yè)方向做準(zhǔn)備;3.在教師指導(dǎo)下,利用C++編程,完成獨立的游戲編程任務(wù);4。最后在實習(xí)指導(dǎo)老師的指導(dǎo)下,參與信息處理與計算工作,完成一篇相關(guān)的實習(xí)論文(或?qū)嵙?xí)記錄)。4實習(xí)內(nèi)容4。12048游戲簡介2048游戲是一款簡單而流行的數(shù)字游戲,屬于益智游戲。操作界面上有16個格子,初始時會有兩個格子上安放了兩個數(shù)字2,每次可以選擇上下左右其中一個方向去滑動.每滑動一次,所有的數(shù)字方塊都會往滑動的方向靠攏。兩個相同數(shù)字方塊撞在一起之后合并成為他們的和。每次操作之后會在空白的方格處隨機(jī)生成一個2或者4(其他模式會有所改變),最終得到一個“2048”的方塊就是勝利了。由于規(guī)則簡單,各種版本和平臺上均有該款游戲.相信有不少人都玩過它,但是操作界面只有半個巴掌大的一個游戲,背后卻要用到類似隨機(jī)數(shù)的產(chǎn)生、大批量數(shù)據(jù)的處理、UI設(shè)計等任務(wù),真的不算是一個很簡單的工作。本次的游戲程序設(shè)計任務(wù)將運用C++來實現(xiàn)。4.22048模塊需求分析首先分析了這款游戲的功能需求。2048游戲一般由以下幾個模塊來構(gòu)成:1。矩陣方塊;2??刂颇K;3.計算模塊;4.輸出模塊.每個模塊來實現(xiàn)2048游戲的各項功能:方向移動、方塊合并、記錄當(dāng)前數(shù)據(jù)和輸出計分結(jié)果、游戲勝利或失敗后執(zhí)行結(jié)束游戲操作等。4。3UI界面的規(guī)劃設(shè)計首先進(jìn)行UI界面的規(guī)劃設(shè)計。創(chuàng)建一個800×600的背景模塊,在模塊左側(cè)這里我們需要16個方塊,按照4×4的規(guī)格排列整齊。模塊右側(cè)的空白區(qū)域需要添加功能鍵:上、下、左、右、重置、關(guān)閉.另外我們還需要再添加一個計分標(biāo)簽,用來計算并輸出游戲得分。最后按照模塊功能與人的操作習(xí)慣,將標(biāo)簽分別排列在合適的位置。最終的UI界面如圖1所示:圖1UI界面(矩陣方塊)設(shè)計完成以后,接著來開始程序代碼的編寫。4。4頭文件的需求分析首先分析需要用到的頭文件。第一步需要生成隨機(jī)數(shù),第二步要為16個矩形模塊填充隨機(jī)數(shù)所對應(yīng)的圖片,第三步為操作界面添加背景,第四步在游戲成功或失敗時即時輸出信息。分析完成以后將所有需要用到的頭文件都寫入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ù)的生成接下來我們開始寫入生成兩個隨機(jī)數(shù)和分?jǐn)?shù)從零開始的代碼,同時加入圖片加載和聲明面板對象的代碼:{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;//聲明畫板對象palette。setBrush(this-〉backgroundRole(),QBrush(pix));//設(shè)置畫板樣式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è)計程序,以便后續(xù)的圖片加載工作。隨后我們進(jìn)入為16個矩形模塊和背景加載其各對應(yīng)隨機(jī)數(shù)圖片的設(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主體算法的分析和實現(xiàn)接下來進(jìn)入主要的算法設(shè)計步驟.在此根據(jù)2048游戲算法的功能需求和功能模塊,對主要算法進(jìn)行分析并實現(xiàn)。對于控制模塊,一共有上、下、左、右、重置、關(guān)閉六個控制功能鍵。對于左移功能鍵的算法,每點擊一次,所有的數(shù)字方塊都會往滑動的方向靠攏。兩個相同數(shù)字方塊撞在一起之后合并成為他們的和。每次操作之后會在空白的方格處隨機(jī)生成一個2或者4.此時分?jǐn)?shù)也在累計增加。這一部分中重置和關(guān)閉這兩個功能鍵相對與其他功能鍵獨立,而上、下、左、右四個功能鍵的算法有一定的相似之處,所以以下僅詳細(xì)展示左移功能鍵的代碼?,F(xiàn)在開始對這六個功能鍵進(jìn)行代碼編寫: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é)束的判斷最后一個需解決的問題就是對于游戲是否結(jié)束的判斷,其主要體現(xiàn)在控制和計算模塊.如果游戲未能達(dá)成任務(wù)而失敗,輸出“失敗"和“游戲結(jié)束”的信息,同時只有關(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();}}以上我們對2048這個游戲的程序設(shè)計部分的工作已經(jīng)完全結(jié)束,接下來構(gòu)建程序,檢查并修改錯誤,就可以打開并運行這個游戲了。4。9游戲最終運行成果最終的游戲界面如圖2所示:圖2點擊右側(cè)功能鍵,即可開始游戲.5個人總結(jié)通過這次實習(xí)我很好地掌握了如何將C++實際運用到游戲開發(fā)中去,檢驗了自己學(xué)習(xí)的成效、檢測了自己的所缺。這就形成了從實踐中學(xué)習(xí),從學(xué)習(xí)中實踐的良性循環(huán)。這是一個很好的鍛煉機(jī)會,能將所學(xué)的理論知識聯(lián)系于實際,我感覺學(xué)習(xí)與實踐是密不可分的。當(dāng)今中國經(jīng)濟(jì)飛速發(fā)展,國內(nèi)外經(jīng)濟(jì)不斷變化,在機(jī)會越來越多的同時,也出現(xiàn)了更多的題目,有了更多更艱巨的挑戰(zhàn),這也就對人才的要求越來越高。我們不僅要學(xué)好課本里的知識,還要主動走進(jìn)社會,積極在實踐中學(xué)習(xí)其他的東西,不斷增加自己的經(jīng)驗,全方面武裝自己,才能在這個社會有立足之地甚至擁有不敗之地.參考文獻(xiàn)[1]
譚浩強(qiáng).C程序設(shè)計教程[M]。清華大學(xué)出版社,2007。?[2]
榮欽科技.Visual
C++游戲編程基礎(chǔ)[M]。電子工業(yè)出版社,2005。
[3]
王浩.Visual
C++游戲開發(fā)經(jīng)典案例詳解[M]。清華出版社,2010.[4]劉明軍.C語言程序設(shè)計[M]。電子工業(yè)出版社,2007.[5]凌云。C語言程序設(shè)計與實踐[M]。機(jī)械工業(yè)出版社,2010.[6]StanleyB。LippmanC++primer[M]。人民郵電出版社,2006.[7]SteveMaguire。編程精粹[M]。人民郵電出版社,2009。[8]AndrewKoenig.C陷阱與缺陷[M]。人民郵電出版社,2008?;贑#與單片機(jī)串口通信的投票器李浩東20093101004周守悅20093101012作品的設(shè)計概述我們知道每年每個班都需要班委換屆,有很多同學(xué)積極參加競選,然而每一次競選投票都是大家拿出一張紙,然后再紙上寫上自己心目中班委的名字,然后交給監(jiān)票讀票記票,這個過程不僅大大浪費了大家的寶貴時間,還有可能出現(xiàn)漏票等情況,體現(xiàn)不了公平公正公開。本設(shè)計是通過按鈕給班委競選人投票,每個候選人都對應(yīng)一個按鈕,投票人如果想投票給某個人可以按下其對應(yīng)按鈕,每按下一次改競選人的票數(shù)就會自動增加1,每個人只能按下一次,電腦顯示屏將通過柱形圖動態(tài)的呈現(xiàn)每個候選人獲得票數(shù)競爭的情況以及通過框圖顯示總票數(shù),不僅使得投票結(jié)果更加公開公正,而且也大大節(jié)省了大家的時間.本設(shè)計的創(chuàng)新點是通過柱形圖動態(tài)顯示整個投票過程,而不是直接顯示到最后投票結(jié)果,更加體現(xiàn)公正公開。作品的設(shè)計與分析主要功能與分析主要使用單片機(jī)和PC機(jī)之間的串口通信,在單片機(jī)硬件上設(shè)置七個按鍵,其中四個鍵是用來給A,B,C,D四個人投票的,這四個按鍵每按下一次就自動增1,記錄這四個按鍵按下的總次數(shù)num1,num2,num3,num4,并把四個數(shù)按順序不斷循環(huán)通過串口發(fā)給PC機(jī),PC機(jī)通過串口把這些數(shù)據(jù)存儲下來,并讀出來,通過C#編程,把這四個人所獲得的總票數(shù)在picturebox控件上面的柱形圖動態(tài)呈現(xiàn)出來,通過time控件,不斷更新這個人所獲得的票數(shù),讓投票人通過柱形圖更加形象直觀的看出每個被投票人的競爭情況,同時在柱形圖下方有著這四個人獲得總票數(shù)的真實數(shù)目。還有一個按鍵是票數(shù)清零,如果這次投票已經(jīng)完成或者無效可以按下這個按鍵,此時A,B,C,D四個人的總票數(shù)將變成零。還有一個按鍵作用是停止投票,如果需要停止這次投票可以按下此鍵,這時候那四個投票的按鍵將不可用。最后一個按鍵的作用是繼續(xù)投票,如需繼續(xù)投票,可按此鍵。其系統(tǒng)設(shè)計圖如下:PC機(jī)PC機(jī)圖像顯示清零繼續(xù)暫停ABCD單片機(jī)圖像顯示清零繼續(xù)暫停ABCD單片機(jī)數(shù)據(jù)傳輸2.串口通信規(guī)則單片機(jī)與PC機(jī)為了可以進(jìn)行通信,必須要遵守一定的通信規(guī)則,這個共同的規(guī)則就是通信端口的初始化。通信端口的初始化有以下幾項必須設(shè)置:(1)數(shù)據(jù)的傳輸速率傳輸雙方通過傳輸線的電壓改變來交換數(shù)據(jù),但傳輸線的電壓改變的速度必須和接收端的接收速度保持一致,RS—232通常用于異步傳輸,即雙方并沒有一個可參考的同步時鐘作為基準(zhǔn)。由于沒有一個參考時鐘,雙方所發(fā)送的高低電位到底代表幾個位就不得而知了,要使得雙方的數(shù)據(jù)讀取正常,就要考慮到傳輸速率——波特率,其所代表的意義是每秒鐘所能產(chǎn)生的最大電壓狀態(tài)改變率,或者說是每秒鐘可以振蕩的次數(shù).原始信號經(jīng)過不同的波特率取樣后,所得的結(jié)果完全不一樣。取樣速度只有原來的一半時,信號被跳著取樣,數(shù)據(jù)因此產(chǎn)生錯誤。因此通信雙方獲得相同的通信速度是首先要做的事情.(2)數(shù)據(jù)的發(fā)送單位一般串行通信端口所發(fā)送的數(shù)據(jù)是字符類型的,若用來傳輸文件,則會使用二進(jìn)制的數(shù)據(jù)類型。當(dāng)使用字符類型時,通常使用ASCII碼,ASCII碼中8個位形成一個字符.以實際的RS-232傳輸來看,由于大多數(shù)應(yīng)用只是發(fā)送文字碼,因此只要7個位就可以將ASCII碼的0-127號字符表達(dá)出來,所有的可見字符都在這個范圍內(nèi),所以只要7個數(shù)據(jù)位就足夠了.不同的情況下,會使用到不同的發(fā)送單位,但使用多少個位合成一個字節(jié)必須先行確定.(3)起始位及停止位由于異步串行通信中并沒有使用同步脈沖作為基準(zhǔn),故接收端完全不知道發(fā)送端何時將進(jìn)行數(shù)據(jù)的發(fā)送,而當(dāng)發(fā)送端準(zhǔn)備要開始發(fā)送數(shù)據(jù)時,發(fā)送端會在所送出的字符前后分別加上高電位的起始位(邏輯0)及低電位的停止位(邏輯1),它們分別是所謂的起始位和停止位。當(dāng)發(fā)送端要開始發(fā)送數(shù)據(jù)時,便將傳輸在線的電位由低電位提升至高電位,而當(dāng)發(fā)送結(jié)束后,再將電位降至低電位.接收端會因起始位的觸發(fā)(因電壓由低電位升至高電位)而開始接收數(shù)據(jù),并因停止位的通知(因電壓維持在低電位)而確切數(shù)據(jù)的字符信號已經(jīng)結(jié)束。(4)校驗位的檢查為了預(yù)防錯誤的產(chǎn)生,因此使用校驗位作為檢查的機(jī)制;校驗位是用來檢查所發(fā)送數(shù)據(jù)正確性的一種核對碼,其中又分成奇校驗位和偶校驗位兩種方式,分別是檢查字符碼中I的數(shù)目是奇數(shù)或偶數(shù)。以偶校驗位為例,A的ASCII碼01100001(二進(jìn)制),其中1的數(shù)目是三個,因此校驗位便是1,使1的數(shù)目保持偶數(shù)。同理,校驗位是奇校驗位時,A的校驗位便是0,使1的數(shù)目保持奇數(shù)。串口通信協(xié)議由于本設(shè)計主要從單片機(jī)串口發(fā)送數(shù)據(jù),所以因此有關(guān)串口通信的原理的介紹都是圍繞單片機(jī)講解的。80C51串行口的控制寄存器(1.1)特殊功能寄存器SCONSCON是一個特殊功能寄存器,用以設(shè)定串行口的工作方式、接收/發(fā)送控制以及設(shè)置狀態(tài)標(biāo)志,字節(jié)地址為98H.SCON寄存器的各位定義如表3-1所示。位76543210字節(jié)地址:98HSM0SM1SM2RENTB8RB8TIRISCON表3—1SCON寄存器SM0和SM1為工作方式選擇位,可選擇四種工作方式,如表3—2所示.SM0SM1方式說明波特率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時可以利用收到的RB8來控制是否激活RI(RB8=0時不激活RI,收到的信息丟棄;RB8=1時收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI,進(jìn)而在中斷服務(wù)中將數(shù)據(jù)從SBUF讀走)。當(dāng)SM2=0時,不論收到的RB8為0和1,均可以使收到的數(shù)據(jù)進(jìn)入SBUF,并激活RI(即此時RB8不具有控制RI激活的功能)。通過控制SM2,可以實現(xiàn)多機(jī)通信。在方式0時,SM2必須是0.在方式1時,若SM2=1,則只有接收到有效停止位時,RI才置1。REN為允許串行接收位。由軟件置REN=1,則啟動串行口接收數(shù)據(jù);若軟件置REN=0,則禁止接收。TB8用在方式2或方式3中,是發(fā)送數(shù)據(jù)的第九位,可以用軟件規(guī)定其作用??梢杂米鲾?shù)據(jù)的奇偶校驗位,或在多機(jī)通信中,作為地址幀/數(shù)據(jù)幀的標(biāo)志位(在方式0和方式1中,該位未用).RB8用在方式2或方式3中,是接收到數(shù)據(jù)的第九位,作為奇偶校驗位或地址幀/數(shù)據(jù)幀的標(biāo)志位。在方式1時,若SM2=0,則RB8是接收到的停止位。TI,發(fā)送中斷標(biāo)志位.在方式0時,當(dāng)串行發(fā)送第8位數(shù)據(jù)結(jié)束時,或在其它方式,串行發(fā)送停止位的開始時,由內(nèi)部硬件使TI置1,向CPU發(fā)中斷申請。在中斷服務(wù)程序中,必須用軟件將其清0,取消此中斷申請。RI,接收中斷標(biāo)志位。在方式0時,當(dāng)串行接收第8位數(shù)據(jù)結(jié)束時,或在其它方式,串行接收停止位的中間時,由內(nèi)部硬件使RI置1,向CPU發(fā)中斷申請。也必須在中斷服務(wù)程序中,用軟件將其清0,取消此中斷申請[7]。(1.2)特殊功能寄存器PCONPCON的字節(jié)地址為87H,它的第7位SMOD是與串口通信波特率的設(shè)置有關(guān)的選擇位。SMOD(PCON.7)為波特率倍增位。在串行口方式1、方式2、方式3時,波特率與SMOD有關(guān),當(dāng)SMOD=1時,波特率提高一倍.復(fù)位時,SMOD=0。(2)80C51單片機(jī)串行口的工作方式(2.1)方式0設(shè)置SCON寄存器的SM0、SM1=00時,串行口工作于方式0。此時,串行口為同步移位寄存器的輸入輸出方式。主要用于擴(kuò)展并行輸入或輸出口。數(shù)據(jù)由RXD(P3.0)引腳輸入或輸出,同步移位脈沖由TXD(P3.1)引腳輸出。發(fā)送和接收均為8位數(shù)據(jù),低位在先,高位在后。波特率固定為fosc/12。其中fosc為時鐘頻率.(2.2)方式1設(shè)置SCON寄存器的SM0、SM1=01時,串行口工作于方式1.方式1是10位數(shù)據(jù)的異步通信口。TXD為數(shù)據(jù)發(fā)送引腳,RXD為數(shù)據(jù)接收引腳,傳送一幀數(shù)據(jù)的格式如圖所示。其中1位起始位,8位數(shù)據(jù)位,1位停止位。用軟件置REN為1時,接收器以所選擇波特率的16倍速率采樣RXD引腳電平,檢測到RXD引腳輸入電平發(fā)生負(fù)跳變時,則說明起始位有效,將其移入輸入移位寄存器,并開始接收這一幀信息的其余位。接收過程中,數(shù)據(jù)從輸入移位寄存器右邊移入,起始位移至輸入移位寄存器最左邊時,控制電路進(jìn)行最后一次移位。當(dāng)RI=0,且SM2=0(或接收到的停止位為1)時,將接收到的9位數(shù)據(jù)的前8位數(shù)據(jù)裝入接收SBUF,第9位(停止位)進(jìn)入RB8,并置RI=1,向CPU請求中斷.方式一的輸入輸出圖如圖3—8、3—9所示。圖3-8方式1輸入圖3-9方式1輸出(2.3)方式2和方式3設(shè)置SCON寄存器的SM0、SM1=10時,串行口工作于方式2,當(dāng)SM0、SM1=11時,串行口工作于方式3。方式2或方式3為11位數(shù)據(jù)的異步通信口.TXD為數(shù)據(jù)發(fā)送引腳,RXD為數(shù)據(jù)接收引腳。方式2和方式3時起始位1位,數(shù)據(jù)9位(含1位附加的第9位,發(fā)送時為SCON中的TB8,接收時為RB8),停止位1位,一幀數(shù)據(jù)為11位.方式2的波特率固定為晶振頻率的1/64或1/32,方式3的波特率由定時器T1的溢出率決定。方式2和方式3輸出:發(fā)送開始時,先把起始位0輸出到TXD引腳,然后發(fā)送移位寄存器的輸出位(D0)到TXD引腳。每一個移位脈沖都使輸出移位寄存器的各位右移一位,并由TXD引腳輸出.第一次移位時,停止位“1”移入輸出移位寄存器的第9位上,以后每次移位,左邊都移入0.當(dāng)停止位移至輸出位時,左邊其余位全為0,檢測電路檢測到這一條件時,使控制電路進(jìn)行最后一次移位,并置TI=1,向CPU請求中斷。發(fā)送時序圖如下圖3—10所示。圖3-10方式2或方式3的發(fā)送時序圖方式2和方式3輸入:接收時,數(shù)據(jù)從右邊移入輸入移位寄存器,在起始位0移到最左邊時,控制電路進(jìn)行最后一次移位。當(dāng)RI=0,且SM2=0(或接收到的第9位數(shù)據(jù)為1)時,接收到的數(shù)據(jù)裝入接收緩沖器SBUF和RB8(接收數(shù)據(jù)的第9位),置RI=1,向CPU請求中斷。如果條件不滿足,則數(shù)據(jù)丟失,且不置位RI,繼續(xù)搜索RXD引腳的負(fù)跳變。接收時序圖如圖3-11所示。圖3--11方式2或方式3的接收時序圖(3)波特率的計算在串行通信中,收發(fā)雙方對發(fā)送或接收數(shù)據(jù)的速率要有約定。通過軟件可對單片機(jī)串行口編程為四種工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可變的,由定時器T1的溢出率來決定.串行口的四種工作方式對應(yīng)三種波特率.由于輸入的移位時鐘的來源不同,所以,各種方式的波特率計算公式也不相同。方式0的波特率=fosc/12方式2的波特率=(2SMOD/64)·fosc方式1的波特率=(2SMOD/32)·(T1溢出率)方式3的波特率=(2SMOD/32)·(T1溢出率)當(dāng)T1作為波特率發(fā)生器時,最典型的用法是使T1工作在自動再裝入的8位定時器方式(即方式2,且TCON的TR1=1,以啟動定時器)。這時溢出率取決于TH1中的計數(shù)值。計算公式如3—1所示:T1溢出率=fosc/{12×[256-(TH1)]}(3-1)在單片機(jī)的應(yīng)用中,常用的晶振頻率為:12MHz和11.0592MHz。所以,選用的波特率也相對固定。本設(shè)計根據(jù)要求選用工作方式1。4。單片機(jī)的設(shè)計硬件設(shè)計主要有單片機(jī),七個按鍵,開關(guān),以及一個與PC機(jī)相連接的USB串口,其硬件圖像如下圖:軟件部分開始其單片機(jī)C語言程序框圖如下:開始繼續(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è)計串口通信的串行端口類SerialPort(1.1)SerialPort的主要屬性屬性說明BaudRate獲取或設(shè)置串行波特率。BytesToRead獲取接收緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)。BytesToWrite獲取發(fā)送緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)。DataBits獲取或設(shè)置每個字節(jié)的標(biāo)準(zhǔn)數(shù)據(jù)位長度.Encoding獲取或設(shè)置傳輸前后文本轉(zhuǎn)換的字節(jié)編碼。IsOpen獲取一個值,該值指示SerialPort對象的打開或關(guān)閉狀態(tài).NewLine獲取或設(shè)置用于解釋ReadLine和WriteLine方法調(diào)用結(jié)束的值。Parity獲取或設(shè)置奇偶校驗檢查協(xié)議。PortName獲取或設(shè)置通信端口,包括但不限于所有可用的COM端口。ReadBufferSize獲取或設(shè)置SerialPort輸入緩沖區(qū)的大小。ReadTimeout獲取或設(shè)置讀取操作未完成時發(fā)生超時之前的毫秒數(shù)。ReceivedBytesThreshold獲取或設(shè)置DataReceived事件發(fā)生前內(nèi)部輸入緩沖區(qū)中的字節(jié)數(shù)。Site獲取或設(shè)置Component的ISite。(從Component繼承。)StopBits獲取或設(shè)置每個字節(jié)的標(biāo)準(zhǔn)停止位數(shù)。WriteBufferSize獲取或設(shè)置串行端口輸出緩沖區(qū)的大小。WriteTimeout獲取或設(shè)置寫入操作未完成時發(fā)生超時之前的毫秒數(shù).(1.2)SerialPort的主要方法方法說明Close關(guān)閉端口連接,將IsOpen屬性設(shè)置為false,并釋放內(nèi)部Stream對象.Dispose已重載。釋放SerialPort對象使用的非托管資源.Equals已重載。確定兩個Object實例是否相等。(從Object繼承。)GetPortNames獲取當(dāng)前計算機(jī)的串行端口名稱數(shù)組。Open打開一個新的串行端口連接.Read已重載。從SerialPort輸入緩沖區(qū)中讀取。ReadByte從SerialPort輸入緩沖區(qū)中同步讀取一個字節(jié)。ReadChar從SerialPort輸入緩沖區(qū)中同步讀取一個字符。ReadExisting在編碼的基礎(chǔ)上,讀取SerialPort對象的流和輸入緩沖區(qū)中所有立即可用的字節(jié).ReadLine一直讀取到輸入緩沖區(qū)中的NewLine值。ReadTo一直讀取到輸入緩沖區(qū)中的指定value的字符串.ToString返回包含Component的名稱的String(如果有)。不應(yīng)重寫此方法。(從Component繼承.)Write已重載。將數(shù)據(jù)寫入串行端口輸出緩沖區(qū)。WriteLine將指定的字符串和NewLine值寫入輸出緩沖區(qū)。(1.3)SerialPort的主要事件事件說明DataReceived表示將處理SerialPort對象的數(shù)據(jù)接收事件的方法。ErrorReceived表示處理SerialPort對象的錯誤事件的方法.C#界面串口設(shè)計開始C#程序框圖開始串口初始化串口初始化不接收數(shù)據(jù)串口打開?顯示圖像Time事件觸發(fā)接收數(shù)據(jù)不接收數(shù)據(jù)串口打開?顯示圖像Time事件觸發(fā)接收數(shù)據(jù)三.功能顯示以及結(jié)果(圖1)投票結(jié)果顯示(圖2)投票結(jié)果動態(tài)顯示四.結(jié)論本設(shè)計利用了單片機(jī)串口通信編程和C#串口通信編程,讓單片機(jī)和PC機(jī)實現(xiàn)了通信。雖然是比較簡單的C#與單片機(jī)之間的串口通信,但是也大大加深了自己對課堂知識的理解,同時大大提高了自己的動手設(shè)計能力。這次設(shè)計也讓我充分認(rèn)識到C#強(qiáng)大的功能,但也讓我看到很多不足,界面完善不夠好,程序編寫較為簡單,還沒用到數(shù)據(jù)庫等功能,這也大大的激發(fā)了我對C#興趣。最后,非常感謝唐老師,他讓復(fù)雜枯燥的C#變得生動有趣,上他的課非常有意思,大大提高了我對C#的興趣,同時的加強(qiáng)了我的設(shè)計技能.參考文獻(xiàn)張明鋒.PIC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 樹木買賣合同范例5篇文件
- 碧桂園收購合同范例
- 交定金認(rèn)購合同范例
- 水利新版合同范例
- 外墻保溫裝飾合同范例
- 竹欄加工制作合同范例
- 2025模具制造合同范本
- 新疆旅游紙質(zhì)合同范例
- 礦山出租協(xié)議合同范例
- 玉溪大紅山鐵礦二期北采區(qū)采礦施工組織設(shè)計
- 必刷題2024六年級英語上冊語法規(guī)則專項專題訓(xùn)練(含答案)
- 2024新教科版四年級上冊科學(xué)知識點總結(jié)精簡版
- 人工智能在礦產(chǎn)勘探中的應(yīng)用分析篇
- 中西文化鑒賞智慧樹知到答案2024年鄭州大學(xué)
- 2024國開大學(xué)《經(jīng)濟(jì)學(xué)基礎(chǔ)》形考任務(wù)2答案
- 2024山東省招聘社區(qū)工作者試題及答案
- 14《答謝中書書》對比閱讀-2024-2025中考語文文言文閱讀專項訓(xùn)練(含答案)
- DL∕T 5494-2014 電力工程場地地震安全性評價規(guī)程
- 顱腦外傷病人的急救和護(hù)理
- 大型儲罐制作安裝施工方案
評論
0/150
提交評論