2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩44頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論