使用C#实现一个五子棋游戏
创始人
2024-12-28 08:42:28
0次
private Image myImage;
 
/// 
/// 初始化背景数组
/// int[x,y] x为行 y为列
/// 
  private int[,] bgGround = new int[11, 11]; /*{
          {0,0,0,0,0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0,0,0,0,0},
          {0,0,0,0,0,0,0,0,0,0,0}
         };*/
  private int CurrentX;//当前bgGround的x行
 
  private int CurrentY;//当前bgGround的y列
 
  private bool IsWhite = false;//判断白棋还是黑棋先
 
  private bool IsOver = false;//记录游戏是否结束
 
  private void Form1_Load(object sender, EventArgs e)
  {
   myImage = new Bitmap(panel1.Width, panel1.Height);
  }
 
  protected override void OnPaint(PaintEventArgs e)
  {
   Draw();
   base.OnPaint(e);
  }
 
  /// 
  /// 画棋盘
  /// 
  private void Draw()
  {
   Graphics g = Graphics.FromImage(myImage);
   g.Clear(this.BackColor);
   g.FillRectangle(Brushes.White,new Rectangle(new Point(10,10),new Size(400,400)));
   //循环次数应比背景bgGround行、列少1
   for (int i = 0; i < 10; i++)
   {
    for (int j = 0; j < 10; j++)
    {
     g.DrawRectangle(new Pen(Brushes.Black), i * 40 + 10, j * 40 + 10, 40, 40);
    }
   }
   
   Graphics gg = panel1.CreateGraphics();
   gg.DrawImage(myImage, 0, 0);
  }
 
  
 
  private void panel1_MouseClick(object sender, MouseEventArgs e)
  {
   if (IsOver)
   {
    return;
   }
   Graphics g = panel1.CreateGraphics();
   //设置当鼠标点击坐标在某一落棋点坐标想x,y的+-10的范围内即可落子
   int x = (e.X - 10) % 40;
   int y = (e.Y - 10) % 40;
   if (x > 30)
   {
    x = (e.X - 10) / 40 + 1;
   }
   else
   {
    x = (e.X - 10) / 40;
   }
   if (y > 30)
   {
    y = (e.Y - 10) / 40 + 1;
   }
   else
   {
    y = (e.Y - 10) / 40;
   }
   if (bgGround[x, y] == 0)
   {
    if (IsWhite)
    {
     DrawChess(g, x, y, new Pen(Brushes.White), Brushes.White, 1);
     IsWhite = false;
     JudgeResult(1);
    }
    else
    {
     DrawChess(g, x, y, new Pen(Brushes.Black), Brushes.Black, 2);
     IsWhite = true;
     JudgeResult(2);
    }
   }
  }
 
  /// 
  /// 判断输赢
  /// 
  /// 1为白棋 2为黑棋
  private void JudgeResult(int flag)
  {
   int x = CurrentX;
   int y = CurrentY;
   int MinXNum = 0;
   int MaxXNum = 0;
   int count = 0;
   if (x > 4)
   {
    MinXNum = x - 4;
    if (x + 4 > 10)
    {
     MaxXNum = 10;
    }
    else
    {
     MaxXNum = x + 4;
    }
   }
   else
   {
    MaxXNum = x + 4;
   }
   int MinYNum = 0;
   int MaxYNum = 0;
   if (y > 4)
   {
    MinYNum = y - 4;
    if (y + 4 > 10)
    {
     MaxYNum = 10;
    }
    else
    {
     MaxYNum = y + 4;
    }
   }
   else
   {
    MaxYNum = y + 4;
   }
   #region //横向
   for (int i = MinXNum; i < MaxXNum+1; i++)
   {
    if (bgGround[i, y] == flag)
    {
     count++;
     if (count > 4)
      goto Label;
    }
    else
    {
     count = 0;
     if (i > MaxXNum - 4)
      break;
    }
   }
   #endregion
   #region //竖向
   for (int i = MinYNum; i < MaxYNum+1; i++)
   {
    if (bgGround[x, i] == flag)
     count++;
    else
    {
     count = 0;
     if (i > MaxYNum - 4)
      break;
    }
    if (count > 4)
     goto Label;
   }
   #endregion
   //左斜
   for (int i = MinXNum; i < MaxXNum+1; i++)
   {
    if (CurrentX + CurrentY - i < 0)
     break;
    if (CurrentX + CurrentY - i <= 10)
    {
     if (bgGround[i, CurrentX + CurrentY - i] == flag)
     {
      count++;
     }
     else
     {
      count = 0;
      if (i > MaxYNum - 4)
       break;
     }
    }
    if (count > 4)
     goto Label;
   }
   //右斜
   for (int i = MinXNum; i < MaxXNum+1; i++)
   {
    if (i < CurrentX - CurrentY)
     break;
    if (i + CurrentY - CurrentX > 10)
     break;
    if (bgGround[i, i + CurrentY - CurrentX] == flag)
    {
     count++;
    }
    else
    {
     count = 0;
     if (i > MaxYNum - 4)
      break;
    }
    if (count > 4)
     goto Label;
   }
 
 
  Label:
   if (flag == 1 && count > 4)
   {
    IsOver = true;
    MessageBox.Show("白棋赢,游戏结束");
    return;
   }
   else if (flag == 2 && count > 4)
   {
    IsOver = true;
    MessageBox.Show("黑棋赢,游戏结束");
    return;
   }
   else
   {
    IsOver = false;
   }
  }
 
  /// 
  /// 画棋子
  /// 
  /// 
  /// bgGround中x位置
  /// bgGround中y位置
  /// 画笔
  /// 棋子颜色
  /// 1为白棋 2为黑棋
  private void DrawChess(Graphics g, int x, int y, Pen p, Brush brush, int flag)
  {
   CurrentX = x; CurrentY = y;
   bgGround[x, y] = flag;
   g.DrawEllipse(p, x * 40, y * 40, 20, 20);
   g.FillEllipse(brush, x * 40, y * 40, 20, 20);
 
  }
  ///btn_Chess_Click是黑棋先和白棋先按钮的共同事件,设置白棋先button的tag值为1,黑棋先button的tag值为2
  /// 
  /// 判断哪个先下 设置button控件的tag值 
  /// 
  /// 
  /// 
  private void btn_Chess_Click(object sender, EventArgs e)
  {
   Button btn = sender as Button;
   string tag = btn.Tag.ToString();
   if (tag.Equals("1"))//白棋先
   {
    IsWhite = true;
   }
   else//黑棋先 tag=2
   {
    IsWhite = false;
   }
  }
 
  /// 
  /// 重置
  /// 
  /// 
  /// 
  private void btn_reset_Click(object sender, EventArgs e)
  {
   IsOver = false;
   Draw();
   bgGround = new int[11, 11];
}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...