Chessboard.cs
上传用户:yiyuerguo
上传日期:2014-09-27
资源大小:3781k
文件大小:5k
源码类别:

C#编程

开发平台:

Others

  1. using System;
  2. using System.Collections;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. namespace FiveStones
  6. {
  7. /// <summary>
  8. /// Chessboard 的摘要说明。
  9. /// 棋盘类
  10. /// </summary>
  11. public class Chessboard
  12. {
  13. //arrchessboard为棋盘情况数组,arrchessboard[i,j]=2表示此处无子,arrchessboard[i,j]=0表示此处为黑子,arrchessboard[i,j]=1表示此处为白子
  14. private int[,] arrchessboard = new int [15,15]; 
  15.         //绘制的对象
  16. private Graphics mg;
  17. //棋子对象
  18. private Stone stone;
  19. //电脑对象
  20. private Computer computer;
  21. //判断当前棋子是黑(true)是白(false)
  22. private bool stoneflag = true;
  23. //判断先手玩家(是电脑(true)还是人(false),先手下黑棋)
  24. private bool mplayfirstflag = false;
  25. //历史记录堆栈
  26. private Stack mStarckHistory = new Stack();
  27. /// <summary>
  28. /// 历史记录属性
  29. /// </summary>
  30. public Stack StarckHistory
  31. {
  32. get
  33. {
  34. return mStarckHistory;
  35. }
  36. }
  37. /// <summary>
  38. /// 构造函数
  39. /// </summary>
  40. /// <param name="g">绘制的对象</param>
  41. public Chessboard(Graphics g)
  42. {
  43. mg = g;
  44. Initialization();
  45. }
  46. /// <summary>
  47. /// 画棋盘
  48. /// </summary>
  49. public void Draw()
  50. {
  51. //读取棋盘图像
  52. //从资源中获取
  53. System.Reflection.Assembly thisExe;
  54. thisExe = System.Reflection.Assembly.GetExecutingAssembly();
  55. System.IO.Stream file = thisExe.GetManifestResourceStream("FiveStones.chessboard.gif");
  56. Image imgChessboard = System.Drawing.Image.FromStream(file);  //棋盘图片 大小600*600像素
  57. file.Close();
  58. mg.DrawImage(imgChessboard,0,0,imgChessboard.Width,imgChessboard.Height);
  59. //绘制棋子
  60. for (int i=0;i<15;i++)
  61. {
  62. for(int j=0;j<15;j++)
  63. {
  64. if (arrchessboard[i,j] == 0)
  65. {
  66. stone.DrawStone(i,j,true);
  67. }
  68. if (arrchessboard[i,j] == 1)
  69. {
  70. stone.DrawStone(i,j,false);
  71. }
  72. }
  73. }
  74. }
  75. /// <summary>
  76. /// 下棋
  77. /// </summary>
  78. /// <param name="m"></param>
  79. /// <param name="n"></param>
  80. private void DownStone(int m,int n)
  81. {
  82. stone.DrawStone(m,n,stoneflag);
  83. //记录情况
  84. if (stoneflag)
  85. {
  86. arrchessboard[m,n] = 0;
  87. }
  88. else
  89. {
  90. arrchessboard[m,n] = 1;
  91. }
  92. //记录历史记录
  93. if (stoneflag)
  94. {
  95. mStarckHistory.Push("黑:"+m.ToString()+","+n.ToString());
  96. }
  97. else
  98. {
  99. mStarckHistory.Push("白:"+m.ToString()+","+n.ToString());
  100. }
  101. //判断结果
  102. if (Rule.Result(m,n,arrchessboard) < 6)
  103. {
  104. switch(Rule.Result(m,n,arrchessboard))
  105. {
  106. case 1:
  107. MessageBox.Show("黑棋双三禁手失败!");
  108. break;
  109. case 2:
  110. MessageBox.Show("黑棋双四禁手失败!");
  111. break;
  112. case 3:
  113. MessageBox.Show("黑棋长连禁手失败!");
  114. break;
  115. case 4:
  116. if (stoneflag)
  117. {
  118. MessageBox.Show("黑棋胜利!");
  119. }
  120. else
  121. {
  122. MessageBox.Show("白棋胜利!");
  123. }
  124. break;
  125. case 5:
  126. MessageBox.Show("平局!");
  127. break;
  128. }
  129. //重新开始!
  130. Start();
  131. return;
  132. }
  133. else
  134. {
  135. //交换当前棋子颜色
  136. stoneflag = !stoneflag;
  137. }
  138. //测试
  139. //MessageBox.Show(Rule.Result(m,n,arrchessboard).ToString());
  140. }
  141. /// <summary>
  142. /// 人下棋
  143. /// </summary>
  144. /// <param name="x"></param>
  145. /// <param name="y"></param>
  146. public void PersonDownStone(int x,int y)
  147. {
  148. if (x < 600 && y < 600)
  149. {
  150. //取下棋点
  151. int m = (int)Math.Floor(x/40);
  152. int n = (int)Math.Floor(y/40);
  153. if (!Rule.IsExist(m,n,arrchessboard))
  154. {
  155. DownStone(m,n);
  156. ComputerDownStone();
  157. }
  158. }
  159. }
  160. /// <summary>
  161. /// 电脑下棋
  162. /// </summary>
  163. private void ComputerDownStone()
  164. {
  165. int m,n,count=0;
  166. do
  167. {
  168. computer.Down(arrchessboard);
  169. m = computer.X;
  170. n = computer.Y;
  171. count++;
  172. if (count > 100)
  173. {
  174. MessageBox.Show("异常!");
  175. Start();
  176. return;
  177. }
  178. }
  179. while(Rule.IsExist(m,n,arrchessboard));
  180. DownStone(m,n);
  181. }
  182. /// <summary>
  183. /// 开始(是电脑(true)还是人(false))
  184. /// </summary>
  185. /// <param name="playfirstflag">判断先手玩家(是电脑(true)还是人(false),先手下黑棋)</param>
  186. public void Start(bool playfirstflag)
  187. {
  188. mplayfirstflag = playfirstflag;
  189. Start();
  190. }
  191. /// <summary>
  192. /// 开始
  193. /// </summary>
  194. private void Start()
  195. {
  196. Initialization();
  197. //构造电脑对象
  198. computer = new Computer(mplayfirstflag);
  199. //画棋盘
  200. Draw();
  201. if (mplayfirstflag)
  202. {
  203. ComputerDownStone();
  204. }
  205. }
  206. /// <summary>
  207. /// 初始化
  208. /// </summary>
  209. private void Initialization()
  210. {
  211. //置当前要走的棋为黑棋(黑棋先走)
  212. stoneflag = true;
  213. //把棋盘所有位置置为空(未下子)
  214. for(int i=0;i<15;i++)
  215. {
  216. for(int j=0;j<15;j++)
  217. {
  218. arrchessboard[i,j] = 2;  
  219. }
  220. }
  221. //清空历史记录堆栈
  222. mStarckHistory.Clear();
  223. //构造棋子对象
  224. stone = new Stone(mg);
  225. }
  226. }
  227. }