你是想用 C# 编写一个“QQ找茬”游戏(即找不同游戏)吗?如果是这样,我可以帮你提供一个简单的找茬游戏基础示例,包含界面设计和基本逻辑。


基本思路

  • 显示两张几乎相同的图片(可以用 PictureBox 控件)
  • 用户点击图片找不同的地方
  • 记录用户找到的位置,判断是否正确
  • 限制时间或点击次数,完成后显示得分

简单示例(WinForms)

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace QQFindDifference
{
    public partial class MainForm : Form
    {
        // 假设两张图片大小相同
        private Bitmap img1;
        private Bitmap img2;

        // 差异点坐标列表
        private List<Point> differences = new List<Point>();

        // 记录已找出的差异
        private List<Point> foundDifferences = new List<Point>();

        private const int CLICK_RADIUS = 20; // 点击容差范围

        public MainForm()
        {
            InitializeComponent();

            // 加载图片
            img1 = new Bitmap("image1.jpg");
            img2 = new Bitmap("image2.jpg");

            // 这里需要预先定义图片中的差异点坐标
            differences.Add(new Point(50, 80));
            differences.Add(new Point(150, 120));
            differences.Add(new Point(220, 200));
            // 依次添加所有差异点

            pictureBox1.Image = img1;
            pictureBox2.Image = img2;

            pictureBox1.MouseClick += PictureBox_MouseClick;
            pictureBox2.MouseClick += PictureBox_MouseClick;
        }

        private void PictureBox_MouseClick(object sender, MouseEventArgs e)
        {
            Point clickPoint = e.Location;

            // 判断是否点击了差异点(在容差范围内)
            foreach (var diff in differences)
            {
                if (!foundDifferences.Contains(diff))
                {
                    double distance = Math.Sqrt(Math.Pow(clickPoint.X - diff.X, 2) + Math.Pow(clickPoint.Y - diff.Y, 2));
                    if (distance <= CLICK_RADIUS)
                    {
                        foundDifferences.Add(diff);
                        MessageBox.Show("找到一个不同点!");

                        // 画圈标记(示例:在两张图片对应位置画红圈)
                        DrawCircle(pictureBox1, diff);
                        DrawCircle(pictureBox2, diff);

                        if (foundDifferences.Count == differences.Count)
                        {
                            MessageBox.Show("恭喜!你找到了所有不同点!");
                        }
                        break;
                    }
                }
            }
        }

        private void DrawCircle(PictureBox pb, Point center)
        {
            Bitmap bmp = new Bitmap(pb.Image);
            using (Graphics g = Graphics.FromImage(bmp))
            {
                Pen pen = new Pen(Color.Red, 3);
                g.DrawEllipse(pen, center.X - CLICK_RADIUS, center.Y - CLICK_RADIUS, CLICK_RADIUS * 2, CLICK_RADIUS * 2);
            }
            pb.Image = bmp;
        }
    }
}

注意

  • 图片和差异点坐标需你自己准备(或者用程序生成差异图)
  • 可以根据需求添加计时器、得分、提示等功能
  • UI 部分建议用 Visual Studio 设计窗体,方便调整布局