Visual Studio五子棋开发案例(二)

上一节我们实现了基本的棋局,这一节我们来实现在棋局里面画棋子。

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;
        }

再来一局功能已实现,下一节来实现如何判定棋子输赢。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值