c#-中國象棋:畫棋盤
先畫出了棋盤,效果類似QQ遊戲裡面的,程式如下:
namespace ChineseChess
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//棋盤引數
private const int _outterStartLeft = 25;//棋盤的外框距離panel的左邊距
private const int _outterStartTop = 25;//棋盤的外框距離panel的上邊距
private const int _distance = 6;//棋盤的內框與外框的距離
private const int _riverFontFromBorder = 40;//“楚河”或“漢界”距離邊框的長度
private const int _locationLength=10;//標示“炮”“卒”位置的線長度
private const int _locationFromBorder = 2;//標示“炮”“卒”位置的線
//畫筆
Pen drawOutterRecPen = new Pen(Color.Black, 4);//棋盤外邊框用到的畫筆黑色4pt
Pen drawInnerRecPen = new Pen(Color.Black, 2);//棋盤內邊框用黑色2pt畫筆
Pen drawBasicLine = new Pen(Color.Black, 1);//棋盤基線用黑色1pt畫筆
//字型
Font drawRiverFont = new Font("幼圓", 25);
private void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics gh = e.Graphics;//獲取繪製圖形物件
//畫棋盤邊框
int _chessBoardWidth = panel1.Width - 2 * _outterStartLeft - 2 * _distance;//棋盤的寬度
int _chessBoardHeight = panel1.Height - 2 * _outterStartTop - 2 * _distance;//棋盤的高度
//畫棋盤外邊框
gh.DrawRectangle(drawOutterRecPen, new Rectangle(new Point(_outterStartLeft, _outterStartTop),new Size(_chessBoardWidth+2*_distance,_chessBoardHeight+2*_distance)));
//畫棋盤內邊框
gh.DrawRectangle(drawInnerRecPen, new Rectangle(new Point(_outterStartLeft + _distance, _outterStartTop + _distance), new Size(_chessBoardWidth,_chessBoardHeight)));
//畫棋盤
//畫棋盤線
int _xStart = _outterStartLeft + _distance;//線的起始x座標
int _yStart = _outterStartTop + _distance;//線的起始x座標
int gridWidth=(panel1.Width-2*_outterStartLeft-2*_distance)/8;
int gridHeight=(panel1.Height-2*_outterStartTop-2*_distance)/9;
//畫豎線(8列7條線)
for (int i = 1; i <= 7; i++)
{
//分開畫,避開“楚河漢界”一行的豎線
gh.DrawLine(drawBasicLine, new Point(_xStart + i * gridWidth, _yStart), new Point(_xStart + i * gridWidth, _yStart + 4*gridHeight));
gh.DrawLine(drawBasicLine,new Point(_xStart + i * gridWidth,_yStart + 5*gridHeight),new Point(_xStart + i * gridWidth,_yStart+_chessBoardHeight));
}
//畫橫線(9行8條線)
for (int i = 1; i <= 8; i++)
{
gh.DrawLine(drawBasicLine, new Point(_xStart, _yStart + i * gridHeight), new Point(_xStart + _chessBoardWidth, _yStart + i * gridHeight));
}
//畫“楚河漢界”
SizeF fRiver = gh.MeasureString("楚 河", drawRiverFont);
SizeF fBound = gh.MeasureString("漢 界", drawRiverFont);
gh.DrawString("楚 河", drawRiverFont, Brushes.Black, new PointF(_xStart + _chessBoardWidth - _riverFontFromBorder - fRiver.Width, _yStart + 4 * gridHeight + (float)(gridHeight - fRiver.Height) / 2));
gh.DrawString("漢 界", drawRiverFont, Brushes.Black, new PointF(_xStart + _riverFontFromBorder, _yStart + 4 * gridHeight + (float)(gridHeight - fBound.Height) / 2));
//畫將/帥的皇宮
gh.DrawLine(drawBasicLine, new Point(_xStart + 3 * gridWidth, _yStart), new Point(_xStart + 5 * gridWidth, _yStart + 2 * gridHeight));
gh.DrawLine(drawBasicLine, new Point(_xStart + 3 * gridWidth, _yStart + 2 * gridHeight), new Point(_xStart + 5 * gridWidth, _yStart));
gh.DrawLine(drawBasicLine, new Point(_xStart + 3 * gridWidth, _yStart+7*gridHeight), new Point(_xStart + 5 * gridWidth, _yStart + _chessBoardHeight));
gh.DrawLine(drawBasicLine, new Point(_xStart + 3 * gridWidth, _yStart + _chessBoardHeight), new Point(_xStart + 5 * gridWidth, _yStart + 7 * gridHeight));
//畫“炮”的位置
for (int i = 0; i <= 1; i++)
{
for (int j = 0; j <= 1; j++)
{
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + gridWidth - _locationLength - _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight - _locationFromBorder+i*5*gridHeight),
new Point(_xStart + gridWidth - _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight - _locationFromBorder+i*5*gridHeight),
new Point(_xStart + gridWidth - _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight - _locationLength - _locationFromBorder+i*5*gridHeight) });
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + gridWidth - _locationLength - _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight + 2 * _locationFromBorder+i*5*gridHeight),
new Point(_xStart + gridWidth - _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight + 2 * _locationFromBorder+i*5*gridHeight),
new Point(_xStart + gridWidth - _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight + _locationLength + 2 * _locationFromBorder+i*5*gridHeight) });
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + gridWidth + 2 * _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight + _locationLength + 2 * _locationFromBorder+i*5*gridHeight),
new Point(_xStart + gridWidth + 2 * _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight + 2 * _locationFromBorder+i*5*gridHeight),
new Point(_xStart + gridWidth + _locationLength + 2 * _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight + 2 * _locationFromBorder+i*5*gridHeight) });
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + gridWidth + 2 * _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight - _locationLength - _locationFromBorder+i*5*gridHeight),
new Point(_xStart + gridWidth + 2 * _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight - _locationFromBorder+i*5*gridHeight),
new Point(_xStart + gridWidth + _locationLength + 2 * _locationFromBorder + j * 6 * gridWidth, _yStart + 2 * gridHeight - _locationFromBorder+i*5*gridHeight) });
}
}
//畫“卒”的位置
for (int i = 0; i <= 1; i++)
{
for (int j = 0; j <= 2; j++)
{
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + 2*gridWidth - _locationLength - _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight - _locationFromBorder+i*3*gridHeight),
new Point(_xStart + 2*gridWidth - _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight - _locationFromBorder+i*3*gridHeight),
new Point(_xStart + 2*gridWidth - _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight - _locationLength - _locationFromBorder+i*3*gridHeight) });
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + 2*gridWidth - _locationLength - _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight + 2 * _locationFromBorder+i*3*gridHeight),
new Point(_xStart + 2*gridWidth - _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight + 2 * _locationFromBorder+i*3*gridHeight),
new Point(_xStart + 2*gridWidth - _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight + _locationLength + 2 * _locationFromBorder+i*3*gridHeight) });
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + 2*gridWidth + 2 * _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight + _locationLength + 2 * _locationFromBorder+i*3*gridHeight),
new Point(_xStart + 2*gridWidth + 2 * _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight + 2 * _locationFromBorder+i*3*gridHeight),
new Point(_xStart + 2*gridWidth + _locationLength + 2 * _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight + 2 * _locationFromBorder+i*3*gridHeight) });
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + 2*gridWidth + 2 * _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight - _locationLength - _locationFromBorder+i*3*gridHeight),
new Point(_xStart + 2*gridWidth + 2 * _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight - _locationFromBorder+i*3*gridHeight),
new Point(_xStart + 2*gridWidth + _locationLength + 2 * _locationFromBorder + j *2 * gridWidth, _yStart + 3 * gridHeight - _locationFromBorder+i*3*gridHeight) });
}
}
for (int i = 0; i <= 1; i++)
{
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + 2 * _locationFromBorder, _yStart + 3 * gridHeight + _locationLength + 2 * _locationFromBorder+i*3*gridHeight),
new Point(_xStart + 2 * _locationFromBorder, _yStart + 3 * gridHeight + 2 * _locationFromBorder+i*3*gridHeight),
new Point(_xStart + _locationLength + 2 * _locationFromBorder, _yStart + 3 * gridHeight + 2 * _locationFromBorder+i*3*gridHeight) });
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + 2 * _locationFromBorder, _yStart + 3 * gridHeight - _locationLength - _locationFromBorder+i*3*gridHeight),
new Point(_xStart + 2 * _locationFromBorder, _yStart + 3 * gridHeight - _locationFromBorder+i*3*gridHeight),
new Point(_xStart + _locationLength + 2 * _locationFromBorder, _yStart + 3 * gridHeight - _locationFromBorder+i*3*gridHeight) });
}
for (int j = 0; j <= 1; j++)
{
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + _chessBoardWidth - _locationLength - 2*_locationFromBorder, _yStart + 3 * gridHeight - _locationFromBorder+j*3*gridHeight),
new Point(_xStart + _chessBoardWidth - 2*_locationFromBorder , _yStart + 3 * gridHeight - _locationFromBorder+j*3*gridHeight),
new Point(_xStart + _chessBoardWidth - 2*_locationFromBorder, _yStart + 3 * gridHeight - _locationLength - _locationFromBorder+j*3*gridHeight) });
gh.DrawLines(drawInnerRecPen, new Point[] {
new Point(_xStart + _chessBoardWidth - _locationLength - 2*_locationFromBorder , _yStart + 3 * gridHeight + 2 * _locationFromBorder+j*3*gridHeight),
new Point(_xStart + _chessBoardWidth - 2*_locationFromBorder, _yStart + 3 * gridHeight + 2 * _locationFromBorder+j*3*gridHeight),
new Point(_xStart + _chessBoardWidth - 2*_locationFromBorder, _yStart + 3 * gridHeight + _locationLength + 2 * _locationFromBorder+j*3*gridHeight) });
}
gh.Flush();
}
private void Form1_Load(object sender, EventArgs e)
{
panel1.Size = new System.Drawing.Size(462, 512);
panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(205)))), ((int)(((byte)(170)))));
}
}
}