版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)說(shuō)明書</b></p><p> 2010-2011學(xué)年第 一 學(xué)期</p><p><b> 目 錄</b></p><p> 1.課程設(shè)計(jì)內(nèi)容4</p><p> 2.課程設(shè)計(jì)目的4</p><p><b&
2、gt; 3.背景知識(shí)4</b></p><p> 4.工具/準(zhǔn)備工作5</p><p> 5.設(shè)計(jì)步驟與方法5</p><p> 5.1.服務(wù)器端編程5</p><p> 5.1.1.服務(wù)器具體實(shí)現(xiàn)步驟如下:5</p><p> 5.1.1.1.玩家信息6</p&g
3、t;<p> 5.1.1.2.游戲桌位信息6</p><p> 5.1.1.3.公用的方法7</p><p> 5.1.1.4.玩家房間狀態(tài)信息8</p><p> 5.1.1.5.登錄窗體事件9</p><p> 5.1.1.6.五子棋主要代碼15</p><p> 5.
4、2.客戶端編程21</p><p> 5.2.1.客戶端具體實(shí)現(xiàn)步驟如下:21</p><p> 5.2.1.1.游戲室21</p><p> 5.2.1.2.游戲界面及窗體事件34</p><p> 6.設(shè)計(jì)結(jié)果及分析44</p><p> 7.設(shè)計(jì)結(jié)論45</p>&
5、lt;p> 8.問(wèn)題及心得體會(huì)45</p><p> 9.對(duì)本設(shè)計(jì)過(guò)程及方法、手段的改進(jìn)建議45</p><p> 10.參考文獻(xiàn)45</p><p> 11.課程設(shè)計(jì)評(píng)價(jià)(教師)45</p><p><b> 網(wǎng)絡(luò)五子棋</b></p><p><b>
6、 課程設(shè)計(jì)內(nèi)容</b></p><p> 五子棋游戲以其優(yōu)秀的傳統(tǒng)知識(shí)跟智慧深受廣大玩家的喜愛(ài),編制五子棋程序因其規(guī)則簡(jiǎn)單而大受編程者的歡迎,然而它卻要求程序員對(duì)五子棋規(guī)則有相當(dāng)深入的了解。網(wǎng)絡(luò)五子棋的主要內(nèi)容是:根據(jù)五子棋的基本規(guī)則,要讓對(duì)方客戶端知道該在哪一點(diǎn)下子,就要根據(jù)盤面的形勢(shì),并把棋盤棋子的重新繪制,也就是更新該點(diǎn)的位置,然后再通過(guò)監(jiān)聽(tīng)網(wǎng)絡(luò)傳遞的消息,直到新的位置放在棋盤的什么位置上,
7、在進(jìn)行修改,并通過(guò)計(jì)算,判定游戲的獲勝方和游戲的結(jié)束與否.,因此玩家就能反復(fù)的通過(guò)網(wǎng)絡(luò)進(jìn)行聯(lián)機(jī)游戲。</p><p><b> 課程設(shè)計(jì)目的</b></p><p> 為了更深入地理解TCP協(xié)議的具體應(yīng)用編程技巧,本設(shè)計(jì)使用功能強(qiáng)大的VS2008開(kāi)發(fā)工具和C#開(kāi)發(fā)語(yǔ)言,開(kāi)發(fā)出一個(gè)擁有自己特色的五子棋程序,其中VS2008是一個(gè)能開(kāi)放代碼的開(kāi)發(fā)工具,基本C#的擴(kuò)展平
8、臺(tái)。就該五子棋程序來(lái)講,它只是一個(gè)框架和一組服務(wù),用于通過(guò)插件,組件,控件構(gòu)建開(kāi)發(fā)環(huán)境。</p><p> 對(duì)于游戲,要求能夠達(dá)到以下功能:</p><p> (1).服務(wù)器可以同時(shí)服務(wù)多桌,每桌允許兩個(gè)玩家通過(guò)internet對(duì)弈。</p><p> (2)允許玩家自由選擇坐在哪里一桌的哪一方。如果兩個(gè)玩家坐在同一桌,雙方老師應(yīng)能看到對(duì)方的狀態(tài)。兩個(gè)玩家均單
9、擊開(kāi)始按鈕后,游戲才開(kāi)始。</p><p> (3)游戲開(kāi)始后,由黑色棋子的玩家先下棋。</p><p> (4)每當(dāng)玩家走完一步棋子后,都檢測(cè)相當(dāng)顏色的棋子是否已經(jīng)相鄰的出現(xiàn)達(dá)到五個(gè),即游戲結(jié)束。</p><p> (5)同一桌的玩家可以聊天。</p><p><b> 背景知識(shí)</b></p>
10、<p> 同步工作方式,利用TCP編寫程序執(zhí)行到發(fā)送,接收或監(jiān)聽(tīng)語(yǔ)句時(shí),在未完成工作前是不會(huì)往下執(zhí)行,即處于阻塞狀態(tài),這樣的TCP協(xié)議有利于編寫五子棋這樣的回合制游戲。采用Socket類編程,運(yùn)用了系統(tǒng)提供相應(yīng)的方法。邏輯關(guān)系上,都會(huì)涉及服務(wù)器,客戶端這兩個(gè)概念。</p><p><b> 工具/準(zhǔn)備工作</b></p><p> 資源方法有棋盤,黑白
11、棋子,還有游戲室的位置頭像如下圖:</p><p><b> 設(shè)計(jì)步驟與方法</b></p><p><b> 服務(wù)器端編程</b></p><p> 服務(wù)器啟動(dòng)后,需要?jiǎng)?chuàng)建一個(gè)線程專門用于監(jiān)聽(tīng)玩家連接請(qǐng)求。在監(jiān)聽(tīng)線程中,服務(wù)器一旦接受一個(gè)連接,就創(chuàng)建一個(gè)線程與該玩家對(duì)應(yīng)的線程,用于接收該玩家發(fā)送的信息,并根據(jù)玩家發(fā)
12、送的信息來(lái)提供相應(yīng)的服務(wù)。有多少個(gè)玩家就得創(chuàng)建多少個(gè)對(duì)應(yīng)的線程。直到玩家退出游戲室,其對(duì)應(yīng)的線程才終止。</p><p> 服務(wù)器必須限制進(jìn)入游戲室的玩家數(shù)量,具體多少,可以由服務(wù)器的啟動(dòng)來(lái)設(shè)置。</p><p> 服務(wù)器具體實(shí)現(xiàn)步驟如下:</p><p> 創(chuàng)建一個(gè)命名為GameServer的Windows應(yīng)用程序,將Form1.cs改名為FormServe
13、r.cs,界面設(shè)計(jì)如下:</p><p><b> 玩家信息</b></p><p> 在資源管理器中,添加User.cs,用于保存與該玩家的通信所需要的信息。代碼如下:</p><p> class User</p><p><b> {</b></p><p>
14、 public readonly TcpClient client;</p><p> public readonly StreamReader sr;</p><p> public readonly StreamWriter sw;</p><p> public string userName;</p><p> public
15、User(TcpClient client)</p><p><b> {</b></p><p> this.client = client;</p><p> this.userName = "";</p><p> NetworkStream netStream = client.Get
16、Stream();</p><p> sr = new StreamReader(netStream, System.Text.Encoding.Default);</p><p> sw = new StreamWriter(netStream, System.Text.Encoding.Default);</p><p><b> }</b
17、></p><p><b> 游戲桌位信息</b></p><p> 在資源管理器中,添加Player.cs,用于保存已經(jīng)坐到游戲桌位上玩家的情況。代碼如下:</p><p> class Player</p><p><b> {</b></p><p>
18、private User user;</p><p> public User GameUser</p><p><b> {</b></p><p><b> get</b></p><p> {return user; }</p><p><b> s
19、et</b></p><p> {user = value; }</p><p><b> }</b></p><p> public bool Start</p><p> {get{return start; }</p><p> set{start = value; }
20、</p><p><b> }</b></p><p> public Player()</p><p><b> {</b></p><p> start = false;</p><p> user = null;</p><p><
21、;b> }</b></p><p><b> }</b></p><p><b> 公用的方法</b></p><p> 在資源管理器中添加類文件Service.cs,用于提供公用的方法。代碼如下:</p><p> class Service</p>&l
22、t;p><b> {</b></p><p> private ListBox listbox;</p><p> private delegate void AddListBoxItemCallback(string str);</p><p> private AddListBoxItemCallback addListBox
23、ItemCallback;</p><p> public Service(ListBox listbox)</p><p><b> {</b></p><p> this.listbox = listbox;</p><p> addListBoxItemCallback = new AddListBoxIt
24、emCallback(AddListBoxItem);</p><p><b> }</b></p><p> public void AddListBoxItem(string str)</p><p><b> {</b></p><p> if (listbox.InvokeRequi
25、red == true)</p><p><b> {</b></p><p> listbox.Invoke(addListBoxItemCallback, str);</p><p><b> }</b></p><p><b> else</b></p>
26、;<p><b> {</b></p><p> if (listbox.IsDisposed == false)</p><p><b> {</b></p><p> listbox.Items.Add(str);</p><p> listbox.SelectedInd
27、ex = listbox.Items.Count - 1;</p><p> listbox.ClearSelected();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><
28、;p><b> 玩家房間狀態(tài)信息</b></p><p> 在資源管理器中添加一個(gè)類文件GameRoom.cs,用來(lái)保存玩家游戲的順序分配及判定輸贏。代碼如下:</p><p> class GameRoom</p><p><b> {</b></p><p> private G
29、obangBoard gameBoard = new GobangBoard();</p><p> public GobangBoard GameBoard</p><p><b> {</b></p><p><b> get</b></p><p><b> {</b&
30、gt;</p><p> return gameBoard;</p><p><b> }</b></p><p><b> }</b></p><p> /// <summary></p><p> /// 向listbox中添加顯示信息以及向客戶發(fā)送
31、信息</p><p> /// </summary></p><p> private ListBox listbox;</p><p> private Service service;</p><p><b> //構(gòu)造函數(shù)</b></p><p> public Gam
32、eRoom(ListBox listbox)</p><p><b> {</b></p><p> this.listbox = listbox;</p><p> gamePlayer[0] = new Player();</p><p> gamePlayer[1] = new Player();</
33、p><p> service = new Service(listbox);</p><p> //將棋盤上的棋子全部清除</p><p> gameBoard.InitializeBoard();</p><p><b> }</b></p><p> public void SetChe
34、ss(int i, int j, int chessColor)</p><p><b> {</b></p><p> //發(fā)送格式:SetChess,行,列,顏色</p><p> gameBoard.Grid[i, j] = chessColor;</p><p> gameBoard.NextIndex
35、= gameBoard.NextIndex == 0 ? 1 : 0;</p><p> service.SendToRoom(this, string.Format("SetChess,{0},{1},{2}", i, j, chessColor));</p><p> if (gameBoard.IsWin(i, j))</p><p>
36、<b> {</b></p><p> ShowWin(chessColor);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p>
37、service.SendToRoom(this, "NextChess," + gameBoard.NextIndex);</p><p><b> }</b></p><p><b> }</b></p><p> private void ShowWin(int chessColor)<
38、/p><p><b> {</b></p><p> gamePlayer[0].Start = false;</p><p> gamePlayer[1].Start = false;</p><p> gameBoard.InitializeBoard();</p><p> //發(fā)送格
39、式:Win,勝方棋子顏色</p><p> service.SendToRoom(this, string.Format("Win,{0}", chessColor));</p><p><b> }</b></p><p><b> }</b></p><p><b
40、> 登錄窗體事件</b></p><p> 在FormServer的代碼編輯下,添加對(duì)應(yīng)的控件代碼,源程序如下:</p><p> public partial class FormServer : Form</p><p><b> {</b></p><p> private int po
41、rt = 51888;</p><p> private TcpListener myListener;</p><p> private Service service;</p><p> public FormServer()</p><p><b> {</b></p><p>
42、InitializeComponent();</p><p> listBoxStatus.HorizontalScrollbar = true;</p><p> service = new Service(listBoxStatus);</p><p><b> }</b></p><p> private
43、void FormServer_Load(object sender, EventArgs e)</p><p><b> {</b></p><p> listBoxStatus.HorizontalScrollbar = true;</p><p> IPAddress[] addrIP = Dns.GetHostAddresses(
44、Dns.GetHostName());</p><p> localAddress = addrIP[0];</p><p> buttonStop.Enabled = false;</p><p><b> }</b></p><p> private void buttonStart_Click(object
45、 sender, EventArgs e)</p><p><b> {</b></p><p> if (int.TryParse(textBoxMaxTables.Text, out maxRoomNumbers) == false ||</p><p> int.TryParse(textBoxMaxUsers.Text, out
46、maxUsers) == false)</p><p><b> {</b></p><p> MessageBox.Show("請(qǐng)輸入在規(guī)定范圍內(nèi)的正整數(shù)");</p><p><b> return;</b></p><p><b> }</b>
47、</p><p> if (maxUsers < 1 || maxUsers > 500)</p><p><b> {</b></p><p> MessageBox.Show("允許進(jìn)入的人數(shù)只能在1-300之間");</p><p><b> return;<
48、/b></p><p><b> }</b></p><p> if (maxRoomNumbers < 1 || maxRoomNumbers > 100)</p><p><b> {</b></p><p> MessageBox.Show("允許開(kāi)出的房間
49、數(shù)只能在1-100之間");</p><p><b> return;</b></p><p><b> }</b></p><p> textBoxMaxUsers.Enabled = false;</p><p> textBoxMaxTables.Enabled = fals
50、e;</p><p><b> //初始化數(shù)組</b></p><p> gameRoom = new GameRoom[maxRoomNumbers];</p><p> for (int i = 0; i < maxRoomNumbers; i++)</p><p><b> {</b&
51、gt;</p><p> gameRoom[i] = new GameRoom(listBoxStatus);</p><p><b> }</b></p><p> myListener = new TcpListener(localAddress, port);</p><p> myListener.Sta
52、rt();</p><p> service.AddListBoxItem(string.Format(</p><p> "{0:yyyy年M月d日(dddd)h點(diǎn)m分} 開(kāi)始在{1}:{2}監(jiān)聽(tīng)客戶連接",</p><p> DateTime.Now, localAddress, port));</p><p>
53、 //創(chuàng)建一個(gè)線程監(jiān)聽(tīng)客戶端連接請(qǐng)求</p><p> ThreadStart ts = new ThreadStart(ListenClientConnect);</p><p> Thread myThread = new Thread(ts);</p><p> myThread.Start();</p><p> butto
54、nStart.Enabled = false;</p><p> buttonStop.Enabled = true;</p><p><b> }</b></p><p> private void buttonStop_Click(object sender, EventArgs e)</p><p><
55、b> {</b></p><p> service.AddListBoxItem(string.Format("目前連接用戶數(shù):{0}", userList.Count));</p><p> service.AddListBoxItem(string.Format(</p><p> "{0:yyyy年M月d
56、日(dddd)h點(diǎn)m分} 開(kāi)始停止服務(wù),并依次使用戶退出。",</p><p> DateTime.Now));</p><p> StopCLientAndListener();</p><p> buttonStart.Enabled = true;</p><p> buttonStop.Enabled = false
57、;</p><p> textBoxMaxUsers.Enabled = true;</p><p> textBoxMaxTables.Enabled = true;</p><p><b> }</b></p><p> private void StopCLientAndListener()</p&g
58、t;<p><b> {</b></p><p> for (int i = 0; i < userList.Count; i++)</p><p><b> {</b></p><p> userList[i].client.Close();</p><p><b
59、> }</b></p><p> myListener.Stop();</p><p><b> }</b></p><p> private void ListenClientConnect()</p><p><b> {</b></p><p&g
60、t; while (true)</p><p><b> {</b></p><p> TcpClient newClient = null;</p><p><b> try</b></p><p><b> {</b></p><p>
61、newClient = myListener.AcceptTcpClient();</p><p><b> }</b></p><p><b> catch</b></p><p><b> {</b></p><p><b> break;</b&g
62、t;</p><p><b> }</b></p><p> ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveData);</p><p> Thread threadReceive = new Thread(pts);</p><p
63、> User user = new User(newClient);</p><p> threadReceive.Start(user);</p><p> userList.Add(user);</p><p> service.AddListBoxItem(string.Format("[{0}]連接服務(wù)器成功。",</
64、p><p> newClient.Client.RemoteEndPoint));</p><p> service.AddListBoxItem(string.Format("當(dāng)前連接用戶數(shù):{0}", userList.Count));</p><p><b> }</b></p><p>&l
65、t;b> }</b></p><p> private void ReceiveData(object obj)</p><p><b> {</b></p><p> User user = (User)obj;</p><p> TcpClient client = user.client
66、;</p><p> bool normalExit = false;</p><p> bool exitWhile = false;</p><p> while (exitWhile == false)</p><p><b> {</b></p><p> string rece
67、iveString = null;</p><p><b> try</b></p><p><b> {</b></p><p> receiveString = user.sr.ReadLine();</p><p><b> }</b></p>&l
68、t;p><b> catch</b></p><p><b> {</b></p><p> service.AddListBoxItem("接收數(shù)據(jù)失敗");</p><p> RemovePlayerfromRoom(user);</p><p><b&g
69、t; }</b></p><p> if (receiveString == null)</p><p><b> {</b></p><p> if (normalExit == false)</p><p><b> {</b></p><p>
70、if (client.Connected == true)</p><p><b> {</b></p><p> service.AddListBoxItem(string.Format(</p><p> "與{0}失去聯(lián)系,已終止接收該用戶信息",</p><p> client.Cli
71、ent.RemoteEndPoint));</p><p> } </p><p> RemovePlayerfromRoom(user);</p><p><b> }</b></p><p><b> break;</b></p>
72、<p><b> }</b></p><p> string[] splitString = receiveString.Split(',');</p><p> int tableIndex = -1; //桌號(hào)</p><p> int side = -1; //座位號(hào)</
73、p><p> int anotherSide = -1; //對(duì)方座位號(hào)</p><p> string sendString = "";</p><p> /// <summary></p><p> /// 循環(huán)檢測(cè)該用戶是否坐到某游戲桌上</p><p> /// <
74、;/summary></p><p> private void RemovePlayerfromRoom(User user)</p><p><b> {</b></p><p> for (int i = 0; i < gameRoom.Length; i++)</p><p><b>
75、 {</b></p><p> if (gameRoom[i].BlackPlayer.GameUser != null)</p><p><b> {</b></p><p> if (gameRoom[i].BlackPlayer.GameUser == user)</p><p><b&g
76、t; {</b></p><p> StopPlayer(i, 0);</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> if (gam
77、eRoom[i].WhitePlayer.GameUser != null)</p><p><b> {</b></p><p> if (gameRoom[i].WhitePlayer.GameUser == user)</p><p><b> {</b></p><p> StopP
78、layer(i, 1);</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> for (int j = 0; j < gameRoom[i].lookOnUser.Coun
79、t; j++)</p><p><b> {</b></p><p> if (gameRoom[i].lookOnUser[j] != null)</p><p><b> {</b></p><p> if (gameRoom[i].lookOnUser[j] == user)</
80、p><p><b> {</b></p><p> gameRoom[i].lookOnUser.RemoveAt(j);</p><p><b> return;</b></p><p><b> }</b></p><p><b>
81、}</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /// <summary></p><p> /// 讓第i個(gè)房間第j個(gè)座位
82、的玩家退出房間</p><p> /// </summary></p><p> private void StopPlayer(int i, int j)</p><p><b> {</b></p><p> gameRoom[i].gamePlayer[j].Start = false;<
83、/p><p> //gameRoom[i].gamePlayer[j].GameUser = null;</p><p> //發(fā)送格式:Lost,座位號(hào),用戶名</p><p> service.SendToRoom(gameRoom[i],</p><p> string.Format("LostPlayer,{0},{1}
84、,{2}",</p><p> i, j, gameRoom[i].gamePlayer[j].GameUser.userName));</p><p><b> }</b></p><p> /// <summary></p><p> /// 獲取指定房間人員情況及昵稱字符串,每人之間用
85、/分隔。</p><p> /// 格式:黑方昵稱/白方昵稱/旁觀者昵稱/旁觀者昵稱/……</p><p> /// </summary></p><p> private string GetRoomOnlineString(int tableIndex)</p><p><b> {</b><
86、;/p><p> //此處不能用string,否則效率會(huì)很低</p><p> StringBuilder strBuilder = new StringBuilder();</p><p> GameRoom room = gameRoom[tableIndex];</p><p> for (int i = 0; i < roo
87、m.gamePlayer.Length; i++)</p><p><b> {</b></p><p> if (room.gamePlayer[i].GameUser != null)</p><p><b> {</b></p><p> strBuilder.Append(room.
88、gamePlayer[i].GameUser.userName);</p><p><b> }</b></p><p> strBuilder.Append("/");</p><p><b> }</b></p><p> for (int i = 0; i <
89、 room.lookOnUser.Count; i++)</p><p><b> {</b></p><p> strBuilder.Append(room.lookOnUser[i].userName);</p><p> strBuilder.Append("/");</p><p>&l
90、t;b> }</b></p><p> //移除最后一個(gè)/符號(hào)</p><p> strBuilder = strBuilder.Remove(strBuilder.Length - 1, 1);</p><p> return strBuilder.ToString();</p><p><b> }&
91、lt;/b></p><p> /// <summary></p><p> /// 獲取某桌棋盤上的落子情況</p><p> /// </summary></p><p> /// <param name="tableIndex">桌號(hào)(房間號(hào))</param&g
92、t;</p><p> /// <returns>棋盤上各棋子的位置</returns></p><p> private string GetBoardGrid(int tableIndex)</p><p><b> {</b></p><p> StringBuilder sb =
93、new StringBuilder();</p><p> int[,] grid = gameRoom[tableIndex].GameBoard.Grid;</p><p> for (int i = 0; i <= grid.GetUpperBound(0); i++)</p><p><b> {</b></p>
94、<p> for (int j = 0; j <= grid.GetUpperBound(1); j++)</p><p><b> {</b></p><p> sb.Append(grid[i, j].ToString());</p><p> sb.Append("/");</p>
95、;<p><b> }</b></p><p><b> }</b></p><p> //移除最后一個(gè)"/"符號(hào)</p><p> sb = sb.Remove(sb.Length - 1, 1);</p><p> return sb.ToString
96、();</p><p><b> }</b></p><p> //關(guān)閉窗體時(shí)觸發(fā)的事件</p><p> private void FormDDServer_FormClosing(object sender, FormClosingEventArgs e)</p><p><b> {</b&
97、gt;</p><p> //在沒(méi)有單擊開(kāi)始服務(wù)就直接退出時(shí),myListener為null</p><p> if (myListener != null)</p><p><b> {</b></p><p> StopCLientAndListener();</p><p><
98、b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> 五子棋主要代碼</b></p><p> 在資源管理器中生成一個(gè)類文件GobangBoard.cs,用于刷新,重畫棋盤,棋子,以及
99、玩家的輸贏判斷。代碼如下:</p><p> class GobangBoard</p><p><b> {</b></p><p><b> //無(wú)棋子</b></p><p> public const int None = -1;</p><p><b&
100、gt; //黑色棋子</b></p><p> public const int Black = 0;</p><p><b> //白色棋子</b></p><p> public const int White = 1;</p><p> //15*15的方格</p><p&
101、gt; private int[,] grid = new int[15, 15];</p><p> /// <summary></p><p><b> /// 棋盤</b></p><p> /// </summary></p><p> public int[,] Grid<
102、;/p><p><b> {</b></p><p><b> get</b></p><p><b> {</b></p><p> return grid;</p><p><b> }</b></p>&l
103、t;p><b> }</b></p><p> private int nextIndex;</p><p> /// <summary></p><p> /// 應(yīng)該黑棋放子還是白棋放子</p><p> /// </summary></p><p>
104、 public int NextIndex</p><p><b> {</b></p><p><b> get</b></p><p><b> {</b></p><p> return nextIndex;</p><p><b&g
105、t; }</b></p><p><b> set</b></p><p><b> {</b></p><p> nextIndex = value;</p><p><b> }</b></p><p><b> }
106、</b></p><p><b> //構(gòu)造函數(shù)</b></p><p> public GobangBoard()</p><p><b> {</b></p><p> InitializeBoard();</p><p><b> }&l
107、t;/b></p><p> /// <summary></p><p> /// 將*15的方格中的每個(gè)交叉點(diǎn)均設(shè)置為無(wú)棋子</p><p> /// </summary></p><p> public void InitializeBoard()</p><p><b&
108、gt; {</b></p><p> for (int i = 0; i <= grid.GetUpperBound(0); i++)</p><p><b> {</b></p><p> for (int j = 0; j <= grid.GetUpperBound(1); j++)</p>&
109、lt;p><b> {</b></p><p> grid[i, j] = None;</p><p><b> }</b></p><p><b> }</b></p><p> nextIndex = Black;</p><p>&
110、lt;b> }</b></p><p> /// <summary></p><p> /// 判斷下棋位置是否有棋子</p><p> /// </summary></p><p> public bool IsExist(int i, int j)</p><p>
111、;<b> {</b></p><p> if (grid[i, j] != None)</p><p><b> {</b></p><p> return true;</p><p><b> }</b></p><p><b>
112、 else</b></p><p><b> {</b></p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><p> /// <summary&
113、gt;</p><p> /// 獲取棋子落下后是否獲勝</p><p> /// </summary></p><p> public bool IsWin(int i, int j)</p><p><b> {</b></p><p> //與方格的第i,j交叉點(diǎn)向四個(gè)
114、方向的連子數(shù),依次是水平,垂直,左上右下,左下右上</p><p> int[] numbers = new int[4];</p><p> numbers[0] = GetRowNumber(i, j);</p><p> numbers[1] = GetColumnNumber(i, j);</p><p> numbers[2
115、] = GetBacklashNumber(i, j);</p><p> numbers[3] = GetSlashNumber(i, j);</p><p><b> //檢查是否獲勝</b></p><p> for (int k = 0; k < numbers.Length; k++)</p><p&g
116、t;<b> {</b></p><p> if (Math.Abs(numbers[k]) == 5)</p><p><b> {</b></p><p> return true;</p><p><b> }</b></p><p>&
117、lt;b> }</b></p><p> return false;</p><p><b> }</b></p><p> /// <summary></p><p> /// 判斷橫向相同顏色的棋子個(gè)數(shù)</p><p> /// </summar
118、y></p><p> /// <returns>同色棋子個(gè)數(shù)</returns></p><p> private int GetRowNumber(int i, int j)</p><p><b> {</b></p><p><b> //連子個(gè)數(shù)</b>
119、;</p><p> int num = 1;</p><p><b> //向右檢查</b></p><p> int x = i + 1;</p><p> while (x < 15)</p><p><b> {</b></p><
120、p> //前方棋子與i,j點(diǎn)不同時(shí)跳出循環(huán)</p><p> if (grid[x, j] == grid[i, j])</p><p><b> {</b></p><p><b> num++;</b></p><p><b> x++;</b></p
121、><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> break;</b></p><p><b> }</b><
122、;/p><p><b> }</b></p><p><b> //向左檢查</b></p><p> x = i - 1;</p><p> while (x >= 0)</p><p><b> {</b></p><
123、p> //前方棋子與i,j點(diǎn)不同時(shí)跳出循環(huán)</p><p> if (grid[x, j] == grid[i, j])</p><p><b> {</b></p><p><b> num++;</b></p><p><b> x--;</b></p
124、><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> break;</b></p><p><b> }</b><
125、;/p><p><b> }</b></p><p> return num;</p><p><b> }</b></p><p> /// <summary></p><p> /// 判斷縱向相同顏色的棋子個(gè)數(shù)</p><p>
126、 /// </summary></p><p> /// <returns>同色棋子個(gè)數(shù)</returns></p><p> private int GetColumnNumber(int i, int j)</p><p><b> {</b></p><p><b&
127、gt; //連子個(gè)數(shù)</b></p><p> int num = 1;</p><p><b> //向下檢查</b></p><p> int y = j + 1;</p><p> while (y < 15)</p><p><b> {</b
128、></p><p> //前方的棋子與i,j點(diǎn)不同時(shí)跳出循環(huán)</p><p> if (grid[i, y] == grid[i, j])</p><p><b> {</b></p><p><b> num++;</b></p><p><b>
129、 y++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> break;</b></p><p><
130、b> }</b></p><p><b> }</b></p><p><b> //向上檢查</b></p><p> y = j - 1;</p><p> while (y >= 0)</p><p><b> {</
131、b></p><p> //前方的棋子與i,j點(diǎn)不同時(shí)跳出循環(huán)</p><p> if (grid[i, y] == grid[i, j])</p><p><b> {</b></p><p><b> num++;</b></p><p><b>
132、 y--;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> break;</b></p><p><
133、;b> }</b></p><p><b> }</b></p><p> return num;</p><p><b> }</b></p><p> /// <summary></p><p> /// 判斷左上到右下相同顏色的
134、棋子個(gè)數(shù)</p><p> /// </summary></p><p> /// <returns>同色棋子個(gè)數(shù)</returns></p><p> private int GetBacklashNumber(int i, int j)</p><p><b> {</b>
135、</p><p><b> //連子個(gè)數(shù)</b></p><p> int num = 1;</p><p><b> //右下方向</b></p><p> int x = i + 1;</p><p> int y = j + 1;</p><
136、;p> while (x < 15 && y < 15)</p><p><b> {</b></p><p> //前方的棋子與i,j點(diǎn)不同時(shí)跳出循環(huán)</p><p> if (grid[x, y] == grid[i, j])</p><p><b> {<
137、/b></p><p><b> num++;</b></p><p><b> x++;</b></p><p><b> y++;</b></p><p><b> }</b></p><p><b>
138、 else</b></p><p><b> {</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> //左上方
139、向(x-,y-)</p><p> x = i - 1;</p><p> y = j - 1;</p><p><b> //不超出棋格</b></p><p> while (x >= 0 && y >= 0)</p><p><b> {<
140、;/b></p><p> //前方的棋子與i,j點(diǎn)不同時(shí)跳出循環(huán)</p><p> if (grid[x, y] == grid[i, j])</p><p><b> {</b></p><p><b> num++;</b></p><p><b&g
141、t; x--;</b></p><p><b> y--;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><
142、;b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> return num;</p><p><b> }</b></p><p> /// <su
143、mmary></p><p> /// 判斷左下到右上相同顏色的棋子個(gè)數(shù)</p><p> /// </summary></p><p> /// <returns>同色棋子個(gè)數(shù)</returns></p><p> private int GetSlashNumber(int i, int
144、j)</p><p><b> {</b></p><p><b> //連子個(gè)數(shù)</b></p><p> int num = 1;</p><p> int x = i - 1;</p><p> int y = j + 1;</p><p&
145、gt; while (x >= 0 && y < 15)</p><p><b> {</b></p><p> if (grid[x, y] == grid[i, j])</p><p><b> {</b></p><p><b> num++;&
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五子棋-課程設(shè)計(jì)報(bào)告
- 五子棋課程設(shè)計(jì)
- java課程設(shè)計(jì)報(bào)告-五子棋
- 五子棋游戲課程設(shè)計(jì)報(bào)告
- 五子棋畢業(yè)課程設(shè)計(jì)報(bào)告
- java五子棋課程設(shè)計(jì)
- 網(wǎng)絡(luò)五子棋五子棋設(shè)計(jì)與實(shí)現(xiàn).doc
- java課程設(shè)計(jì)--五子棋
- 五子棋java課程設(shè)計(jì)
- 五子棋java課程設(shè)計(jì)
- 五子棋java語(yǔ)言課程設(shè)計(jì)報(bào)告
- c++五子棋課程設(shè)計(jì)報(bào)告
- qt網(wǎng)絡(luò)五子棋五子棋設(shè)計(jì)與實(shí)現(xiàn)
- java課程設(shè)計(jì)--五子棋游戲
- java課程設(shè)計(jì)--對(duì)戰(zhàn)五子棋
- 五子棋c++課程設(shè)計(jì)
- 五子棋c++課程設(shè)計(jì)
- 五子棋小游戲課程設(shè)計(jì)
- c語(yǔ)言五子棋課程設(shè)計(jì)
- c語(yǔ)言圖形五子棋課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論