每日励志
现在我们回归正题,这次我们要做的是五子棋,所谓五子棋,也就是在一个棋盘内,分为白子和黑子,若有一方(且没有阻挡下)上下左右斜着歪着能凑到5个子,就算他赢了,效果图如下↓
在此,我先讲讲具体思路
1.先画一个10*10的格子(最正规的格子数量)
2.有了图之后,监测若鼠标按下,判断在哪个线交叉范围间,接着在那个线交叉的范围间画一个小圆圈(有艺术细胞的可以换成菱形等,这里将通用圆形)
3.判断上下左右斜着的棋子能不能凑到5个以上,并且中间不能有不同颜色的棋子隔着,赢的话就结束游戏
在此之前先导入包
using System.Windows.Forms;using System.Threading;
接下来开始正式写代码
1.创建一个项目,把界面制作成这个样子的(上面菜单是menuStrip)
设置大小为700, 618(十分吉利),颜色随便,我比较喜欢indianRed,文件方面下次再讲,先把基础功能完善
这时双击一下“开始游戏”选项,进入编辑阶段
2.在空间下添加全局共有变量
public bool startgame { get; set; }//是否开始游戏public bool ones { get; set; }//true为白方,false为黑方string[] steps = new string[100];//棋盘列表
3.在开始游戏(如下图)下方添加代码
ones = true;Pen sc = new Pen(Color.Brown, 2);Graphics g = this.CreateGraphics();g.Clear(Color.IndianRed);//清理棋盘g.DrawRectangle(sc, 40, 40, this.Width - 130, this.Height - 110);int start = ((this.Width - 100) % 11) / 2;int final = ((this.Height - 100) % 11) / 2;for (int i = 0; i < 10; i++)//竖着的线{g.DrawLine(sc, 60 + start + 40 * i, 40, 60 + start + 40 * i, this.Height - 70);//绘制棋盘,每条线之间格40个像素Thread.Sleep(10);}for (int i = 0; i < 10; i++)//横着的线{g.DrawLine(sc, 40, 60 + final + 40 * i, 438, 60 + final + 40 * i);Thread.Sleep(10);}//string[] steps = new string[100];for (int i = 0; i < 10; i++)//行{for (int j = 0; j < 10; j++)//列{steps[i * 10 + j] = "0";}}ones = true;startgame = true;
这里是将每一个格子以60个像素分开,最终可以得到一个10*10的棋盘,如图所示
4.在加载方面添加代码如下
private void Form1_Load(object sender, EventArgs e){startgame = false;this.MaximizeBox = false;this.MinimizeBox = false;this.MouseClick += Form1_MouseClick;}
这里先将开始游戏设置为false,再关闭放大或者缩小,并添加鼠标按下这一事件(刚添加时可能会报错,但后面把这个实例化之后就没有了)
5.添加判断选项
判断选项其实很简单,横着就是同一行下来,左看看又看看,竖着,斜着(有两种)都是如此,但是同时也要谨防列表超出,所以也要给它设置一个条件,让他在四个角落时不能判断。原理图如下
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
……………………………………
相信聪明的你早已发现规律,也就是判断上下左右的规律了,那么,把这盘数字作为下标放进列表里,在往这个列表里填内容再判断即可大功告成
代码如下(把这些代码放进去即可)
竖着判断
白方:
public bool white_judge_vertical(int i, int j)//白方竖着的判断{int num = 1;if (j != 0){for (int k = 1; k < 5; k++){if (j - k >= 0){string c = steps[(j - k) * 10 + i];if (c != "1"){break;}else{num += 1;}}else{break;}}}if (j != 9){for (int k = 1; k < 5; k++){if (j + k <= 9){string c = steps[(j + k) * 10 + i];if (c != "1"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{return false;}}
黑方:
public bool black_judge_vertical(int i, int j)//黑方竖着的判断{int num = 1;if (j != 0){for (int k = 1; k < 5; k++){if (j - k >= 0){string c = steps[(j - k) * 10 + i];if (c != "2"){break;}else{num += 1;}}else{break;}}}if (j != 9){for (int k = 1; k < 5; k++){if (j + k <= 9){string c = steps[(j + k) * 10 + i];if (c != "2"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{return false;}}
横着判断:
白方:
public bool white_judge_transverse(int i, int j)//白方横着的判断{int num = 1;if (i != 0){for (int k = 1; k < 5; k++){if (i - k >= 0){string c = steps[j * 10 + i - k];//原来的行数保持不变,列数每个-1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (i != 9){for (int k = 1; k < 5; k++){if (j + k <= 9){string c = steps[j * 10 + i + k];//原来的行数保持不变,列数每个+1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{return false;}}
黑方:
public bool black_judge_transverse(int i, int j)//黑方横着的判断{int num = 1;if (i != 0){for (int k = 1; k < 5; k++){if (j - k >= 0){string c = steps[j * 10 + i - k];if (c != "2"){break;}else{num += 1;}}else{break;}}}if (i != 9){for (int k = 1; k < 5; k++){if (j + k <= 9){string c = steps[j * 10 + i + k];if (c != "2"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{return false;}}
斜着判断
白方:
public bool white_judge_oblique(int i, int j)//白方斜着的判断{int num = 1;//同加同减if (i != 0 && j != 0){for (int k = 1; k < 5; k++){if (i - k >= 0 && j - k >= 0){string c = steps[(j - k) * 10 + i - k];//行数-1,省下来的列数每个-1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (i != 9 && j != 9){for (int k = 1; k < 5; k++){if (j + k <= 9 && i+k<=9){string c = steps[(j + k) * 10 + i + k];//行数+1,省下来的列数每个+1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{num = 1;}//不同加不同减if (i != 0 && j != 9){for (int k = 1; k < 5; k++){if (i + k <= 9 && j - k >= 0){string c = steps[(j + k) * 10 + i - k];//行数+1,列数-1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (i != 9 || j != 0){for (int k = 1; k < 5; k++){if (j - k >= 0 && i+k<=9){string c = steps[(j - k) * 10 + i + k];//行数-1,列数+1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{num = 1;return false;}}
黑方:
public bool black_judge_oblique(int i,int j)//黑方斜着的判断{{int num = 1;//同加同减if (i != 0 && j != 0){for (int k = 1; k < 5; k++){if (i - k >= 0 && j - k >= 0){string c = steps[(j - k) * 10 + i - k];//行数-1,省下来的列数每个-1if (c != "2"){break;}else{num += 1;}}else{break;}}}if (i != 9 && j != 9){for (int k = 1; k < 5; k++){if (j + k <= 9 && i + k <= 9){string c = steps[(j + k) * 10 + i + k];//行数+1,省下来的列数每个+1if (c != "2"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{num = 1;}//不同加不同减if (i != 0 && j != 9){for (int k = 1; k < 5; k++){if (i + k <= 9 && j - k >= 0){string c = steps[(j + k) * 10 + i - k];//行数+1,列数-1if (c != "2"){break;}else{num += 1;}}else{break;}}}if (i != 9 || j != 0){for (int k = 1; k < 5; k++){if (j - k >= 0 && i + k <= 9){string c = steps[(j - k) * 10 + i + k];//行数-1,列数+1if (c != "2"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{num = 1;return false;}}}
这就三个判断了,接下来只需要写入鼠标按下的事件即可!
private void Form1_MouseClick(object sender, MouseEventArgs e){if (startgame){string tiqv = string.Empty;//辅助,看过程更明白int num = 0;//连的个数Pen Wh = new Pen(Color.White, 20);Pen BL = new Pen(Color.Black, 20);Graphics g = this.CreateGraphics();Point formPoint = this.PointToClient(Control.MousePosition);int x = formPoint.X;int y = formPoint.Y;//i为列,j为行for (int i = 0; i < 10; i++){if (x < 75 + 40 * i && x > 55 + 40 * i)//判断是在那一列上{for (int j = 0; j < 10; j++){if (y < 70 + 40 * j && y > 50 + 40 * j)//判断是在那一行上{tiqv = steps[j * 10 + i];if (tiqv == "0"){if (ones){g.DrawEllipse(Wh, 59 + 40 * i, 54 + 40 * j, 10, 10);ones = false;steps[j * 10 + i] = "1";//设置为白,代表这里是白下过的//竖着有五个子的胜利判断bool win = white_judge_vertical(i, j);if (win){MessageBox.Show("白方赢了!");}else{win = white_judge_transverse(i, j);if (win){MessageBox.Show("白方赢了!");}else{win = white_judge_oblique(i, j);if (win){MessageBox.Show("白方赢了!");}}}}else{g.DrawEllipse(BL, 59 + 40 * i, 54 + 40 * j, 10, 10);ones = true;steps[j * 10 + i] = "2";//设置为黑,代表这里是黑下过的//竖着有五个子的胜利判断bool win = black_judge_vertical(i, j);if (win){MessageBox.Show("黑方赢了!");}else{win = black_judge_transverse(i, j);if (win){MessageBox.Show("黑方赢了!");}else{win = black_judge_oblique(i, j);if (win){MessageBox.Show("黑方赢了!");}}}}break;}else{MessageBox.Show("你不可以在别人或自己下过的地方在下一次!");}}}}}}}
这样一个五子棋便制作完成
所有代码总结如下
private void Form1_Load(object sender, EventArgs e){startgame = false;this.MaximizeBox = false;this.MinimizeBox = false;this.MouseClick += Form1_MouseClick;}private void Form1_MouseClick(object sender, MouseEventArgs e){if (startgame){string tiqv = string.Empty;//辅助,看过程更明白int num = 0;//连的个数Pen Wh = new Pen(Color.White, 20);Pen BL = new Pen(Color.Black, 20);Graphics g = this.CreateGraphics();Point formPoint = this.PointToClient(Control.MousePosition);int x = formPoint.X;int y = formPoint.Y;//i为列,j为行for (int i = 0; i < 10; i++){if (x < 75 + 40 * i && x > 55 + 40 * i)//判断是在那一列上{for (int j = 0; j < 10; j++){if (y < 70 + 40 * j && y > 50 + 40 * j)//判断是在那一行上{tiqv = steps[j * 10 + i];if (tiqv == "0"){if (ones){g.DrawEllipse(Wh, 59 + 40 * i, 54 + 40 * j, 10, 10);ones = false;steps[j * 10 + i] = "1";//设置为白,代表这里是白下过的//竖着有五个子的胜利判断bool win = white_judge_vertical(i, j);if (win){MessageBox.Show("白方赢了!");}else{win = white_judge_transverse(i, j);if (win){MessageBox.Show("白方赢了!");}else{win = white_judge_oblique(i, j);if (win){MessageBox.Show("白方赢了!");}}}}else{g.DrawEllipse(BL, 59 + 40 * i, 54 + 40 * j, 10, 10);ones = true;steps[j * 10 + i] = "2";//设置为黑,代表这里是黑下过的//竖着有五个子的胜利判断bool win = black_judge_vertical(i, j);if (win){MessageBox.Show("黑方赢了!");}else{win = black_judge_transverse(i, j);if (win){MessageBox.Show("黑方赢了!");}else{win = black_judge_oblique(i, j);if (win){MessageBox.Show("黑方赢了!");}}}}break;}else{MessageBox.Show("你不可以在别人或自己下过的地方在下一次!");}}}}}}}//主程序变量值public bool startgame { get; set; }//是否开始游戏public bool ones { get; set; }//true为白方,false为黑方string[] steps = new string[100];//棋盘列表private void 开始游戏ToolStripMenuItem_Click(object sender, EventArgs e){ones = true;Pen sc = new Pen(Color.Brown, 2);Graphics g = this.CreateGraphics();g.Clear(Color.IndianRed);//清理棋盘g.DrawRectangle(sc, 40, 40, this.Width - 130, this.Height - 110);int start = ((this.Width - 100) % 11) / 2;int final = ((this.Height - 100) % 11) / 2;for (int i = 0; i < 10; i++)//竖着的线{g.DrawLine(sc, 60 + start + 40 * i, 40, 60 + start + 40 * i, this.Height - 70);//绘制棋盘,每条线之间格40个像素Thread.Sleep(10);}for (int i = 0; i < 10; i++)//横着的线{g.DrawLine(sc, 40, 60 + final + 40 * i, 438, 60 + final + 40 * i);Thread.Sleep(10);}//string[] steps = new string[100];for (int i = 0; i < 10; i++)//行{for (int j = 0; j < 10; j++)//列{steps[i * 10 + j] = "0";}}ones = true;startgame = true;}public bool white_judge_vertical(int i, int j)//白方竖着的判断{int num = 1;if (j != 0){for (int k = 1; k < 5; k++){if (j - k >= 0){string c = steps[(j - k) * 10 + i];if (c != "1"){break;}else{num += 1;}}else{break;}}}if (j != 9){for (int k = 1; k < 5; k++){if (j + k <= 9){string c = steps[(j + k) * 10 + i];if (c != "1"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{return false;}}public bool black_judge_vertical(int i, int j)//黑方竖着的判断{int num = 1;if (j != 0){for (int k = 1; k < 5; k++){if (j - k >= 0){string c = steps[(j - k) * 10 + i];if (c != "2"){break;}else{num += 1;}}else{break;}}}if (j != 9){for (int k = 1; k < 5; k++){if (j + k <= 9){string c = steps[(j + k) * 10 + i];if (c != "2"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{return false;}}public bool white_judge_transverse(int i, int j)//白方横着的判断{int num = 1;if (i != 0){for (int k = 1; k < 5; k++){if (i - k >= 0){string c = steps[j * 10 + i - k];//原来的行数保持不变,列数每个-1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (i != 9){for (int k = 1; k < 5; k++){if (j + k <= 9){string c = steps[j * 10 + i + k];//原来的行数保持不变,列数每个+1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{return false;}}public bool black_judge_transverse(int i, int j)//黑方横着的判断{int num = 1;if (i != 0){for (int k = 1; k < 5; k++){if (j - k >= 0){string c = steps[j * 10 + i - k];if (c != "2"){break;}else{num += 1;}}else{break;}}}if (i != 9){for (int k = 1; k < 5; k++){if (j + k <= 9){string c = steps[j * 10 + i + k];if (c != "2"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{return false;}}public bool white_judge_oblique(int i, int j)//白方斜着的判断{int num = 1;//同加同减if (i != 0 && j != 0){for (int k = 1; k < 5; k++){if (i - k >= 0 && j - k >= 0){string c = steps[(j - k) * 10 + i - k];//行数-1,省下来的列数每个-1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (i != 9 && j != 9){for (int k = 1; k < 5; k++){if (j + k <= 9 && i+k<=9){string c = steps[(j + k) * 10 + i + k];//行数+1,省下来的列数每个+1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{num = 1;}//不同加不同减if (i != 0 && j != 9){for (int k = 1; k < 5; k++){if (i + k <= 9 && j - k >= 0){string c = steps[(j + k) * 10 + i - k];//行数+1,列数-1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (i != 9 || j != 0){for (int k = 1; k < 5; k++){if (j - k >= 0 && i+k<=9){string c = steps[(j - k) * 10 + i + k];//行数-1,列数+1if (c != "1"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{num = 1;return false;}}public bool black_judge_oblique(int i,int j)//黑方斜着的判断{{int num = 1;//同加同减if (i != 0 && j != 0){for (int k = 1; k < 5; k++){if (i - k >= 0 && j - k >= 0){string c = steps[(j - k) * 10 + i - k];//行数-1,省下来的列数每个-1if (c != "2"){break;}else{num += 1;}}else{break;}}}if (i != 9 && j != 9){for (int k = 1; k < 5; k++){if (j + k <= 9 && i + k <= 9){string c = steps[(j + k) * 10 + i + k];//行数+1,省下来的列数每个+1if (c != "2"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{num = 1;}//不同加不同减if (i != 0 && j != 9){for (int k = 1; k < 5; k++){if (i + k <= 9 && j - k >= 0){string c = steps[(j + k) * 10 + i - k];//行数+1,列数-1if (c != "2"){break;}else{num += 1;}}else{break;}}}if (i != 9 || j != 0){for (int k = 1; k < 5; k++){if (j - k >= 0 && i + k <= 9){string c = steps[(j - k) * 10 + i + k];//行数-1,列数+1if (c != "2"){break;}else{num += 1;}}else{break;}}}if (num >= 5){startgame = false;return true;}else{num = 1;return false;}}}
这便是基础版所有过程!
若有什么建议或者问题欢迎在下方评论区留言
谢谢