You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Windows Form Application猫追老鼠游戏开发思路

猫追老鼠WinForm游戏核心实现指南

嘿,我来帮你拆解这个猫追老鼠WinForm游戏的核心模块,一步步来就没那么棘手啦!下面是每个核心需求的具体实现思路和代码示例:

1. 角色移动逻辑:方向键控鼠 + 猫自动寻路

老鼠的方向键控制

用窗体的KeyDown事件处理方向键输入,同时要做边界检测,避免老鼠跑出窗口:

private void MainForm_KeyDown(object sender, KeyEventArgs e)
{
    int mouseSpeed = 5; // 老鼠移动速度
    // 上下左右边界判断
    switch (e.KeyCode)
    {
        case Keys.Up:
            if (pbMouse.Top > 0) pbMouse.Top -= mouseSpeed;
            break;
        case Keys.Down:
            if (pbMouse.Bottom < this.ClientSize.Height) pbMouse.Top += mouseSpeed;
            break;
        case Keys.Left:
            if (pbMouse.Left > 0) pbMouse.Left -= mouseSpeed;
            break;
        case Keys.Right:
            if (pbMouse.Right < this.ClientSize.Width) pbMouse.Left += mouseSpeed;
            break;
    }
    // 高难度模式下检测洞传送
    if (isHardMode) CheckTeleport();
}

记得要把窗体的KeyPreview属性设为true,这样才能捕获方向键事件

猫的自动寻路

用Timer控件(比如间隔16ms,接近60帧)逐帧更新猫的位置,逻辑很简单:每次向老鼠的X/Y坐标靠近,注意猫的速度要比老鼠快一点,这样才有追逐的紧张感:

private void tmrGameLoop_Tick(object sender, EventArgs e)
{
    int catSpeed = 6; // 猫速度略快于老鼠
    // 横向移动
    if (pbCat.Left < pbMouse.Left)
        pbCat.Left += catSpeed;
    else if (pbCat.Left > pbMouse.Left)
        pbCat.Left -= catSpeed;
    // 纵向移动
    if (pbCat.Top < pbMouse.Top)
        pbCat.Top += catSpeed;
    else if (pbCat.Top > pbMouse.Top)
        pbCat.Top -= catSpeed;
    // 每帧检测碰撞
    CheckCollision();
}

2. 碰撞检测与计时功能

碰撞检测

利用WinForm控件的Bounds属性(矩形区域),用IntersectsWith方法判断猫和老鼠是否重叠:

private void CheckCollision()
{
    if (pbCat.Bounds.IntersectsWith(pbMouse.Bounds))
    {
        tmrGameLoop.Stop();
        gameStopwatch.Stop();
        MessageBox.Show($"猫抓到老鼠啦!耗时:{gameStopwatch.Elapsed.TotalSeconds:F2}秒");
    }
}

计时功能

用Stopwatch类来精确计时,新游戏开始时重启计时器:

private Stopwatch gameStopwatch = new Stopwatch();

private void StartNewGame()
{
    RandomizePositions(); // 随机生成角色位置
    gameStopwatch.Restart();
    tmrGameLoop.Start();
}

3. 新游戏随机放置角色

用Random类生成坐标,同时要确保角色不会超出窗口,还要避免开局就碰撞:

private Random rand = new Random();

private void RandomizePositions()
{
    // 老鼠随机位置
    pbMouse.Left = rand.Next(0, this.ClientSize.Width - pbMouse.Width);
    pbMouse.Top = rand.Next(0, this.ClientSize.Height - pbMouse.Height);
    // 猫的位置:循环生成直到和老鼠不重叠
    do
    {
        pbCat.Left = rand.Next(0, this.ClientSize.Width - pbCat.Width);
        pbCat.Top = rand.Next(0, this.ClientSize.Height - pbCat.Height);
    } while (pbCat.Bounds.IntersectsWith(pbMouse.Bounds));
}

4. 高难度模式:洞传送机制

先在窗体上放两个PictureBox作为洞(比如命名为pbHole1和pbHole2),然后在老鼠移动后检测是否进入洞,触发传送时要加个小冷却,避免连续传送:

private bool isTeleporting = false; // 防止连续传送
private bool isHardMode = false; // 高难度模式开关

private void CheckTeleport()
{
    if (isTeleporting) return; // 冷却中不处理

    if (pbMouse.Bounds.IntersectsWith(pbHole1.Bounds))
    {
        isTeleporting = true;
        pbMouse.Location = pbHole2.Location;
        // 300ms冷却后允许再次传送
        Task.Delay(300).ContinueWith(_ => isTeleporting = false, TaskScheduler.FromCurrentSynchronizationContext());
    }
    else if (pbMouse.Bounds.IntersectsWith(pbHole2.Bounds))
    {
        isTeleporting = true;
        pbMouse.Location = pbHole1.Location;
        Task.Delay(300).ContinueWith(_ => isTeleporting = false, TaskScheduler.FromCurrentSynchronizationContext());
    }
}

这些核心逻辑搞定后,你就可以逐步完善UI(比如难度切换按钮、游戏重置按钮)和细节优化啦!

内容的提问来源于stack exchange,提问作者user9713566

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:18:45