3

我正在尝试使用 C# 绘制一个 8x8 棋盘。这是我第一次尝试绘制它。它不会画板,我还没有找到我缺少的东西。

     public void Form1_Load(object sender, EventArgs e)
     {
         Bitmap bm = new Bitmap(8 * 100, 8 * 100);
         Graphics g = Graphics.FromImage(bm);
         Color color1, color2;
         for (int i = 0; i < 8; i++)
         {
             if (i % 2 == 0)
             {
                 color1 = Color.Black;
                 color2 = Color.White;
             }
             else
             {
                 color1 = Color.White;
                 color2 = Color.Black;
             }
             SolidBrush blackBrush = new SolidBrush(color1);
             SolidBrush whiteBrush = new SolidBrush(color2);

             for (int j = 0; j < 8; j++)
             {
                 if (j % 2 == 0)
                     g.FillRectangle(blackBrush, i * 100, j * 100, 100, 100);
                 else
                     g.FillRectangle(whiteBrush, i * 100, j * 100, 100, 100);
             }
         }

         g.DrawImage(bm, 150, 200);
     }  
4

3 回答 3

5

添加BackgroundImage = bm;到代码的底部。

你画的很好,只是不显示位图......

编辑:我不确定你是否感兴趣,但我重写了这段代码。

Bitmap bm = new Bitmap(800, 800);
using (Graphics g = Graphics.FromImage(bm))
using (SolidBrush blackBrush = new SolidBrush(Color.Black))
using (SolidBrush whiteBrush = new SolidBrush(Color.White))
{
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            if ((j % 2 == 0 && i % 2 == 0) || (j % 2 != 0 && i % 2 != 0))
                g.FillRectangle(blackBrush, i * 100, j * 100, 100, 100);
            else if ((j % 2 == 0 && i % 2 != 0) || (j % 2 != 0 && i % 2 == 0))
                g.FillRectangle(whiteBrush, i * 100, j * 100, 100, 100);
        }
    }
    BackgroundImage = bm;
}

如果您想制作国际象棋游戏,这个项目也可以提供帮助:http: //www.codeproject.com/Articles/20736/CC-CLI-Micro-Chess-Huo-Chess

于 2013-08-13T08:23:02.817 回答
0
        //Variables
        int rowSize = 8;
        int colSize = 8;
        //Calculation
        for (int row = 0; row < rowSize; row++) //Loop throw ROW's
        {
            for (int col = 0; col < colSize; col++) //Loop throw COL's
            {
                if ((row + col) % 2 == 0) //Check if cells is EVEN
                {
                    Console.Write("X"); //White square
                }
                else
                {
                    Console.Write("O"); //Black square
                }
            }
            Console.WriteLine(); //Switch to a new line

考虑一个分解为行和列(水平和垂直)的棋盘。通过 for 循环应用第 0 到第 8 行的索引。列也是如此。对于每个正方形,检查行与列的索引之和是否为“par”(除以 2 的其余部分为 0),然后等于白色正方形。否则,它分配一个黑色方块。诀窍是 ((row + col)% 2)。它交替给出 0 或 1 的值。在“for loop”列的每次迭代结束时,该行会发生变化。

于 2018-08-21T21:45:44.900 回答
0

出于性能原因,您也可以跳过绘制其他彩色图块,只需先用辅助颜色填充背景,然后迭代原色图块。例子:

    public static class GridGenerator
    {
        public static void CreateGridBackground()
        {

            DrawingVisual visual = new DrawingVisual();
            DrawingContext context = visual.RenderOpen();
            context.DrawRectangle(Brushes.Red, null, new Rect(0, 0, 256, 512));
            for (int xRow = 0; xRow < 256 / 16; xRow++)
            {
                for (int yColumn = 0; yColumn < 512 / 16; yColumn++)
                {
                    if ((yColumn % 2 == 0 && xRow % 2 == 0) || (yColumn % 2 != 0 && xRow % 2 != 0))
                    {
                        context.DrawRectangle(Brushes.White, null, new Rect(xRow * 16, yColumn * 16, 16, 16));
                    }
                }
            }
            context.Close();

            RenderTargetBitmap bmp = new RenderTargetBitmap(256, 512, 96, 96, PixelFormats.Pbgra32);
            bmp.Render(visual);

            PngBitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bmp));
            encoder.Save(new FileStream("C:/Users/Krythic/Desktop/Test.png", FileMode.Create));
        }
    }

理论上这快了 50%(实际上还没有进行基准测试,因此请随意将其视为虚数),因为您通过填充一种颜色而不是实际将其绘制为单独的图块将绘图切成两半。只是说;要么接受,要么离开它。

于 2018-10-23T22:58:26.520 回答