基于C#的五子棋游戲開發_第1頁
基于C#的五子棋游戲開發_第2頁
基于C#的五子棋游戲開發_第3頁
基于C#的五子棋游戲開發_第4頁
基于C#的五子棋游戲開發_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、青島理工大學琴島學院設 計 報 告課題名稱:基于C的五子棋游戲開發學院:計算機工程系 專業班級:計科(專升本)14-21 學 號:20140371006學 生: 指導教師:青島理工大學琴島學院教務處2015年 12月 18日學 生指導教師課題名稱基于C的五子棋游戲開發設計時間2015。11。232015.12。18設計地點動漫1 設計目的課程設計的目的就是培養學生的理論聯系實際的能力。通過課程設計,使得學生能夠加深對講授內容的理解、累積經驗、學會獨立上機調試程序;并且逐步達到綜合運用網頁相關知識,真正掌握。NET技術的精華,從而達到熟練應用程序設計語言的目的。也為將來做較大的系統打下堅實基礎.

2、通過本次課程設計,應該達到以下教學任務:鞏固所學知識,培養學生的上機實踐能力以及獨立調試程序的能力,更主要的是使學生了解做項目的大體流程。每一個小組制定一題,項目成員要在項目經理的帶領下,完成項目的所有內容。重點掌握ASP。NET網站設計開發流程,界面要友好,功能齊全,完成一個綜合項目。指導教師評語系部教研室 意 見一、需求分析1。選題:通過學習window窗體應用程序的開發與實現,對C程序開發逐漸產生了濃厚的興趣,心中有了設計游戲的想法,通過學習和查資料慢慢對游戲制作有了一定的了解,后來通過深入學習,對五子棋游戲設計有了進一步了解,慢慢理清了其中的開發過程與原理,最終確定了基于C五子棋游戲的

3、設計與實現項目.2。界面:(1)通過上網學習,對游戲界面風格有了一定的認知,于是決定走界面美觀風。手游中的主界面給人一種簡單明了的感覺,通常有模式關卡,讓玩家越玩越帶感,于是決定模仿它們,游戲主界面有四個模式,玩家可以選擇不同模式進行對弈。如圖1所示:模式四模式三模式二模式一圖1.主界面(2)游戲模式一,雙人對戰模式.界面右側有悔棋、返回、排行榜、關于、重新開始等功能按鈕,點擊各按鈕,執行各功能。如圖2所示:棋 盤關于按鈕排行榜按鈕悔棋按鈕返回按鈕重新開始按鈕n圖2。模式一界面(3)游戲模式二,人機對戰模式.游戲界面中左部是棋盤,悔棋、返回、排行榜、關于、重新開始等功能按鈕,此模式實現了人和電

4、腦的交互。如圖3所示:棋 盤關于按鈕排行榜按鈕悔棋按鈕返回按鈕重新開始按鈕n圖3。模式二界面(4)游戲模式三,讓子挑戰模式.游戲界面中左部是棋盤,右部有悔棋、返回、排行榜、關于、重新開始功能選項按鈕。和模式二不同的地方是讓子,開局后棋盤中布好了讓給電腦的白子。正所謂有人的地方就會有爭斗,游戲中有菜鳥就會有高手.高手喜歡挑戰,于是挑戰模式應運而生.此模式的界面和模式二界面相同,在此不再重畫。(5)游戲模式四,收拾殘局模式。游戲界面中左部是棋盤,右部有擺棋、對戰、悔棋、返回、再來一局功能選項按鈕.和模式二不同的地方是開局,開局后玩家需先擺放棋子,然后點擊對戰按鈕開始游戲。此模式界面設計參造模式二,

5、不再重畫。3。功能劃分:通過對五子棋游戲的分析與了解,可知其基本功能有開始、保存、打開、悔棋、認輸、和棋、返回、退出及聊天等功能.在這里,由于條件時間有限,僅實現悔棋、返回、重新開始及模式選擇等功能。(1)模式選擇功能:在打開游戲后,出現在玩家面前的是模式選擇窗口,即主窗口.玩家可通過點擊相應按鈕進入相應模式進行對弈。此功能參照手游及單機小游戲主界面簡約美觀的特性制作的,多模式的增加符合廣大玩家的喜好。(2)悔棋功能:在每個模式中都有悔棋功能,在模式一中每次悔棋退后一子,模式二到模式四每次悔棋退后兩子,棋盤開局后就有的讓子的棋子悔棋無效。人無完人,誰能不犯錯,根據玩家的棋藝高低程度難以把握,為

