Exemple #1
0
        /// <summary>
        /// 处理捕捉到的窗口区域位图,获取当前最佳匹配方法
        /// </summary>
        /// <param name="bitmap">捕捉到的位图</param>
        public Solution GetSolution(Bitmap bitmap)
        {
            float factor = (float)(bitmap.Width - 8) / (float)1024;

            m_jewel_width  = (int)Math.Round(factor * JEWEL_WIDTH);
            m_jewel_height = m_jewel_width;

            m_board_left_real = (int)Math.Round(factor * (m_board_left_ref - 4)) + 4;
            m_board_top_real  = bitmap.Height - ((int)Math.Round(factor * (802 - m_board_top_ref - 4)) + 4);

            JewelColor[,] jewels = new JewelColor[ROW_COUNT, COL_COUNT];

            int a_min = (int)Math.Round(m_jewel_width * 0.366);
            int a_max = (int)Math.Round(m_jewel_width * 0.610);

            for (int i = 0; i < ROW_COUNT; i++)
            {
                int y = m_board_top_real + (m_jewel_height * i);
                for (int j = 0; j < COL_COUNT; j++)
                {
                    int x = m_board_left_real + (m_jewel_width * j);

                    int color_r     = 0;
                    int color_g     = 0;
                    int color_b     = 0;
                    int color_count = 0;
                    for (int a = a_min; a < a_max; a++)
                    {
                        for (int b = a_min; b < a_max; b++)
                        {
                            Color pixel = bitmap.GetPixel(x + a, y + b);
                            color_r += pixel.R;
                            color_g += pixel.G;
                            color_b += pixel.B;
                            color_count++;
                        }
                    }
                    color_r = color_r / color_count;
                    color_g = color_g / color_count;
                    color_b = color_b / color_count;

                    if (Math.Abs(((float)color_g / (float)color_r) - 1) < 0.15 &&
                        Math.Abs(((float)color_b / (float)color_r) - 1) < 0.15)
                    {
                        color_g = color_r;
                        color_b = color_r;
                    }

                    Color color_avg = Color.FromArgb(color_r, color_g, color_b);

                    int hue = (int)color_avg.GetHue();
                    int sat = (int)(color_avg.GetSaturation() * 1000);

                    jewels[i, j] = GetColorFromHueSat(hue, sat);
                }
            }

            return(ProcessAllJewels(jewels));
        }
Exemple #2
0
        /// <summary>
        /// 获取指定颜色宝石的分布情况数据
        /// </summary>
        /// <param name="jewels">以宝石颜色为项目的二维数组</param>
        /// <param name="color">指定的宝石颜色</param>
        /// <returns>指定颜色宝石分布情况的二维数组</returns>
        private int[,] GetSpecColorJewels(JewelColor[,] jewels, JewelColor color)
        {
            int[,] result = new int[ROW_COUNT, ROW_COUNT];

            for (int i = 0; i < ROW_COUNT; i++)
            {
                for (int j = 0; j < COL_COUNT; j++)
                {
                    result[i, j] = (jewels[i, j] == color) ? 1 : 0;
                }
            }

            return(result);
        }
Exemple #3
0
        /// <summary>
        /// 获取宝石颜色
        /// </summary>
        /// <param name="hue">色相值</param>
        /// <param name="sat">饱和度值</param>
        /// <returns>宝石颜色</returns>
        private JewelColor GetColorFromHueSat(int hue, int sat)
        {
            JewelColor jewel_color = JewelColor.White;

            if (sat < 180)
            {
                jewel_color = JewelColor.White;
            }
            else if (hue > ((HUE_RED + HUE_PURPLE) / 2))
            {
                jewel_color = JewelColor.Red;
            }
            else if (hue > ((HUE_PURPLE + HUE_BLUE) / 2))
            {
                jewel_color = JewelColor.Purple;
            }
            else if (hue > ((HUE_BLUE + HUE_GREEN) / 2))
            {
                jewel_color = JewelColor.Blue;
            }
            else if (hue > ((HUE_GREEN + HUE_YELLOW) / 2))
            {
                jewel_color = JewelColor.Green;
            }
            else if (hue > ((HUE_YELLOW + HUE_ORANGE) / 2))
            {
                jewel_color = JewelColor.Yellow;
            }
            else if (hue > ((HUE_ORANGE + HUE_WHITE) / 2))
            {
                jewel_color = JewelColor.Orange;
            }
            else
            {
                jewel_color = JewelColor.White;
            }

            return(jewel_color);
        }