C#窗体编写 • 【五子棋】- 进阶版!

向右看齐 2022-10-05 01:57 218阅读 0赞

1.0版:C#窗体程序编写 • 【五子棋】

进阶内容,主要有 悔棋 功能,和 棋盘下满 时的处理

友情提示:先了解之前的 1.0版五子棋

" class="reference-link">No1.悔棋在这里插入图片描述

第一步.定义一个列表(用于记录下棋顺序)

  1. // 窗体程序
  2. public partial class Form1 : Form
  3. {
  4. private bool start; // 游戏是否开始
  5. private bool ChessCheck = true; // 白子黑子回合
  6. private const int size = 15; // 棋盘大小
  7. private int[,] CheckBoard = new int[size, size]; // 棋盘点位数组
  8. --> private List<Retract> RetractList = new List<Retract>(); *用于悔棋的列表*
  9. List<Retract> 里的Retract是一个类,先不要纠结为什么报错,请看第二步
  10. }

第二步.定义一个类,记录棋子的 X 轴和 Y 轴,也就是点位

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace day11_01
  7. {
  8. // 记录上一个棋子放的位置
  9. class Retract
  10. {
  11. // 构造函数,实例化时传坐标参数
  12. public Retract(int X, int Y)
  13. {
  14. this.X = X;
  15. this.Y = Y;
  16. }
  17. // 默认-1,也就是无效坐标
  18. public int X = -1, Y = -1;
  19. }
  20. }

第三步.”略微”修改棋盘的点击事件

***星号包裹的代码,就是添加的代码 ***

  1. // 面板"棋盘"MouseDown事件
  2. private void panel1_MouseDown(object sender, MouseEventArgs e)
  3. {
  4. // 判断游戏是否开始
  5. if (start)
  6. {
  7. int Judgment = 0; // 判断数组当前行列,白子还是黑子回合,0表示没有,1表示黑子,2表示白子、用来判断胜利
  8. int PlacementX = e.X / MainSize.CBoardGap; // 求鼠标点击的X方向的第几个点位
  9. int PlacementY = e.Y / MainSize.CBoardGap; // 求鼠标点击的Y方向的第几个点位
  10. try
  11. {
  12. // 判断此位置是否为空
  13. if (CheckBoard[PlacementX, PlacementY] != 0)
  14. {
  15. return; // 此位置有棋子
  16. }
  17. // 黑子回合还是白子回合
  18. if (ChessCheck)
  19. {
  20. CheckBoard[PlacementX, PlacementY] = 1; // 黑子回合
  21. Judgment = 1; // 切换为判断黑子
  22. label1.Text = "白子回合"; // 提示文本改为"白子回合"
  23. }
  24. else
  25. {
  26. CheckBoard[PlacementX, PlacementY] = 2; // 白子回合
  27. Judgment = 2; // 切换为判断白子
  28. label1.Text = "黑子回合"; // 提示文本改为"黑子回合"
  29. }
  30. Chess.DrawC(panel1, ChessCheck, PlacementX, PlacementY); // 画棋子
  31. -----> RetractList.Add(new Retract(PlacementX, PlacementY)); *记录棋子的位置,用于悔棋*
  32. // 胜利判断
  33. if (WinJudgment.ChessJudgment(CheckBoard, Judgment))
  34. {
  35. // 判断黑子还是白子胜利
  36. if (Judgment == 1)
  37. {
  38. MessageBox.Show("五连珠,黑胜!", "胜利提示"); // 提示黑胜
  39. }
  40. else
  41. {
  42. MessageBox.Show("五连珠,白胜!", "胜利提示"); // 提示白胜
  43. }
  44. initializeGame(); // 调用初始化游戏
  45. }
  46. ChessCheck = !ChessCheck; // 换棋子
  47. }
  48. catch(Exception) {
  49. } // 防止鼠标点击边界,导致数组越界
  50. }
  51. else
  52. {
  53. MessageBox.Show("请先开始游戏!", "提示"); // 提示开始游戏
  54. }
  55. }

第四步.添加“悔棋”按钮(和它的点击事件)

在这里插入图片描述