6、了讓玩家不至于因電腦太強對開發者產生怨言,從而有了悔棋功能,進而對五子棋菜鳥起引導作用,使其懷著開心的心情與保持興趣走向棋圣之路。對于高手而言,棋品也是要有的,悔棋功能形同虛設而已。(3)從新開始功能:此功能是菜鳥提升棋藝的首選功能,當玩家進行游戲到中途時,因棋勢不明,或要敗時,不能接受這一現狀,導致心情低落,怎么辦?只需輕輕一點,一切回歸起點,也就是初始化而已。(4)返回功能:此功能的作用是退出當前模式,回到游戲主窗口,也就是模式選擇窗口。方便玩家在各個模式自由出入,盡情的展現自己的風采。(5)人機對弈電腦下棋功能:在模式二到模式四中,玩家的對手都是電腦,電腦棋力取決于開發者,在某中意義上來

7、說,玩家在和開發者對弈也是正確的.此功能是程序按照一定的算法循環掃描,算出己方和敵方最佳落子點,再判斷出攻守,選出最終的落子點,落子后等待玩家落子。(6)讓子功能:在模式三中,為了增加游戲難度,對棋藝大成者量身打造了讓子功能.開局后,一般都是黑棋先行,在這里玩家執黑,讓電腦1子,棋盤上變成了電腦執白先行1子,白棋落在天元位置上,難度一般。玩家贏后,挑戰難度+1,玩家讓電腦2子,棋盤上電腦執白先行2子,白棋落在天元位置左右兩側,難度適中,適合一段棋手挑戰.玩家贏兩局后,挑戰難度+1,玩家讓電腦3子,棋盤上電腦執白先行3子,考錄到一般玩家沒有如此高深棋力,因此白棋分散落在棋盤交叉線上,難度相對適中

8、,適合一段及以上棋手挑戰。讓4子和5子也是一樣的原理,難度較高,適合二段及以上棋手挑戰.對戰后,會在棋盤中部上方顯示讓子數目,為迎合玩家的虛榮心理而設計.(7)判斷勝負功能:在每個模式中都需要對對局進行勝負判斷,進而產生了勝負判斷功能.其功能原理是對玩家或電腦下的棋子進行循環掃描,對各個方向掃描黑白子雙方是否形成五子連珠,根據形成五子連珠方判斷勝負,根據判斷彈出對應的勝負提示框.再根據所屬模式對勝負后的對局進行參數修改,如:模式一和模式二,不論勝負只需對其進行初始化;模式三,玩家勝出,讓子加一,難度增加,需對其讓子參數進行修改,反之則不進行任何處理操作;模式四,玩家勝出,對局勝出參數加一,呼應

9、必勝模式的讓子布局功能,玩家失敗則不進行參數修改操作等.(8)初始化界面功能:在每個模式中都需對窗口界面進行初始化,考錄到原有界面運行后的效果略顯呆板,為增加美觀性,需要對各窗口進行導入圖片處理,美化界面。根據對局情形,在棋盤中部上方顯示提示文字,并在棋盤上顯示存在的棋子,對各參數進行初始化處理。4.自定義類描述、各類方法描述及添加的命令響應.如表1所示:表1。用到的類類名描述說明Form3模式一游戲窗口類,該類主要對該模式下的窗口初始化并對鼠標等事件消息進行處理,實現悔棋功能、返回功能、排行榜功能、關于功能、重新開始功能等。Form4模式二游戲窗口類,該類主要對該模式下的窗口進行初始化并對鼠

10、標等事件消息進行處理,實現人機對弈功能、悔棋功能、返回功能、排行榜功能、關于功能、重新開始功能、提示勝敗功能等.Form5模式三游戲窗口類,該類主要對該模式下的窗口進行初始化并對鼠標等事件消息進行處理,實現讓子功能、人機對弈功能、悔棋功能、返回功能、排行榜功能、關于功能、重新開始功能、提示勝敗功能等.Form6模式四游戲窗口類,該類主要對該模式下的窗口進行初始化并對鼠標等事件消息進行處理,實現擺棋功能、人機對弈功能、悔棋功能、返回功能、排行榜功能、關于功能、重新開始功能、提示勝敗功能等。二、總體設計1.游戲功能概述打開程序,游戲開始運行,登錄進入模式窗口,選擇游戲模式窗口彈出,窗口中有四個模式

