问题 在列表中查找重复项并跳过/删除该元素并替换

Rowlandsfc

成员
已加入
2019年2月3日
留言内容
23
地点
布里真德
编程经验
Beginner
大家好,我使用Windows窗体应用程序为大学创建了一个游戏,其中敌人从窗体的顶部放下,敌人是一类,并在列表加载时使用列表5创建了一个游戏。我想做的是确保创建5个对象时,它们不会出现在完全相同的位置。我已经创建了一个列表来存储每个位置的创建位置,我无法弄清楚的是如何检查这些位置是否找到重复项,然后删除它们,然后用新的位置替换它们。任何帮助或只是指向正确的方向,我将不胜感激

enemy class:
    class EnemyShips
    {

        // variables for movign the enemy ships
        public PictureBox e;
        public int xPos, yPos;
        public int speed;
        public Boolean isDisposed = false;
       

        Random random = new Random();
        public static List<Point> position = new List<Point>();

        public EnemyShips(Panel f)
        {
            e = new PictureBox(); // creates a new insatnce of a picturebox

            // set the appearance of e
            e.Width = 42;
            e.Height = 24;
            e.Image = Minefield.Properties.Resources.enemy;
            e.BackColor = Color.Transparent;
            e.SizeMode = PictureBoxSizeMode.AutoSize;
            e.Visible = false;

            for (int i = 0; i < 10; i++)
            {
                int stepWidth = 42; //
                int maxStep = 400 / stepWidth; // here calculate the maximum number of step that can be made
                int stepAmountX = random.Next(1, maxStep);
                xPos = stepAmountX * stepWidth;
                speed = random.Next(2, 5);
                e.Location = new Point(xPos, yPos);
                f.Controls.Add(e); // needed to add the control to the panel
            }
            position.Add(e.Location);
        }

        public void moveEnemy(Panel f)
        {
            e.Visible = true; // make the enemy visible
            yPos = yPos + speed; // moves the enemy
            e.Location = new Point(xPos, yPos);
           
        }
    }
}



adding enemies:
        private void enemyTimer_Tick(object sender, EventArgs e)
        {
            if(enemyNumber > 4)
            {
                arrayTimer.Enabled = true; // we enable the other timer which controls the enemy movement
                enemyTimer.Enabled = false; // after 5 enemies we stop timer so we dont get more

            }
            else
            {
                enemies.Add(new EnemyShips(this.panel1)); // create a new isntance of enemy using the array
                enemyNumber++;
            }
            if (enemiesKilled > 19)
            {
                bossTimer.Enabled = true;
            }

        }
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
试试这样的事情:
C#:
        public bool UsePosition(Point current_point)
        {
            int offset = 55; bool GetNew = false;
            foreach (Point point in position)
            {
                int minX = point.X - offset; int maxX = point.X + offset;
                int minY = point.Y - offset; int maxY = point.Y + offset;
                if (Enumerable.Range(minX, maxX).Contains(current_point.X) && Enumerable.Range(minY, maxY).Contains(current_point.X))
                {
                    //Look for a different position
                    GetNew = true;
                }
            }
            return GetNew;
        }
该偏移量应防止图片框对象产生或放置在其他图片框对象之上。使用您的random来生成一个介于10和表单宽度之间的随机点,并将其作为点传递给此函数。如果返回为假,则将点位置用于新生成的对象。否则,将随机产生一个新职位。代码未经测试,可能需要调整。
 
最佳 底部