每日励志
现在我们回归正题,这次我们要做的是五子棋,所谓五子棋,也就是在一个棋盘内,分为白子和黑子,若有一方(且没有阻挡下)上下左右斜着歪着能凑到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];//原来的行数保持不变,列数每个-1
if (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];//原来的行数保持不变,列数每个+1
if (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,省下来的列数每个-1
if (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,省下来的列数每个+1
if (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,列数-1
if (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,列数+1
if (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,省下来的列数每个-1
if (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,省下来的列数每个+1
if (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,列数-1
if (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,列数+1
if (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];//原来的行数保持不变,列数每个-1
if (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];//原来的行数保持不变,列数每个+1
if (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,省下来的列数每个-1
if (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,省下来的列数每个+1
if (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,列数-1
if (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,列数+1
if (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,省下来的列数每个-1
if (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,省下来的列数每个+1
if (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,列数-1
if (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,列数+1
if (c != "2")
{
break;
}
else
{
num += 1;
}
}
else
{
break;
}
}
}
if (num >= 5)
{
startgame = false;
return true;
}
else
{
num = 1;
return false;
}
}
}
这便是基础版所有过程!
若有什么建议或者问题欢迎在下方评论区留言
谢谢