11、選擇按鈕,點擊按鈕,分別彈出對應的模式一、二、三、四窗口,完成具體模式的跳轉.對于模式一,玩家點擊鼠標進行下棋操作,判斷點擊點在棋盤內且無子時,在點擊點畫出棋子;如果點擊點在棋盤外或有子時,則不處理,返回等待鼠標命令.然后判斷是否存在五子連珠,如果不存在五子連珠,則返回等待鼠標命令;如果存在五子連珠,則進行判斷勝負并提示勝負信息,再調用OnStart()函數初始化模式一窗口,重新開始游戲.玩家點擊悔棋按鈕,調用悔棋功能函數OnHuiqi(),在窗口中重畫棋盤,去掉最后下的一個棋子,把悔棋后存在的棋子重新畫在棋盤上。玩家點擊重新開始按鈕,程序調用OnStart()函數,初始化模式一窗口,重新開始

12、游戲. 對于模式二、三、四,玩家點擊鼠標進行下棋操作,首先調用MouseMove函數.此函數的作用是判斷點擊點在棋盤內且無子時,在點擊點畫出棋子,如果點擊點在棋盤外或有子時,則不處理,返回等待鼠標命令.然后調用gameOver()函數判斷是否存在五子連珠,如果存在五子連珠,則進行判斷勝負并提示勝負信息,再調用OnStart()函數初始化這一模式窗口,重新開始游戲;如果不存在五子連珠,則調用AiGo()函數,進行電腦掃描最佳落子點完成電腦下棋操作。再調用Over()函數判斷是否存在五子連珠,如果不存在五子連珠,則返回等待鼠標命令;如果存在五子連珠,則進行勝負判斷并提示勝負信息,再調用OnStar

13、t()函數初始化這一模式窗口,重新開始游戲.玩家點擊悔棋按鈕,程序調用悔棋功能函數OnHuiqi(),在窗口中重畫棋盤,去掉最后下的兩個棋子,把悔棋后存在的棋子重新畫在棋盤上.玩家點擊重新開始按鈕,程序調用OnStart()函數,初始化模式一窗口,重新開始游戲.開 始模式選擇窗口1。繪制游戲進程圖,如圖4所示:模式四選擇按鈕模式三選擇按鈕模式二選擇按鈕模式一選擇按鈕模式四窗口模式三窗口模式二窗口模式一窗口退出排行榜是在點擊點畫出棋子鼠標點擊彈起等待鼠標命令否悔棋關于從新開始等待鼠標命令判斷點擊點在棋盤內且無子鼠標點擊彈起否判斷點擊點在棋盤內且無子是否判斷是否存在五子連珠是在點擊點畫出棋子否彈出

14、勝負提示框判斷是否存在五子連珠電腦掃描最佳落子點是是否彈出勝負提示框判斷是否存在五子連珠圖4.流程圖三、 詳細設計與實現1。悔棋功能的實現:為悔棋按鈕添加類向導,再添加int變量bushu、qi400、wzq1919,用于記錄先后下棋的具體坐標,以便于悔棋功能的實現。bushu用于記錄下棋的落子數,qi400用于記錄棋子的具體坐標,wzq1919用于記錄棋盤上各點存在棋子的黑白及有無情況.悔棋功能的實現原理是重新畫出棋盤及悔棋后存在棋子。先判斷是否剛剛開局,bushu不為0,就執行悔棋命令,把最后落下的第bushu個棋子的信息初始化,再畫出棋盤,重畫悔棋后存在的棋子。模式一與模式二、三、四的悔

15、棋不同之處在于悔棋棋子數.具體代碼如下:private void OnHuiqi() if(bushu0&star=true) if(colorwhite) colorwhite=false; else b = new SolidBrush(Color。White); g。FillEllipse(b, 20 * i + 20, 20 j + 30, 20, 20); b.Dispose(); g。Dispose(); else if (wzqi, j = 1) Graphics g = this。pictureBox1。CreateGraphics(); Brush b; b = ne

16、w SolidBrush(Color.Black); g。FillEllipse(b, 20i+20, 20*j+30, 20, 20); b。Dispose(); g。Dispose(); 悔棋功能的具體實現過程是先判斷是否剛開局,有無可悔棋的棋子,如果有,就在窗口中重新畫出棋盤,根據模式不同將最后落下的1個或2個棋子的信息初始化,再重新把悔棋后存在的棋子畫在棋盤上.2。鼠標點擊落子功能的實現: 添加鼠標事件處理函數MouseDown(),先獲取點擊點位置坐標,再判斷出點擊點是否在棋盤內且無子,當點擊點可落子時,就在棋盤上畫出棋子,讓wzq1919記錄該點棋子信息,把該手棋的具體坐標交給qi

