| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3232 人关注过本帖, 2 人收藏
标题:我也国庆大赠送,新手尝试一下:猎狗追兔
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
狗有最低速度,这个值由D、L、v共同决定,绝对不能比兔子慢,但也不是快了就行,得看快多少,数学上确实能求出这个极限值。但求出极限值与在什么时候、什么位置追到又是另一回事,要实时把这个过程演示出来更是考究你如何编写程序的事。

授人以渔,不授人以鱼。
2011-10-01 20:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那个方程其实很简单的,你知道速度的定义吗?(平均)速度定义是v=Δs/Δt,即路程与时间之比,对极短时间内,猎狗可视为跑直线,但它奔跑的方向必须在自己与兔子的连线上(因此兔子的移动牵引着猎狗奔跑的方向,猎狗不断地调整着自己的方向,这就是那条线的作用,也是猎狗始终面对兔子追赶的意思,这是一条比较笨的狗)。我们只要设定一个足够短的时间片(即程序中的那个tininess值,越小越精确,它决定了描出曲线的平滑度),在这个时间内,兔子和猎狗都跑匀速直线运动,兔子是真的直线,但猎狗是一截一截的极短直线(连起来就是曲线),两者按同样的比例移动,只要在兔子跑到窝点之前,点坐标相遇,就逮着了。

这个编程思路,是不管兔子怎么跑、猎狗与兔子起始的相对位置如何,都适用的。之所以要求做扩展,就是希望你编程时,不要过于重视题目给出的特殊位置和关系,那必定会影响编程质量的,如果你的程序利用了那些特殊性,则适用面就窄,遇到新情况也不好改。编程,考的就是这种设计功夫,代码多巧妙、数学多精通,都不是首要的——不是首要指仅有那些技能是不够的。

[ 本帖最后由 TonyDeng 于 2011-10-1 20:22 编辑 ]

授人以渔,不授人以鱼。
2011-10-01 20:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 27楼 dreamofgod
上帝有何期待?

授人以渔,不授人以鱼。
2011-10-01 20:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
呵呵,又来百分大餐?

授人以渔,不授人以鱼。
2011-10-01 20:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
高中物理竞赛经典题型。

