100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > c#winform——Gobang五子棋简易版双人对战制作(基本结构+代码)

c#winform——Gobang五子棋简易版双人对战制作(基本结构+代码)

时间:2021-10-06 21:55:52

相关推荐

c#winform——Gobang五子棋简易版双人对战制作(基本结构+代码)

每日励志

现在我们回归正题,这次我们要做的是五子棋,所谓五子棋,也就是在一个棋盘内,分为白子和黑子,若有一方(且没有阻挡下)上下左右斜着歪着能凑到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;}}}

这便是基础版所有过程!

若有什么建议或者问题欢迎在下方评论区留言

谢谢

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。