1.首先拖拽组件完成窗口界面
简单的7个组件组成界面
2.代码编写
代码整体结构如下
(1)变量声明
PS:因为棋盘采用矩形进行绘制,所以说这里的size指棋盘行列的方格数,那么能够供棋子落子的棋盘大小则要加上1,即棋盘有14行,14列。
(2)初始化对局方法
此方法 初始化棋盘二维数组并绘制棋盘
棋盘二维数组分为三个值,0代表此格未落子,1代表此格为红子,-1代表黑子。
private void initializeGame()//初始化对局
{
start = false;//对局未开始
for (int i = 0; i <= size; i++)//初始化棋盘数组
{
for (int j=0;j<=size;j++)
{
CheckBoard[i, j] = 0;//把代表落子的二维数组全置为0
}
}
Point pt0 = new Point(0, 0);//棋盘绘制初始点位,即从pictureBox左上角开始
int width = 30;//方格的宽,即棋盘两点间的距离()
var g = pictureBox1.CreateGraphics();//用pictureBox创建画布
g.Clear(Color.White);//背景颜色设置
var pen = new Pen(Color.Black);//黑色笔刷
for (int line = 0; line < size; line++)
{
for (int i = 0; i < size; i++)
{
if (line % 2 == 0 && i % 2 == 0)//绘制偶数列和偶数行的方格
{
g.DrawRectangle(pen, i * 1 * width + pt0.X, 1 * line * width + pt0.Y, width, width);//绘制一格
}
else//绘制奇数列和奇数行的方格
{
g.DrawRectangle(pen, i * 1 * width + pt0.X, 1 * line * width + pt0.Y, width, width);
}
}
}
g.Dispose();
}
效果如下图
(3)按钮点击事件
“开始”按钮
点击后,游戏开始
private void button1_Click(object sender, EventArgs e)
{
initializeGame();//调用棋盘初始化方法
start = true;//游戏置为开始状态
button1.Text = "重新开始";//改变此按钮文本为“重新开始”
label2.Text = "等待红子落子";//首回合红子先落子
round = 1;//回合置1
label5.Text = round + "";//用label5显示回合数
}
“结束”按钮
点击后,直接退出程序
private void button2_Click(object sender, EventArgs e)
{
this.Dispose();
}
(4)棋盘点击事件
1.点击棋盘,可在棋盘上该位置绘制棋子。
2.用鼠标在棋盘上的坐标,运算得到棋子在二维数组上的坐标。
3.以棋盘该点位为中心绘制棋子,
因为鼠标点击后,绘制方法会以鼠标点击位置为原点向右下角方向绘制,
则我们需要更改绘制坐标,使得其从鼠标点击位置为中心点绘制棋子。
更改的话,只需要在调用绘制方法时,x,y轴的坐标都减去一个棋子的半径即可。
private void pictureBox1_Click(object sender, EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();//再次创建画布
if (start)//游戏开始,才可以点击
{
Point box1Ponit = pictureBox1.PointToClient(Control.MousePosition);//设置鼠标点击后在pictureBox(即棋盘)上的坐标
int x = box1Ponit.X % 30 > 15 ? box1Ponit.X / 30 + 1 : box1Ponit.X / 30;//将横坐标对30取余,判断鼠标点击的点靠进左边的落点,还是靠进右边的落点,从而得出棋子在二维数组里的坐标即小x
int y = box1Ponit.Y % 30 > 15 ? box1Ponit.Y / 30 + 1 : box1Ponit.Y / 30;//小y同小x
if (CheckBoard[x, y]!=0)//如果该点位有棋子
{
MessageBox.Show("请勿重复落子");
}
else
{
if (ChessCheck)//判断是哪方的回合
{
g.FillEllipse(Brushes.Red, x * 30 - 13, y * 30 - 13, 26, 22);//小x*30得到位于棋盘交叉点的位置,绘制时减13则可以交叉点为中心绘制棋子
CheckBoard[x, y] = 1;//二维数组置1,表示以落红子
ChessCheck = !ChessCheck;//红子先手回合结束
label2.Text = "等待黑子落子";
}
else
{
g.FillEllipse(Brushes.Black, x * 30 - 13, y * 30 - 13, 26, 22);//同上
CheckBoard[x, y] = -1;
ChessCheck = !ChessCheck;
label2.Text = "等待红子落子";
round++;//黑子回合后手结束后,回合数加一
label5.Text = round + "";
}
g.Dispose();
SuccessCheck(x,y);//每下一个棋子,调用方法判断是否连成5个
}
}
}
(5)输赢判断
以当前落点棋子为中心,分别判断其8个方向的棋子是否能连成五个
以左边为例,判断时分为三个步骤
1.该落点左边是否够四个点位 2.判断第四个点位上是否是己方棋子
3.前两项都满足后,再逐一判断左边连续的三个点位是否为己方棋子
4.如果第三项判断成功则满足五子连线,赢得比赛
private void SuccessCheck(int x,int y)//传入当前落子的坐标(棋盘点击事件方法中获取到的二维数组中的坐标)
{
int color=CheckBoard[x, y];//当前落子颜色
int success = 0;//连续的棋子数
int width = 30;
if (x - 4 >= 0 && CheckBoard[x-4,y]==color)//判断棋子左边四个点位,如果左边有四个点位,且该尽头点位有同色棋子的话
{
for (int i = 1; i <= 3; i++)//判断中间3个棋子是否同色
{
if (CheckBoard[x - i, y] == color) { success++;}//有同色棋子则success加一
}
if (success == 3) { //success为3时,加上本身与尽头则有5个棋子,获胜
Graphics g = pictureBox1.CreateGraphics();
g.DrawLine(new Pen(Color.Red, 2), new Point(x* width+ width, y* width), new Point((x - 4)* width- width, y* width));//将五个连续的棋子用红线画出
MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
g.Dispose();
}
success = 0;
}
else if (x + 4 <= 13 && CheckBoard[x + 4, y] == color)//右边判断
{
for (int i = 1; i < 4; i++)
{
if (CheckBoard[x + i, y] == color) { success++;}
}
if (success == 3)
{
Graphics g = pictureBox1.CreateGraphics();
g.DrawLine(new Pen(Color.Red, 2), new Point(x * width- width, y * width), new Point((x + 4) * width+ width, y * width));
MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
g.Dispose();
}
success = 0;
}
else if (y - 4 >= 0 && CheckBoard[x, y-4] == color)//上边判断
{
for (int i = 1; i < 4; i++)
{
if (CheckBoard[x, y - i] == color) { success++;}
}
if (success == 3)
{
Graphics g = pictureBox1.CreateGraphics();
g.DrawLine(new Pen(Color.Red, 2), new Point(x * width, y * width+ width), new Point(x * width, (y-4) * width- width));
MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
g.Dispose();
}
success = 0;
}
else if (y + 4 <= 13 && CheckBoard[x, y+4] == color)//下边判断
{
for (int i = 1; i < 4; i++)
{
if (CheckBoard[x, y + i] == color) { success++;}
}
if (success == 3)
{
Graphics g = pictureBox1.CreateGraphics();
g.DrawLine(new Pen(Color.Red, 2), new Point(x * width, y * width- width), new Point(x * width,(y+4) * width+ width));
MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
g.Dispose();
}
success = 0;
}
else if (x - 4 >= 0 && y - 4 >= 0&& CheckBoard[x -4, y-4] == color)//左上判断
{
for (int i = 1; i < 4; i++)
{
if (CheckBoard[x-i, y - i] == color) { success++;}
}
if (success == 3)
{
Graphics g = pictureBox1.CreateGraphics();
g.DrawLine(new Pen(Color.Red, 2), new Point(x * width+ width, y * width+ width), new Point((x-4) * width- width, (y - 4) * width- width));
MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
g.Dispose();
}
success = 0;
}
else if (x + 4 <= 13 && y - 4 >= 0 && CheckBoard[x + 4, y - 4] == color)//右上判断
{
for (int i = 1; i < 4; i++)
{
if (CheckBoard[x + i, y - i] == color) { success++;}
}
if (success == 3)
{
Graphics g = pictureBox1.CreateGraphics();
g.DrawLine(new Pen(Color.Red, 2), new Point(x * width- width, y * width+ width), new Point((x+4) * width+ width, (y - 4) * width- width));
MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
g.Dispose();
}
success = 0;
}
else if (x - 4 >= 0 && y + 4 <= 13 && CheckBoard[x - 4, y + 4] == color)//左下判断
{
for (int i = 1; i < 4; i++)
{
if (CheckBoard[x - i, y + i] == color) { success++;}
}
if (success == 3)
{
Graphics g = pictureBox1.CreateGraphics();
g.DrawLine(new Pen(Color.Red, 2), new Point(x * width+ width, y * width- width), new Point((x - 4) * width- width, (y + 4) * width+ width));
MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
g.Dispose();
}
success = 0;
}
else if (x + 4 <= 13 && y + 4 <=13 && CheckBoard[x + 4, y + 4] == color)//右下判断
{
for (int i = 1; i < 4; i++)
{
if (CheckBoard[x + i, y + i] == color) { success++;}
}
if (success == 3)
{
Graphics g = pictureBox1.CreateGraphics();
g.DrawLine(new Pen(Color.Red,2), new Point(x * width- width, y * width- width), new Point((x + 4) * width+ width, (y + 4) * width+ width));
MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
g.Dispose();
}
success = 0;
}
3.最终效果
第一次写c#,记录下,希望加深记忆的同时为有缘人提供帮助,参考了站内许多大佬的思路,感谢大佬。