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;}}}
这便是基础版所有过程!
若有什么建议或者问题欢迎在下方评论区留言
谢谢
c#winform——Gobang五子棋简易版双人对战制作(基本结构+代码)相关推荐
- 缺氧游戏 不给计算机加水,缺氧高压氧简易版 教你最简单的结构
缺氧高压氧可以限定氢气于狭小空间,既可以保证氢气不外出,也可以轻松累计氢气发电,经过多次版本的更新,这种黑科技一直保留至今,可是高压氧毕竟属于黑科技,制作起来难度不低,接下来小编用图文来教会大家简易版 ...
- Java简易版的对战小游戏(主题是三国类游戏对战)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 提示:今天写一个简易版的Java对战小游戏(主题是三国类游戏对战): 需要先写一个Person类(代表人),然后写一个 ...
- matlab小游戏,MATLAB实现五子棋游戏(双人对战、可悔棋)
本文实例为大家分享了MATLAB实现五子棋游戏的具体代码,供大家参考,具体内容如下 程序介绍: 1.此游戏只可用于双人对战. 2.棋盘颜色.棋盘格数.棋子颜色等参数均可自由设置 3.鼠标点击非棋盘区域 ...
- 五子棋双人c语言程序,tc 版双人对战的五子棋
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 map[i][j]=0; cleardevice(); setbkcolor(13); setcolor(1); setfillstyle(1,2); s ...
- c语言五子棋双人对战,tc 版双人对战的五子棋
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 map[i][j]=0; cleardevice(); setbkcolor(13); setcolor(1); setfillstyle(1,2); s ...
- Node.js联机游戏——gobang五子棋(客户端+服务端+websocket的双人游戏)
Node.js联机游戏--gobang五子棋(客户端+服务端+websocket的双人游戏) 五子棋的基本结构 ~·基本画图 ~·判断机制 ~···横向/竖向判断 ~···斜向判断 搭建服务器阶段 ~ ...
- 每个人都能制作的简易版QQ音乐(HTML+CSS+JQuery)
自制系列二它来了. 如果在制作过程中有如何问题你都可以私信我,我会答复你的. 今天中秋节,首先祝大家中秋节快乐! 因为没什么礼物送给大家,所以在这里给大家安利一份简易版QQ音乐的制作,过程很简单,每个 ...
- C# winform 简单五子棋 200行代码实现双人对战
1.需求 基于C# winform用200行代码实现简易五子棋双人对战,支持悔棋,需要的知识有C# winform界面,C#,以及几张素材图片. 2.界面 界面设计如图1所示,背影图是用Graphic ...
- python棋类项目规划一——五子棋游戏简易版——项目一
五子棋游戏简易版 目前只能人人对战 o 代表黑棋 x 代表白棋 . 代表无棋子 以下是代码: def nemBoard():'''初始化棋盘''' board = [[0 for i in range ...
- JAVA单机五子棋小游戏(双人对战版)
此代码为简单双人对战五子棋程序,不涉及算法游戏策略. 具有轮流出手,判断输赢,判断输入是否合法功能. 运行效果如图: import java.io.*; public class Gobang {// ...
最新文章
- linux的三个时间
- SAP PM IW33里查看维护订单相关的维护计划
- poj - 3786 Repeater
- WCF RIA 服务 (三十二)-- 身份验证、角色、个性化 3
- c#foreach循环_C#| 使用foreach循环打印整数数组
- html-css练习题(天天生鲜静态网页制作)文末有完整版代码地址链接
- Django框架——查询集QuerySet
- python虚拟环境可以运行pyspark_pyspark使用自定义的python
- 并发运行linux,linux | 并发编程网 – ifeve.com
- LeaRun.Java表单快速开发工具
- Android wifi信号强度显示流程
- 快速非支配排序算法流程
- 文件对比工具 Beyond Compare 4.2.9中文破解版 附通用注册码
- FileZilla 服务器 报Warning: FTP over TLS is not enabled, users cannot securely log in.
- Mysql查询各科成绩前三名并分别排序
- git-cz git commit 定制提交规范
- Git修改以前某次历史提交注释
- 互联网晚报 | 10月7日 星期四 | 小米中东欧5G手机市占率排名第一;威马汽车将再获5亿美元融资;诺基亚首款平板T20发布...
- 使用A*算法求迷宫最短路径问题
- ERP : 需求管理
热门文章
- mysql 实现over函数_mysql 中如何实现over 方法(开窗函数)
- Internet security
- 部署听云服务器监测探针
- Python:实现pigeon sort鸽巢算法(附完整源码)
- ADB使用及日志分析
- Dashboard Design 4.0(Xcelsius)数据直接绑定功能:瑕瑜互见
- Appdata中local是文件,系统盘下的文件目录
- vm连接服务器桌面,Vmware之使用Windows自带的远程桌面连接
- Win10重复按键盘经常按不出?Win10关闭筛选键步骤
- 一个筛选键引起电脑键盘失灵的命案