17、bushu,用于悔棋操作,后檢查游戲是否形成五子連珠,完成本次落子任務。具體代碼如下:private void pictureBox1_MouseDown(object sender, MouseEventArgs e) int x, y; x =(e.X 20) / 20; y =(e。Y 30) / 20; if(star=truex>=0&x<19&y=0&y19) if (wzqx, y = 0) Graphics g = this。pictureBox1。CreateGraphics(); Brush b; bushu+; if (colorwhi

18、te) b = new SolidBrush(Color.White); wzqx, y = 1; colorwhite = false; else b = new SolidBrush(Color。Black); wzqx, y = 1; colorwhite = true; g。FillEllipse(b, 20x+20, 20y+30, 20, 20); b。Dispose(); g.Dispose(); gameOver(x, y); qibushu = x 100 + y; 鼠標點擊落子功能的運行過程是,獲取點擊點坐標并進行提取處理,方便棋子畫在交叉線上判斷點擊點是否在棋盤內,如果在

19、棋盤內。再判斷點擊點是否有棋子,如果沒有,就根據上一手棋的顏色在點擊點畫上相反顏色的棋子.調用gameOver(x, y)方法,判斷是否形成五子連珠,把落子點記錄到qibushu數組中.3。檢查游戲是否形成五子連珠,判斷游戲是否結束功能:新建gameOver()函數,進行循環掃描橫豎撇捺四方向上有無黑子或白子形成五子連珠棋形,判斷游戲是否結束,是否彈出勝負提示框.具體代碼如下:private void gameOver(int x,int y) int xx, yy; if (x < 4) xx = 0; else xx = x 4; if (y 4) yy = 0; elseyy =

20、y 4; int i, j, a; for (i = xx; i 15; i+) a = 0; for (j = i; j i + 5; j+) a = a + wzqj,y; if (a = 5) MessageBox。Show(”白棋勝!”); star = false; return; if (a = 5) MessageBox。Show(”黑棋勝!”); star = false; return; 先獲取下棋點的坐標并轉化為棋盤上對應的棋子坐標,判斷棋子在棋盤上的位子是否在棋盤邊緣。如果是,就從棋盤(0,0)位置開始向后掃描;不是,則從點擊點棋子坐標向左上方移動四個交叉位,開始向后掃描

21、。進行循環掃描橫豎撇捺四方向上有無黑子或白子形成五子連珠棋形,進而判斷游戲是否結束,根據情況決定是否彈出勝負提示框。4。讓子功能實現:在模式三中,為了增加游戲難度,開發者首創讓子功能。開局后,先進行讓子布局。一般都是黑棋先行,在這里玩家執黑,讓電腦1子,棋盤上變成了電腦執白先行1子,白棋落在天元位置上,難度一般。玩家贏后,挑戰難度+1,玩家讓電腦2子,棋盤上電腦執白先行2子,白棋落在天元位置左右兩側,難度適中,適合一段棋手挑戰。玩家贏兩局后,挑戰難度+1,玩家讓電腦3子,棋盤上電腦執白先行3子,考錄到一般玩家沒有如此高深棋力,因此白棋分散落在棋盤交叉線上,難度相對適中,適合一段及以上棋手挑戰.

22、讓4子和5子也是一樣的原理,難度較高,適合二段及以上棋手挑戰。具體代碼如下:private void pictureBox1_MouseMove(object sender, MouseEventArgs e) if (jushu = 1 & wzq9, 9 = 0star = true) Graphics g = this.pictureBox1。CreateGraphics(); Brush b; b = new SolidBrush(Color.White); wzq9, 9 = 1; colorwhite = false; g。FillEllipse(b, 20 9 + 20,

23、 20 * 9 + 30, 20, 20); b。Dispose(); g。Dispose(); 鼠標移動讓子功能的運行過程是,判斷是否剛剛開局,如果剛開局,就根據贏棋局數進行讓子布局,把讓電腦先下的棋子在棋盤上畫出來.如果不是剛開局,說明已經對讓子布局處理過,則跳過不再處理。5. 模式選擇窗口到各模式的跳轉功能實現:新建四個window窗體,各自添加按鈕控件,為模式選擇窗口添加四個模式跳轉按鈕并對其建立點擊事件,完成模式窗口到各模式的跳轉.具體函數代碼如下:private void button1_Click(object sender, EventArgs e) Form3 f3 = ne

