为贪吃蛇之类的游戏添加多个控件

add Multiple controls for a Game like Snake

为了学习,当然为了好玩,我正在建造一个模仿蛇的模型,唯一的区别应该是地图上会出现很多敌人或物体,而不是无尽的链条,游戏应该变得更多和比较难。

代码片段应该显示我如何创建我的控件,但我有一个问题,只有最后创建的控件实际上被我的“IntersectsWith”捕获,所有之前创建的控件,以及第一个一个,对我来说不再是任何对手,我的球员只是通过他们。

执行此操作的最佳方法是什么,以便可以在一个定义下找到所有创建的对象,这样我就不必编写数百个 IntersectsWith If 语句。

我想学习如何动态创建控件并动态地直接访问它们,我的玩家可以在其中通过碰撞与它们交互。

我真的以为我可以用一个随机字符生成器来解决这个问题,不同的控件名称可以解决这个问题,但是唉-事实并非如此^^

    Random rnd = new Random();
    PictureBox Enemy = new PictureBox();
   
    private async void timer1_Tick(object sender, EventArgs e)
    {

        if (Person.Bounds.IntersectsWith(Food.Bounds))   
        {
            int ascii_index2 = rnd.Next(97, 123);
            char char1 = Convert.ToChar(ascii_index2);
            char char2 = Convert.ToChar(ascii_index2);
            string myletter = Convert.ToString(char1) + Convert.ToString(char2);


            Enemy = new PictureBox
            {
                Location = new Point(rnd.Next(20, playground.Right - 20), rnd.Next(20, playground.Bottom - 20)),
                Name = "Enemy" + myletter,
                Size = new Size(24,24),
                BackColor = Color.Red,

            };
            this.Controls.Add(Enemy);
            Enemy.BringToFront();

            Food.Location = new Point(rnd.Next(20, playground.Right - 20), rnd.Next(20, playground.Bottom - 20));
            score++;
            lbScore.Text = "Score: " + score.ToString();

        }
        
        if(Person.Bounds.IntersectsWith(Enemy.Bounds))
        {
            timer1.Stop();
        }
        if (Person.Left <= playground.Left && !changed)
        {
          
            Person.Location = new Point(playground.Right, Person.Location.Y);
            changed = true;

        }
        else
        if (Person.Right >= playground.Right && !changed)
        {
            Person.Location = new Point(playground.Left, Person.Location.Y);
            changed = true;

        }
        else
        if (Person.Top <= playground.Top && !changed)
        {
            Person.Location = new Point(Person.Location.X, playground.Bottom);
            changed = true;

        }
        else
        if (Person.Bottom >= playground.Bottom && !changed)
        {
            Person.Location = new Point(Person.Location.X, playground.Top);
            changed = true;

        }

这是我的图片:Player = BlackDot,Food = GreenDot,Enemy = RedDot 它会按照您点击的方向自动移动,如果您按住 Key 可以移动得更快。 移动键:W,A,S,D

假设 Person 是您的玩家,而不是 enemy 类型 PictureBox 字段,而是 enemies 类型 List<PictureBox> 字段。然后,您将每个新敌人 PictureBox 添加到该列表,然后您可以这样做:

if (enemies.Any(enemy => person.Bounds.IntersectsWith(enemy.Bounds))

您需要创建一个列表并将所有创建的敌人存储在其中。

首先你需要创建一个列表:

List<PictureBox> enemyList = new List<PictureBox>();

创建新敌人后将其添加到您的列表

Enemy = new PictureBox{};
enemieList.add(Enemy);

因为这样您就可以检查此列表中的每个 PictureBox 以及它是否与您的播放器相交。

foreach(PictureBox p in enemyList)
{
    if(Person.Bounds.IntersectsWith(p.Bounds))
        {
            timer1.Stop();
        }
}

这将是我对您问题的快速解决方案。