按钮的点击事件

  1. // 按钮‘悔棋’Click事件
  2. private void button2_Click(object sender, EventArgs e)
  3. {
  4. // 获取悔棋列表中,最后一个棋子的索引
  5. int Index = RetractList.Count - 1;
  6. // 判断悔棋列表是否为空
  7. if (Index == -1)
  8. {
  9. MessageBox.Show("成功撤回空气!", "提示");
  10. return;
  11. }
  12. // 判断并获取最后一个棋子是白子还是黑子
  13. string ChessCheckStr = "";
  14. if (ChessCheck)
  15. {
  16. ChessCheckStr = "白方";
  17. }
  18. else
  19. {
  20. ChessCheckStr = "黑方";
  21. }
  22. // 得到最后一个棋子的位置
  23. Retract retract = RetractList[Index];
  24. // 确认是否悔棋
  25. if (MessageBox.Show("确认要撤回\"" + ChessCheckStr + " : 坐标[" + retract.X + ", " + retract.Y + "]\"的棋子吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
  26. {
  27. // 在悔棋列表中,删除上一个棋子
  28. RetractList.RemoveAt(Index);
  29. // 点位数组中,清除上一个棋子
  30. CheckBoard[retract.X, retract.Y] = 0;
  31. // 刷新窗体
  32. this.Refresh();
  33. // 换棋子
  34. ChessCheck = !ChessCheck;
  35. }
  36. }

到这里就OK了吗? no no no

第五步.调整一些方法(比如 初始化时,顺便把“悔棋”列表清空)

  1. // 初始化游戏
  2. private void initializeGame()
  3. {
  4. // 棋盘点位数组 重置为0
  5. for (int i = 0; i < size; i++)
  6. {
  7. for (int j = 0; j < size; j++)
  8. {
  9. CheckBoard[i, j] = 0;
  10. }
  11. }
  12. --> RetractList.Clear(); *清空悔棋列表*
  13. start = false; // 未开始
  14. label1.Text = "游戏未开始"; // 提示文本改为"游戏未开始"
  15. button1.Visible = true; // 显示'开始游戏'按钮
  16. button4.Visible = false; // 隐藏'重新开始'按钮
  17. --> btnRetract.Visible = false; *隐藏'悔棋'按钮*
  18. }
  19. // 按钮"开始游戏"CLick事件
  20. private void button1_Click(object sender, EventArgs e)
  21. {
  22. start = true; // 开始
  23. ChessCheck = true; // 黑子回合
  24. label1.Text = "黑子回合"; // 提示文本改为"黑子回合"
  25. button1.Visible = false; // 隐藏'开始游戏'按钮
  26. button4.Visible = true; // 显示'重新开始'按钮
  27. --> btnRetract.Visible = true; *显示'悔棋'按钮*
  28. panel1.Invalidate(); // 重绘面板"棋盘"
  29. }

OK了,最后的棋盘下满判断!只需要3行!

No2.棋盘下满时

就一步.“着重”修改棋盘的点击事件

在这里插入图片描述
别问我怎么下满的~

  1. // 面板"棋盘"MouseDown事件
  2. private void panel1_MouseDown(object sender, MouseEventArgs e)
  3. {
  4. // 判断游戏是否开始
  5. if (start)
  6. {
  7. int Judgment = 0; // 判断数组当前行列,白子还是黑子回合,0表示没有,1表示黑子,2表示白子、用来判断胜利
  8. int PlacementX = e.X / MainSize.CBoardGap; // 求鼠标点击的X方向的第几个点位
  9. int PlacementY = e.Y / MainSize.CBoardGap; // 求鼠标点击的Y方向的第几个点位
  10. try
  11. {
  12. // 判断此位置是否为空
  13. if (CheckBoard[PlacementX, PlacementY] != 0)
  14. {
  15. return; // 此位置有棋子
  16. }
  17. // 黑子回合还是白子回合
  18. if (ChessCheck)
  19. {
  20. CheckBoard[PlacementX, PlacementY] = 1; // 黑子回合
  21. Judgment = 1; // 切换为判断黑子
  22. label1.Text = "白子回合"; // 提示文本改为"白子回合"
  23. }
  24. else
  25. {
  26. CheckBoard[PlacementX, PlacementY] = 2; // 白子回合
  27. Judgment = 2; // 切换为判断白子
  28. label1.Text = "黑子回合"; // 提示文本改为"黑子回合"
  29. }
  30. Chess.DrawC(panel1, ChessCheck, PlacementX, PlacementY); // 画棋子
  31. RetractList.Add(new Retract(PlacementX, PlacementY)); // 记录棋子的位置,用于悔棋
  32. // 胜利判断
  33. if (WinJudgment.ChessJudgment(CheckBoard, Judgment))
  34. {
  35. // 判断黑子还是白子胜利
  36. if (Judgment == 1)
  37. {
  38. MessageBox.Show("五连珠,黑胜!", "胜利提示"); // 提示黑胜
  39. }
  40. else
  41. {
  42. MessageBox.Show("五连珠,白胜!", "胜利提示"); // 提示白胜
  43. }
  44. initializeGame(); // 调用初始化游戏
  45. }
  46. -----> else if (RetractList.Count == size * size) 悔棋列表的总数 = 棋盘点位总数时
  47. {
  48. -----> MessageBox.Show("平局!可喜可贺,找到了旗鼓相当的对手!", "胜利提示"); *提示平局*
  49. -----> initializeGame(); *调用初始化游戏*
  50. }
  51. ChessCheck = !ChessCheck; // 换棋子
  52. }
  53. catch(Exception) {
  54. } // 防止鼠标点击边界,导致数组越界
  55. }
  56. else
  57. {
  58. MessageBox.Show("请先开始游戏!", "提示"); // 提示开始游戏
  59. }
  60. }

发表评论

表情:
评论列表 (有 0 条评论,218人围观)

还没有评论,来说两句吧...

相关阅读