24、w Form3(); this.Hide(); DialogResult dr = f3.ShowDialog(); if (dr = DialogResult。OK) this。Visible = true;調用此函數后,會彈出模式一游戲窗口.其余跳轉按鈕代碼處理與此相似,只是彈出的窗體不同,進入的模式窗口也就不同,也就實現了模式窗口的跳轉功能.6。人機對戰電腦下棋功能: 添加電腦下棋方法AiGo(),循環掃描棋盤上的棋形,算出最優下棋點坐標,處理代碼如下:private void AiGo()for (i = 0; i 19; i+) for (j = 0; j 19; j+) if (a

25、1x1, y1 a1i, j)y1 = j; x1 = i; for (i = 0; i 19; i+) for (j = 0; j 19; j+) if (a2x2, y2 a2i, j) y2 = j; x2 = i; if (a2x2, y2 >= a1x1, y1)px = x2; py = y2; else px = x1; py = y1;該算法先對棋盤上的棋子進行循環掃描,分析橫豎撇捺四方向上的棋子分布情況,算出黑白棋子在棋盤上各點的棋形得分情況,分數越高,該點越重要,此部分為函數中省略部分,由于代碼量龐大,不再闡述。接下來對是循環比較,分別找出黑白棋子在棋盤上的最高得分點

26、坐標,進而比較出二者中的得分最高點坐標,即最優下棋點坐標。7。初始化功能的實現:private void OnStart() for (int i = 0; i < 19; i+) for (int j = 0; j < 19; j+) wzqi,j = 0; colorwhite = false; star = true; bushu = 0; pictureBox1.Refresh(); 在每個模式中都需對窗口界面進行初始化,對各參數進行初始化處理.8.返回功能的實現:private void button1_Click(object sender, EventArgs e)

27、this.DialogResult = DialogResult.OK; this。Close();關閉子窗體,恢復隱藏的父窗體.四、 遇到的問題及解決方案問題1:窗口間的跳轉,實現不了。解決方法:查找資料,上網學習,百度知道,當然搜索到的答案不一定正確且不全面,需要反復嘗試,于是經過慢慢嘗試,解決了窗口跳轉問題.問題2:在窗口中的棋盤上畫棋子,棋子有時不會落在交叉線上。解決方法:經過仔細觀察,總結規律,發現畫棋子用的方法不對,畫在棋盤上的棋子坐標與棋盤上的交叉點有出入.經過嘗試,找到了方法,于是改變了畫棋盤的方法,讓每一個交叉點都有具體的坐標,這樣,不管鼠標點在哪里,想辦法在交叉點坐標畫棋子

28、就可以了。問題3:實現悔棋功能時,想著把最后下的棋子去掉,卻實現不了。解決方法:靜下心來,仔細看自己編寫的代碼,模擬電腦運行調用程序的先后順序看代碼,想象運行的結果,于是發現悔棋的棋子信息是初始化了,但沒有在棋盤上表現出來,沒想到好辦法,只好麻煩電腦再重新畫出棋盤,循環畫出悔棋后存在的棋子.問題4:判斷游戲是否結束,掃描是否產生五子連珠,老是判斷出錯誤。解決方法:經過請教度娘后,借鑒了前輩們的方法,完成了游戲結果分析函數.問題5:加載自己處理的圖片作為游戲棋盤背景,卻加載不進去或圖片不管用.解決方法:直接在屬性中設置背景圖片。問題6:人機對戰,機器下棋功能的實現,算法寫不出來,沒有頭緒,不知道

29、從何處下手。解決方法:經過多次嘗試失敗后,決定借鑒前輩們的算法,于是搜索到了不少算法,心中的貪念讓人無法取舍,不知道用哪個好,看著這些算法不知道怎么用,更不清楚原理。幾經波折終于意識到了自己的當務之急是先理解,于是選了一個注釋全面的算法,深入理解,經過嘗試學會了調用這個算法的工作過程,也實現了機器下棋的功能。問題7:讓子對戰模式中讓電腦先下的棋子,怎樣畫在棋盤上,出現了問題。解決方法:首先把這些棋子放在了OnPaint()函數中來繪制,結果有偏差,也沒弄懂原因,于是嘗試著在OnLButtonDown()函數中來繪制,運行界面后棋盤上無棋子,結果鼠標點擊的一瞬間出現了3顆棋子,這才意識到鼠標事件產生了沖突,也想到了在點擊鼠標時,鼠標的移動事件先觸發,然后點擊事件才被觸發。想到做到,馬上把這些棋

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論