授人以渔,不授人以鱼。
2011-10-02 14:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
q332010372:看你的程序代码(我没用过C#,暂时无法运行),大概是这么三个问题:一,可能你对坐标解题不是很熟悉,方程对的话,与象限无关的;二,程序结构看起来有点复杂化了,如果不用图形,恐怕不用那么多行代码,就我想象,用C++面向对象写,也应该没这样的行数;三,你的速度预设有错,猎狗的速度绝对不可能跟兔子一样,那样是肯定追不上的。

dreamofgod:大致是这个最低速度,具体我记不清了,有求时间的、求加速度的,很多变型,具体的答案我从来不背。

授人以渔,不授人以鱼。
2011-10-02 20:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我今天就学写C##,写一个看看到底有没有你说的那样。
从前方截,确实有可以守株待兔的时候,但这种情形没太大意义。坐标法,你的那种理解是自找麻烦,随便一个熟悉物理运动学解题的人都知晓,不用那样的。

授人以渔,不授人以鱼。
2011-10-03 10:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 48楼 q332010372
行了,不用你教我自己的专业,这种运算我整天都做。一个运动学方程要分象限考虑,天大的笑话,不要侮辱物理学家和数学家们的发明。

授人以渔,不授人以鱼。
2011-10-03 12:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
没事,你确实对这个不熟悉,一眼就看得出的,何况自己也有承认。真的不用考虑象限的,矢量方程化成投影标量方程,在任何方位的数学形式均不变,标量的正负号已囊括矢量方向。永远用末坐标减前一瞬间坐标,只要得数为正,就向正方向运动;得数为负,就向负方向运动;两个坐标轴分解,不管向在什么位置向哪个方向,都是同一个数学方程式。这是高中物理的基本方法,只是中国大陆的中学物理教学古里古怪,某些师生总是把正负方向看得太重,说什么加速、减速之类,好好地把一个作匀加速运动的竖直上抛过程拆解为上升和下降两个阶段,殊不知那其实就是一个匀加速运动方程就已经囊括了的东西。你这种分象限考虑的思路,很明显地就是这样来的(如果你学过高中物理的话,我敢肯定就是这种老师向你灌输的东西,没学到不怪你)。

我用C#弄出来了,第一个C#程序,呵呵,只是没找着狗和兔子的图片,也没找着怎么画点的方法,用label运动的,不漂亮,再查查资料看。

授人以渔,不授人以鱼。
2011-10-03 16:01
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
生平第一个C#程序,处男作,学习深入点再弄完善
图片附件: 游客没有浏览图片的权限,请 登录注册


图片附件: 游客没有浏览图片的权限,请 登录注册


程序代码:
using System;
using System.Collections.Generic;
using using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 猎狗追兔
{
    public partial class Form1 : Form
    {
        private Coord origin = new Coord { X = 400, Y = 20 };   // 坐标原点位置
        private const double tininess = 0.00001;                // 微小步进量

        private Animal rabbit = new Animal { Name = "兔子", Speed = 5.00, X = -200.00, Y = 0.00 };
        private Animal hounter = new Animal { Name = "猎狗", Speed = -15.00, X = -200.00, Y = 400.00 };

        public Form1()
        {
            InitializeComponent();

            Text = "猎狗追兔";
            MaximizeBox = false;
        }

        // 兔子定位
        private void SetRabbit(double x, double y)
        {
            Rabbit.Top = Convert.ToInt32(origin.Y) + Convert.ToInt32(y) - Rabbit.Height / 2;
            Rabbit.Left = Convert.ToInt32(origin.X) + Convert.ToInt32(x) - Rabbit.Width / 2;
        }

        // 猎狗定位
        private void SetHounter(double x, double y)
        {
            Hounter.Top = Convert.ToInt32(origin.Y) + Convert.ToInt32(y) - Hounter.Height / 2;
            Hounter.Left = Convert.ToInt32(origin.X) + Convert.ToInt32(x) - Hounter.Width / 2;
        }

        private void Arrange()
        {
            Home.Text = "兔子窝";
            Home.AutoSize = false;
            Home.TextAlign = ContentAlignment.MiddleCenter;
            Home.Width = 50;
            Home.Height = 30;
            Home.BorderStyle = BorderStyle.FixedSingle;
            Home.Top = Convert.ToInt32(origin.Y) - Home.Height / 2;
            Home.Left = Convert.ToInt32(origin.X) - Home.Width / 2;

            Hounter.Text = hounter.Name;
            SetHounter(hounter.X, hounter.Y);
            label1.Text = "猎狗速率:";
            label1.Top = this.Height - label1.Height - 50;
            label1.Left = 20;
            textBox1.Text = Convert.ToString(hounter.Speed);
            textBox1.Height = label1.Height;
            textBox1.Width = 40;
            textBox1.Top = label1.Top;
            textBox1.Left = label1.Left + label1.Width;

            Rabbit.Text = rabbit.Name;
            SetRabbit(rabbit.X, rabbit.Y);
            label2.Text = "兔子速率:";
            label2.Top = label1.Top - label2.Height - 10;
            label2.Left = label1.Left;
            textBox2.Text = Convert.ToString(rabbit.Speed);
            textBox2.Height = label2.Height;
            textBox2.Width = 40;
            textBox2.Top = label2.Top;
            textBox2.Left = label2.Left + label2.Width;

            Reset.Text = "重置";
            Reset.Top = this.Height - Reset.Height - 50;
            Reset.Left = this.Width - Reset.Width - 50;

            StartRun.Text = "开始";
            StartRun.Top = Reset.Top;
            StartRun.Left = Reset.Left - StartRun.Width;
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            Arrange();
        }

        private void StartRun_Click(object sender, EventArgs e)
        {
            rabbit.Speed = Convert.ToDouble(textBox2.Text);
            hounter.Speed = Convert.ToDouble(textBox1.Text);
            Run();
        }

        private void Run()
        {
            double angle;                   // 猎狗速度方向角
            Boolean success = false;        // 是否抓到兔子

            while ((rabbit.X < 0.00) && !success)
            {
                angle = Math.Atan((rabbit.X - hounter.X) / (hounter.Y - rabbit.Y));
                rabbit.X += rabbit.Speed * tininess;
                SetRabbit(rabbit.X, rabbit.Y);
                hounter.X -= hounter.Speed * Math.Sin(angle) * tininess;
                hounter.Y += hounter.Speed * Math.Cos(angle) * tininess;
                SetHounter(hounter.X, hounter.Y);
                if (hounter.Y <= 0.0)
                {
                    success = true;
                }
            }
            if (success)
            {
                MessageBox.Show("逮住兔子了!");
            }
            else
            {
                MessageBox.Show("兔子逃脱了!");
            }
        }

        private void Reset_Click(object sender, EventArgs e)
        {
            rabbit.X = -200.00;
            rabbit.Y = 0.00;
            hounter.X = -200.00;
            hounter.Y = 400.00;
            Arrange();
        }
    }

    public class Coord : Object
    {
        private double x;
        private double y;

        public double X
        {
            get { return this.x; }
            set { this.x = value; }
        }

        public double Y
        {
            get { return this.y; }
            set { this.y = value; }
        }
    }

    // 动物类
    public class Animal : Object
    {
        private String name;
        private double x;
        private double y;
        private double speed;

        public String Name
        {
            get { return this.name; }
            set { this.name = value; }
        }

        public double X
        {
            get { return this.x; }
            set { this.x = value; }
        }

        public double Y
        {
            get { return this.y; }
            set { this.y = value; }
        }

        public double Speed
        {
            get { return this.speed; }
            set { this.speed = value; }
        }
    }
}


[ 本帖最后由 TonyDeng 于 2011-10-4 03:35 编辑 ]

授人以渔,不授人以鱼。
2011-10-04 03:28
快速回复:我也国庆大赠送,新手尝试一下:猎狗追兔
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.054949 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved