label(1)--------------------panel(2)------------------button(3)
左边为panel2
右边为panel1
button1开始游戏
button2重新游戏
button3退出
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace fc
{
//主程序
public partial class Form1 : Form
{
private bool start; // 游戏是否开始
private bool ChessCheck = true; // 白子黑子回合
private const int size = 15; // 棋盘大小
private int[,] CheckBoard = new int[size, size]; // 棋盘点位数组
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
initializeGame(); //初始化游戏
this.Width = MainSize.FormWidth; // 设置窗口宽度
this.Height = MainSize.FormHeight; // 设置窗口高度
this.Location = new Point(400, 75); // 设置窗口位置
}
//初始化游戏
private void initializeGame()
{
//棋盘点位,恢复默认,也就是0
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
CheckBoard[i, j] = 0;
start = false;
label1.Text = "游戏未开始";
//开始游戏显示
button1.Visible = true;
//重新游戏隐藏
button2.Visible = false;
}
private void panel2_Paint(object sender, PaintEventArgs e)
{
Graphics g = panel2.CreateGraphics(); // 创建面板画布
ChessBoard.DrawCB(g); // 调用画棋盘方法
Chess.ReDrawC(panel2, CheckBoard); // 调用重新加载棋子方法
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
// 设置控制界面的大小
//(宽度,高度)
panel1.Size = new Size(MainSize.FormWidth - MainSize.CBoardWidth - 20, MainSize.FormHeight);
}
private void button1_Click(object sender, EventArgs e)
{
start = true; // 开始
ChessCheck = true; // 黑子回合
label1.Text = "黑子回合"; // 提示文本改为"黑子回合"
button1.Visible = true ; // 隐藏'开始游戏'按钮
button2.Visible = true; // 显示'重新开始'按钮
// panel2.Invalidate(); // 重绘面板"棋盘"
}
private void button2_Click(object sender, EventArgs e)
{
// 确认是否重新开始
if (MessageBox.Show("确认要重新开始?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
{
initializeGame(); // 调用初始化游戏方法
button1_Click(sender, e); // 调用按钮"开始游戏"Click事件
}
}
private void button3_Click(object sender, EventArgs e)
{
this.Dispose();
}
private void panel2_MouseDown(object sender, MouseEventArgs e)
{
// 判断游戏是否开始
if (start)
{
int Judgment = 0; // 判断数组当前行列,白子还是黑子回合,0表示没有,1表示黑子,2表示白子、用来判断胜利
int PlacementX = e.X / MainSize.CBoardGap; // 求鼠标点击的X方向的第几个点位
int PlacementY = e.Y / MainSize.CBoardGap; // 求鼠标点击的Y方向的第几个点位
try
{
// 判断此位置是否为空
if (CheckBoard[PlacementX, PlacementY] != 0)
{
return; // 此位置有棋子
}
// 黑子回合还是白子回合
if (ChessCheck)
{
CheckBoard[PlacementX, PlacementY] = 1; // 黑子回合
Judgment = 1; // 切换为判断黑子
label1.Text = "白子回合"; // 提示文本改为"白子回合"
}
else
{
CheckBoard[PlacementX, PlacementY] = 2; // 白子回合
Judgment = 2; // 切换为判断白子
label1.Text = "黑子回合"; // 提示文本改为"黑子回合"
}
Chess.DrawC(panel2, ChessCheck, PlacementX, PlacementY); // 画棋子
// 胜利判断
if (WinJudgment.ChessJudgment(CheckBoard, Judgment))
{
// 判断黑子还是白子胜利
if (Judgment == 1)
{
MessageBox.Show("五连珠,黑胜!", "胜利提示"); // 提示黑胜
}
else
{
MessageBox.Show("五连珠,白胜!", "胜利提示"); // 提示白胜
}
initializeGame(); // 调用初始化游戏
}
ChessCheck = !ChessCheck; // 换棋子
}
catch (Exception) { } // 防止鼠标点击边界,导致数组越界
}
else
{
MessageBox.Show("请先开始游戏!", "提示"); // 提示开始游戏
}
}
}
class MainSize
{
// 窗口大小
public static int FormWidth { get { return 800; } }
public static int FormHeight { get { return 640; } }
// 棋盘大小
public static int CBoardWidth { get { return 600; } }
public static int CBoardHeight { get { return 600; } }
// 棋格宽度
public static int CBoardGap { get { return 40; } }
// 棋子直径
public static int ChessDiameter { get { return 37; } }
}
//using System.Drawing;
//using System.Windows.Forms;
// 棋盘类
class ChessBoard
{
// 画棋盘方法
public static void DrawCB(Graphics g) //这里的形参,是画布对象
{
int GapWidth = MainSize.CBoardGap; // 棋格宽度
int GapNum = MainSize.CBoardWidth / MainSize.CBoardGap - 1; // 棋格数量 15棋子-1=格数
//这个是 没有用棋盘图片时,用的“画笔”画棋盘方法
g.Clear(Color.White ); // 清除画布、并用Bisque颜色填满画布
Pen pen = new Pen(Color.Black ); // 实例化画笔
// 画棋盘
for (int i = 0; i < GapNum + 1; i++)
{
//画行
//依次连接a1,a2 b1,b2......
//a1(20,20) b1(20,60) (20,100) (20,140) (20,180)
//a2(14*40+20=580,20) b2 (580,60) (580,100) (580,140) (580,200)
g.DrawLine(pen, new Point(20, i * GapWidth + 20), new Point(GapWidth * GapNum + 20, i * GapWidth + 20));
//画列
g.DrawLine(pen, new Point(i * GapWidth + 20, 20), new Point(i * GapWidth + 20, GapWidth * GapNum + 20));
}
}
}
//using System.Drawing.Drawing2D;
// 棋子类
class Chess
{
// 画棋子
public static void DrawC(Panel p, bool ChessCheck, int PlacementX, int PlacementY)
{
Graphics g = p.CreateGraphics(); // 创建面板画布
int AccurateX = PlacementX * MainSize.CBoardGap + 20 - 17; // 精确棋子的X中心位置
int AccurateY = PlacementY * MainSize.CBoardGap + 20 - 17; // 精确棋子的Y中心位置
// 判断谁的回合并画棋子
if (ChessCheck)
{
// 线性渐变会平铺整个面板,根据你的位置填颜色,从上至下渐变,使棋子具有真实感
g.FillEllipse(new LinearGradientBrush(new Point(20, 0), new Point(20, 40), Color/*.Red */.FromArgb(122, 122, 122), Color/*.Blue*/ .FromArgb(0, 0, 0)), /*矩形中心位置=棋子中心*/ new Rectangle(new Point(AccurateX, AccurateY), /*圆的直径*/ new Size(MainSize.ChessDiameter, MainSize.ChessDiameter)));
}
else
{
g.FillEllipse(new LinearGradientBrush(new Point(20, 0), new Point(20, 40), Color.FromArgb(255, 255, 255), Color.FromArgb(204, 204, 204)), new Rectangle(new Point(AccurateX, AccurateY), new Size(MainSize.ChessDiameter, MainSize.ChessDiameter)));
}
}
// 界面重新聚焦时,重新加载棋子
public static void ReDrawC(Panel p, int[,] CheckBoard)
{
Graphics g = p.CreateGraphics(); // 创建面板画布
// 遍历 获取棋盘数组的每行
for (int i = 0; i < CheckBoard.GetLength(1); i++)
{
// 遍历 获取棋盘数组每行的每列
for (int j = 0; j < CheckBoard.GetLength(0); j++)
{
int Judgment = CheckBoard[j, i]; // 判断数组当前行列,白子还是黑子回合,0表示没有,1表示黑子,2表示白子
// 判断是否有棋子
if (Judgment != 0)
{
int AccurateX = j * MainSize.CBoardGap + 20 - 17; // 精确棋子的X中心位置
int AccurateY = i * MainSize.CBoardGap + 20 - 17; // 精确棋子的Y中心位置
// 判断谁的回合并画棋子
if (Judgment == 1)
{
// 线性渐变会平铺整个面板,根据你的位置填颜色,从上至下渐变,使棋子具有真实感
//黑棋
g.FillEllipse(new LinearGradientBrush(new Point(20, 0), new Point(20, 40), Color.FromArgb(122, 122, 122), Color.FromArgb(0, 0, 0)), new Rectangle(new Point(AccurateX, AccurateY), new Size(MainSize.ChessDiameter, MainSize.ChessDiameter)));
}
//白棋
else
{
g.FillEllipse(new LinearGradientBrush(new Point(20, 0), new Point(20, 40), Color.FromArgb(255, 255, 255), Color.FromArgb(204, 204, 204)), new Rectangle(new Point(AccurateX, AccurateY), new Size(MainSize.ChessDiameter, MainSize.ChessDiameter)));
}
}
}
}
}
}
class WinJudgment
{
// 棋子判断
public static bool ChessJudgment(int[,] CheckBoard, int Judgment)
{
bool Win = false; // 胜利判断
// 遍历 获取棋盘数组的每行
for (int i = 0; i < CheckBoard.GetLength(1); i++)
{
// 遍历 获取棋盘数组每行的每列
for (int j = 0; j < CheckBoard.GetLength(0); j++)
{
// 判断是否有棋子
if (CheckBoard[j, i] == Judgment)
{
// 水平判断
if (j < 11)
{
if (CheckBoard[j + 1, i] == Judgment && CheckBoard[j + 2, i] == Judgment && CheckBoard[j + 3, i] == Judgment && CheckBoard[j + 4, i] == Judgment)
{
return Win = true;
}
}
// 垂直判断
if (i < 11)
{
if (CheckBoard[j, i + 1] == Judgment && CheckBoard[j, i + 2] == Judgment && CheckBoard[j, i + 3] == Judgment && CheckBoard[j, i + 4] == Judgment)
{
return Win = true;
}
}
// 右下判断
if (j < 11 && i < 11)
{
if (CheckBoard[j + 1, i + 1] == Judgment && CheckBoard[j + 2, i + 2] == Judgment && CheckBoard[j + 3, i + 3] == Judgment && CheckBoard[j + 4, i + 4] == Judgment)
{
return Win = true;
}
}
// 左下判断
if (j > 3 && i < 11)
{
if (CheckBoard[j - 1, i + 1] == Judgment && CheckBoard[j - 2, i + 2] == Judgment && CheckBoard[j - 3, i + 3] == Judgment && CheckBoard[j - 4, i + 4] == Judgment)
{
return Win = true;
}
}
}`在这里插入代码片`
}
}
return Win;
}
}
}