上一节我们实现了基本的棋局,这一节我们来实现在棋局里面画棋子。
1. 首先在QZ项目下的QZ类中设置棋子的颜色,半径,位置等。
public void draw(Graphics g,bool displaytime = false)
{
//创建一个圆作为棋子,定义其坐标,宽和高
g.FillEllipse(new SolidBrush(color), x - r, y - r, 2 * r, 2 * r);
}
2. 为了能实现悔棋操作,我们在棋子的属性中添加一个number属性用来计数,以便其能记录上一个棋子的位置。
public int number;
3. 在WZQ中定义一个add方法,来添加棋子;
public void Add(QZ qz)
{
int i = qz.x / this.grid;
int j = qz.y / this.grid;
qz.number = list.Count + 1;
if(list.Count == 0)
{
list.Add(qz);
}
else
{ //如果上一个棋子颜色是黑色,那这一个棋子颜色设置为白色
QZ last = list[list.Count - 1];
if(last.color == Color.Black)
qz.color = Color.White;
else
qz.color = Color.Black;
list.Add(qz);
}
}
4. 双击form1设计中的pictureBox1,生成点击事件并在form1中修改其代码;
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
double i = Convert.ToDouble(e.X) / wzq.grid;
double j = Convert.ToDouble(e.Y) / wzq.grid;
QZ qz = new QZ(Color.Black, (int)(Math.Round(i) * wzq.grid),(int)(Math.Round(j) * wzq.grid), (int)(0.45 * wzq.grid));
wzq.Add(qz);//棋子加入棋局,内部构造
qz.draw(g);
pictureBox1.Image=map;
}
5. 运行代码,如图;
接下来实现不能在同一个位置下棋的逻辑;
6. 在WZQ类中添加exists方法,判断这个位置是否存在棋子;
public bool Exists(QZ qz)
{
QZ newqz = qz;
foreach(QZ qz1 in list)
{
if(qz1.x == newqz.x && qz1.y == newqz.y)
return true;
}
return false;
}
7. 在form1的picturebox点击事件里面添加代码;
if (wzq.Exists(qz))
{
MessageBox.Show("不能重复在同一个位置下棋子");
return;
}
这样就实现了不能在同一个位置下棋的功能,接下来实现悔棋功能;
8. 在WZQ类中添加restart方法,用来实现悔棋;
public void Restart()
{
if (list.Count == 0) return;
list.RemoveAt(list.Count - 1);//链表
}
9. 在form1设计里面双击悔棋按钮,生成点击事件,编写代码;
private void button1_Click(object sender, EventArgs e)
{
wzq.Restart();
wzq.draw(g);
pictureBox1.Image = map;
}
10. 更改WZQ类里面的draw方法;
public void draw(Graphics g) //画棋局
{
g.Clear(Color.LightGray);
for(int i = 0; i < row; i++)
{
for(int j = 0; j < col; j++)
{//绘制格子
g.DrawRectangle(Pens.DarkGreen, i * grid, j * grid, grid, grid);
}
}
foreach(QZ z in list)
{
z.draw(g);
//原来预先定义了a[i,j]没有清掉,会重新画出来
}
}
悔棋功能已经实现,现在实现再来一局的功能;
11. 在form1设计里面双击再来一局按钮,生成点击事件,代码如下;
private void button2_Click(object sender, EventArgs e)
{ //在form1设计里面添加一个按钮为再来一局,自动生成点击事件
wzq.list.Clear();
wzq.draw(g);
pictureBox1.Image = map;
}
再来一局功能已实现,下一节来实现如何判定棋子输赢。